
ESP32 实战教程:智能环境监测站(温湿度+OLED+MQTT)
项目背景
随着物联网(IoT)技术的快速发展,智能环境监测站已经成为智能家居、智慧农业、智慧城市等领域的核心应用之一。通过实时监测环境参数(如温度、湿度),并将这些数据通过无线网络传输到云端,可以实现对环境的智能监控和管理。本项目将基于 ESP32 开发板,集成温湿度传感器、OLED 显示屏,并通过 MQTT 协议将数据上传到云平台,实现一个功能完善的智能环境监测站。
硬件清单
- ESP32 开发板(如 ESP32 DevKit V1)
- 温湿度传感器(DHT22)
- OLED 显示屏(0.96 寸,128x64,I2C 接口)
- 跳线若干
- 面包板
- USB 数据线
- MQTT 服务器(如 Mosquitto 或公共 MQTT 服务器)
接线图说明
接线图
实物图描述
- ESP32 与 DHT22 连接:
- 将 DHT22 的 VCC 引脚连接到 ESP32 的 3.3V 引脚。
- 将 DHT22 的 GND 引脚连接到 ESP32 的 GND 引脚。
- 将 DHT22 的 DATA 引脚连接到 ESP32 的 GPIO 4 引脚。
- 在 DHT22 的 DATA 引脚和 VCC 引脚之间连接一个 10kΩ 的上拉电阻。
- ESP32 与 OLED 连接:
- 将 OLED 的 VCC 引脚连接到 ESP32 的 3.3V 引脚。
- 将 OLED 的 GND 引脚连接到 ESP32 的 GND 引脚。
- 将 OLED 的 SDA 引脚连接到 ESP32 的 GPIO 21 引脚。
- 将 OLED 的 SCL 引脚连接到 ESP32 的 GPIO 22 引脚。
完整代码
以下是使用 Arduino IDE 编写的完整代码:
#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.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
#define OLED_RESET -1
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
WiFiClient espClient;
// WiFi 配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// MQTT 配置
const char* mqtt_server = "你的MQTT服务器地址";
const char* mqtt_topic = "environment/temperature";
const char* mqtt_topic_humidity = "environment/humidity";
void setup() {
Serial.begin(115200);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 初始化失败"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.display();
setup_wifi();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("读取 DHT22 失败!");
return;
}
// 显示在 OLED 上
display.clearDisplay();
display.setCursor(0,0);
display.print("温度: ");
display.print(temperature);
display.println(" C");
display.print("湿度: ");
display.print(humidity);
display.println(" %");
display.display();
// 发布到 MQTT
Serial.print("温度: ");
Serial.print(temperature);
Serial.print(" C, 湿度: ");
Serial.print(humidity);
Serial.println(" %");
delay(2000);
}
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 服务器...");
if (client.connect("ESP32Client")) {
Serial.println("连接成功");
} else {
Serial.print("连接失败,状态码=");
Serial.print(client.state());
Serial.println(",重试中...");
delay(5000);
}
}
}
调试
- 硬件连接检查:
- 确认所有连接正确,特别是电源和地线。
- 使用万用表检查电压,确保 ESP32 和传感器工作在 3.3V。
- 软件配置:
- 在 Arduino IDE 中安装所需的库:
- PubSubClient
- Adafruit SSD1306
- DHT sensor library
- 配置 WiFi 和 MQTT 服务器地址:
- 替换代码中的 ssid 和 password 为你的 WiFi 名称和密码。
- 替换 mqtt_server 为你的 MQTT 服务器地址。
- 上传代码:
- 连接 ESP32 到电脑。
- 选择正确的板型和端口。
- 点击上传,等待编译和上传完成。
- 监控串口输出:
- 打开串口监视器,设置波特率为 115200。
- 观察连接状态和数据发布情况。
扩展
1. 数据可视化
将 MQTT 主题的数据接入到数据可视化平台,如 Grafana 或 ThingSpeak。通过图表展示温度和湿度的变化趋势,实现更直观的监控。
2. 远程控制
在监测站中加入继电器模块,通过 MQTT 远程控制其他设备。例如,根据温度自动调节风扇或加热器。
3. 低功耗模式
为了延长电池寿命,可以在代码中加入低功耗模式。例如,使用 ESP32 的深度睡眠功能,定期唤醒采集数据并上传,然后再次进入睡眠状态。
4. 多传感器集成
除了温湿度传感器,还可以集成其他类型的传感器,如空气质量传感器(MQ-135)、光照传感器(BH1750)等,实现更全面的环境监测。
5. 云平台集成
将数据上传到云平台,如 AWS IoT、Azure IoT 或阿里云物联网平台。利用云平台的强大功能,实现数据存储、分析和报警等功能。
通过以上扩展,可以将智能环境监测站的功能进一步提升,满足不同应用场景的需求。