
智能环境监测站实战教程(ESP32)
项目背景
随着物联网(IoT)技术的快速发展,环境监测在智能家居、农业、工业等领域得到了广泛应用。本项目旨在利用ESP32开发板搭建一个智能环境监测站,能够实时监测环境的温湿度数据,并通过OLED显示屏进行本地显示,同时将数据通过MQTT协议上传至云平台,实现远程监控。
ESP32是一款功能强大的Wi-Fi和蓝牙双模芯片,具有低功耗、高性能的特点,非常适合用于物联网项目。本项目将使用Arduino IDE进行开发,简化开发流程,适合初学者和有一定经验的嵌入式开发者。
硬件清单
- ESP32开发板(如ESP32 DevKit V1)
- DHT22温湿度传感器
- 0.96寸OLED显示屏(基于SSD1306驱动)
- MQTT服务器(如Mosquitto或第三方云服务)
- 杜邦线(公对母,母对母)
- 面包板
- USB数据线(用于连接ESP32与电脑)
- 电源模块(可选,用于独立供电)
接线图说明
接线图

接线说明
- DHT22温湿度传感器
- VCC接ESP32的3.3V
- GND接ESP32的GND
- DATA接ESP32的GPIO 4
- OLED显示屏
- VCC接ESP32的3.3V
- GND接ESP32的GND
- SDA接ESP32的GPIO 21
- SCL接ESP32的GPIO 22
- 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);
}
调试
- 连接Wi-Fi:上传代码后,打开串口监视器,确保ESP32成功连接到Wi-Fi网络。
- MQTT连接:检查MQTT服务器地址和端口是否正确,确保ESP32能够连接到MQTT broker。
- 传感器数据读取:观察串口监视器,确保DHT22传感器正确读取温湿度数据。
- OLED显示:查看OLED显示屏,确认温湿度数据正确显示。
- MQTT数据发布:使用MQTT客户端工具(如Mosquitto客户端或手机应用)订阅
environment/data主题,确认数据是否正确发布。
扩展
- 增加更多传感器:可以添加气压传感器、空气质量传感器(如MQ-2、MQ-135)等,扩展环境监测功能。
- 数据存储与可视化:将数据存储到云数据库(如Firebase、AWS DynamoDB),并使用前端框架(如React、Vue)进行数据可视化展示。
- 低功耗模式:在不需要频繁监测时,将ESP32设置为低功耗模式,延长设备续航时间。
增加气压传感器示例
- 硬件连接:
- BMP180气压传感器VCC接ESP32的3.3V
- GND接ESP32的GND
- SDA接ESP32的GPIO 21
- SCL接ESP32的GPIO 22
- 代码修改:
#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);
}
通过以上步骤,您可以将气压传感器集成到环境中,实现更全面的环境监测功能。