
ESP32 实战教程:智能环境监测站(温湿度 + OLED + MQTT)
项目背景
随着物联网(IoT)技术的快速发展,环境监测在智能家居、智慧农业、工业自动化等领域得到了广泛应用。ESP32作为一款功能强大且性价比高的Wi-Fi和蓝牙双模芯片,非常适合用于构建各种物联网应用。本项目将基于ESP32开发一个智能环境监测站,能够实时监测环境的温湿度数据,并通过OLED显示屏进行本地显示,同时将数据通过MQTT协议发送到云端,实现远程监控。
硬件清单
- ESP32开发板(如ESP32 DevKit V1)
- DHT22温湿度传感器
- 0.96寸OLED显示屏(基于SSD1306驱动)
- 面包板和杜邦线
- 10kΩ电阻(用于DHT22上拉)
- USB数据线(用于连接ESP32与电脑)
接线图说明
以下是ESP32与各模块的接线说明:
- DHT22温湿度传感器
- VCC接ESP32的3.3V
- GND接ESP32的GND
- DATA接ESP32的GPIO 4
- 在DATA和VCC之间并联一个10kΩ电阻作为上拉电阻
- 0.96寸OLED显示屏
- VCC接ESP32的3.3V
- GND接ESP32的GND
- SCL接ESP32的GPIO 22
- SDA接ESP32的GPIO 21

*注:请根据实际硬件调整GPIO引脚,确保接线正确以避免损坏设备。*
完整代码
以下是基于Arduino框架的完整代码:
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// Wi-Fi 配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// MQTT 配置
const char* mqtt_server = "你的MQTT服务器地址";
const int mqtt_port = 1883;
const char* mqtt_topic = "environment/temperature";
const char* mqtt_topic_humidity = "environment/humidity";
WiFiClient espClient;
// DHT22 配置
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// OLED 配置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
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);
setup_wifi();
dht.begin();
// 初始化 OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 初始化失败!"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
display.println("环境监测站启动");
display.display();
delay(2000);
}
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;
}
// 显示在 OLED 上
display.clearDisplay();
display.setCursor(0,0);
display.println("温度和湿度");
display.setCursor(0,20);
display.print("温度: ");
display.print(t);
display.println(" C");
display.setCursor(0,40);
display.print("湿度: ");
display.print(h);
display.println(" %");
display.display();
// 发送到 MQTT
Serial.print("温度: ");
Serial.print(t);
Serial.print(" C, 湿度: ");
Serial.print(h);
Serial.println(" %");
delay(60000); // 每分钟更新一次
}
调试
- 连接硬件:按照接线图连接好ESP32与各模块,确保无误。
- 配置Wi-Fi和MQTT:在代码中填入正确的Wi-Fi名称、密码以及MQTT服务器地址和端口。
- 上传代码:使用Arduino IDE将代码上传到ESP32。
- 监视串口输出:打开串口监视器,设置波特率为115200,观察连接状态和数据输出。
- 查看OLED显示:OLED显示屏应显示当前的温度和湿度数据。
- MQTT数据验证:使用MQTT客户端工具(如MQTT.fx或MQTT Explorer)订阅相应的主题,验证数据是否正确发送。
扩展
- 数据存储与可视化:
- 将接收到的数据存储到数据库(如InfluxDB)中,并使用Grafana进行可视化展示。
- 可以实现数据的长期趋势分析和实时监控。
- 增加更多传感器:
- 除了温湿度,还可以添加空气质量传感器(如MQ-135)、光照传感器(如BH1750)等,实现更全面的环境监测。
- 通过I2C或SPI接口扩展传感器数量,提升监测能力。
- 远程控制与报警:
- 实现远程控制功能,如通过MQTT发送指令控制风扇、空调等设备。
- 设置报警机制,当温湿度超过设定阈值时,通过短信、邮件或微信通知用户。
- 低功耗优化:
- 利用ESP32的深度睡眠模式,延长设备续航时间,适用于电池供电的应用场景。
- 结合太阳能或其他可再生能源,实现真正的绿色环保监测站。
- 安全性增强:
- 实现MQTT TLS/SSL加密,确保数据传输的安全性。
- 添加设备认证机制,防止未经授权的访问和控制。
通过以上扩展,可以将智能环境监测站打造成一个功能强大、安全可靠的系统,满足不同应用场景的需求。