ESP32 实战 · 2026-06-14 配图
AI Know 自有配图 · 嵌入式 · IoT · 硬件编程

智能环境监测站实战教程(ESP32)

项目背景

随着物联网(IoT)技术的快速发展,环境监测在智能家居、农业、工业等领域得到了广泛应用。本项目旨在利用ESP32开发板搭建一个智能环境监测站,能够实时监测环境的温湿度数据,并通过OLED显示屏进行本地显示,同时将数据通过MQTT协议上传至云平台,实现远程监控。

ESP32是一款功能强大的Wi-Fi和蓝牙双模芯片,具有低功耗、高性能的特点,非常适合用于物联网项目。本项目将使用Arduino IDE进行开发,简化开发流程,适合初学者和有一定经验的嵌入式开发者。

硬件清单

  1. ESP32开发板(如ESP32 DevKit V1)
  2. DHT22温湿度传感器
  3. 0.96寸OLED显示屏(基于SSD1306驱动)
  4. MQTT服务器(如Mosquitto或第三方云服务)
  5. 杜邦线(公对母,母对母)
  6. 面包板
  7. USB数据线(用于连接ESP32与电脑)
  8. 电源模块(可选,用于独立供电)

接线图说明

接线图

![ESP32智能环境监测站接线图](https://example.com/esp32-environment-monitor-wiring-diagram.png)

接线说明

  1. DHT22温湿度传感器

- VCC接ESP32的3.3V

- GND接ESP32的GND

- DATA接ESP32的GPIO 4

  1. OLED显示屏

- VCC接ESP32的3.3V

- GND接ESP32的GND

- SDA接ESP32的GPIO 21

- SCL接ESP32的GPIO 22

  1. MQTT连接

- ESP32通过Wi-Fi连接到互联网,无需额外接线

实物图描述

将DHT22传感器插入面包板,使用杜邦线将其VCC和GND分别连接到ESP32的3.3V和GND引脚,DATA引脚连接到GPIO 4。OLED显示屏的VCC和GND同样连接到ESP32的3.3V和GND,SDA和SCL分别连接到GPIO 21和GPIO 22。确保所有连接牢固,避免松动。

完整代码

以下是基于Arduino IDE的完整代码:


#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define DHTPIN 4
#define DHTTYPE DHT22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* mqtt_server = "你的MQTT服务器地址";
const int mqtt_port = 1883;
const char* mqtt_topic = "environment/data";

WiFiClient espClient;

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("连接到 ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi 已连接");
  Serial.print("IP 地址: ");
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("尝试连接到 MQTT broker...");
    if (client.connect("ESP32Client")) {
      Serial.println("连接成功");
    } else {
      Serial.print("连接失败,状态码=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 初始化失败"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  setup_wifi();
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("读取 DHT22 失败!");
    return;
  }

  Serial.print("温度: ");
  Serial.print(t);
  Serial.print(" °C\t");
  Serial.print("湿度: ");
  Serial.print(h);
  Serial.println(" %");

  display.clearDisplay();
  display.setCursor(0,0);
  display.print("温度: ");
  display.print(t);
  display.println(" C");
  display.print("湿度: ");
  display.print(h);
  display.println(" %");
  display.display();

  String message = "{\"temperature\":" + String(t) + ",\"humidity\":" + String(h) + "}";
  delay(2000);
}

调试

  1. 连接Wi-Fi:上传代码后,打开串口监视器,确保ESP32成功连接到Wi-Fi网络。
  2. MQTT连接:检查MQTT服务器地址和端口是否正确,确保ESP32能够连接到MQTT broker。
  3. 传感器数据读取:观察串口监视器,确保DHT22传感器正确读取温湿度数据。
  4. OLED显示:查看OLED显示屏,确认温湿度数据正确显示。
  5. MQTT数据发布:使用MQTT客户端工具(如Mosquitto客户端或手机应用)订阅environment/data主题,确认数据是否正确发布。

扩展

  1. 增加更多传感器:可以添加气压传感器、空气质量传感器(如MQ-2、MQ-135)等,扩展环境监测功能。
  2. 数据存储与可视化:将数据存储到云数据库(如Firebase、AWS DynamoDB),并使用前端框架(如React、Vue)进行数据可视化展示。
  3. 低功耗模式:在不需要频繁监测时,将ESP32设置为低功耗模式,延长设备续航时间。

增加气压传感器示例

  1. 硬件连接

- BMP180气压传感器VCC接ESP32的3.3V

- GND接ESP32的GND

- SDA接ESP32的GPIO 21

- SCL接ESP32的GPIO 22

  1. 代码修改

   #include <Adafruit_BMP085.h>

   Adafruit_BMP085 bmp;

   void setup() {
     // 现有代码...
     if (!bmp.begin()) {
       Serial.println("无法找到 BMP180 传感器");
       while (1) {}
     }
   }

   void loop() {
     // 现有代码...
     float pressure = bmp.readPressure() / 100.0;
     Serial.print("气压: ");
     Serial.print(pressure);
     Serial.println(" hPa");

     display.print("气压: ");
     display.print(pressure);
     display.println(" hPa");
     display.display();

     String message = "{\"temperature\":" + String(t) + ",\"humidity\":" + String(h) + ",\"pressure\":" + String(pressure) + "}";
     delay(2000);
   }

通过以上步骤,您可以将气压传感器集成到环境中,实现更全面的环境监测功能。