ESP32+DHT11温湿度传感器实战:从硬件连接到数据可视化(附完整代码)

张开发
2026/4/15 23:08:57 15 分钟阅读

分享文章

ESP32+DHT11温湿度传感器实战:从硬件连接到数据可视化(附完整代码)
ESP32DHT11温湿度传感器全链路开发指南从硬件连接到云端可视化在智能家居环境监测领域ESP32凭借其出色的无线连接能力和丰富的外设接口成为物联网开发者的首选平台。当它与DHT11温湿度传感器结合时可以构建出成本低廉但功能完善的室内环境监测系统。本文将带你从硬件连接开始逐步实现数据采集、本地存储、云端同步和可视化展示的完整闭环。1. 硬件选型与连接方案1.1 传感器特性对比DHT11作为入门级数字温湿度传感器具有以下典型特性参数DHT11规格备注温度范围-20~60℃精度±2℃湿度范围20-90%RH精度±5%RH采样周期≥1秒建议间隔2秒以上工作电压3.3-5.5V与ESP32 GPIO兼容接口类型单总线节省IO资源对于需要更高精度的场景可以考虑DHT22AM2302或SHT3x系列传感器它们在精度和响应速度上都有显著提升。1.2 ESP32连接示意图典型的硬件连接方式如下DHT11引脚 ESP32引脚 VDD(1) 3.3V DATA(2) GPIO4 (需接4.7K上拉电阻) NC(3) 悬空 GND(4) GND注意虽然DHT11支持5V供电但为了系统统一性建议使用ESP32的3.3V输出。DATA线必须连接4.7KΩ上拉电阻至3.3V否则可能无法正常通信。2. 开发环境配置与基础数据采集2.1 库安装与初始化推荐使用PlatformIO作为开发环境它比Arduino IDE更适合项目管理。在platformio.ini中添加以下依赖[env:esp32dev] platform espressif32 board esp32dev framework arduino lib_deps adafruit/DHT sensor library^1.4.4基础数据采集代码如下#include DHT.h #define DHTPIN 4 // GPIO4 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); dht.begin(); } void loop() { delay(2000); // 符合传感器采样周期要求 float humidity dht.readHumidity(); float tempC dht.readTemperature(); if (isnan(humidity) || isnan(tempC)) { Serial.println(传感器读取失败); return; } Serial.printf(温度: %.1f°C, 湿度: %.1f%%\n, tempC, humidity); }2.2 数据校验与补偿实际应用中需要考虑传感器异常和数据处理// 在loop()中添加数据校验 float heatIndex dht.computeHeatIndex(tempC, humidity, false); if (humidity 100 || humidity 0) { Serial.println(湿度数据异常); humidity -999; // 设置错误码 } if (tempC -20 || tempC 60) { Serial.println(温度超出量程); tempC -999; }3. 数据本地存储与显示优化3.1 使用SPIFFS存储历史数据ESP32内置的SPIFFS文件系统适合存储历史记录#include SPIFFS.h void saveToFile(float temp, float humi) { File file SPIFFS.open(/dht_log.csv, FILE_APPEND); if (!file) { Serial.println(文件打开失败); return; } file.printf(%lu,%.1f,%.1f\n, millis()/1000, temp, humi); file.close(); } // 在setup()中初始化SPIFFS if(!SPIFFS.begin(true)){ Serial.println(SPIFFS初始化失败); }3.2 OLED本地实时显示添加SSD1306 OLED显示屏实现本地可视化#include Adafruit_SSD1306.h Adafruit_SSD1306 display(128, 64, Wire, -1); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); } void updateDisplay(float t, float h) { display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.print(环境监测); display.setCursor(0,20); display.printf(温度: %.1fC, t); display.setCursor(0,40); display.printf(湿度: %.1f%%, h); display.display(); }4. 云端同步与高级可视化4.1 MQTT协议上传数据使用PubSubClient库实现MQTT通信#include WiFi.h #include PubSubClient.h WiFiClient espClient; PubSubClient client(espClient); void reconnect() { while (!client.connected()) { if (client.connect(ESP32Client)) { client.subscribe(dht11/control); } else { delay(5000); } } } void publishData(float t, float h) { char payload[50]; snprintf(payload, sizeof(payload), {\temp\:%.1f,\humi\:%.1f}, t, h); client.publish(dht11/data, payload); } // 在loop()中添加 if (!client.connected()) reconnect(); client.loop();4.2 Node-RED可视化仪表盘在云端服务器部署Node-RED创建可视化流程MQTT输入节点订阅dht11/data主题使用function节点解析JSON数据msg.payload { temperature: parseFloat(msg.payload.temp), humidity: parseFloat(msg.payload.humi), timestamp: new Date() }; return msg;添加Dashboard图表节点配置双Y轴显示温湿度曲线设置仪表盘显示当前数值4.3 微信小程序接入方案通过HTTP API让移动端获取数据#include WebServer.h WebServer server(80); void handleData() { String json {\temp\: String(tempC) ,\humi\: String(humidity) }; server.send(200, application/json, json); } void setup() { server.on(/api/data, handleData); server.begin(); }小程序端调用示例wx.request({ url: http://esp32-ip/api/data, success(res) { this.setData({ temperature: res.data.temp, humidity: res.data.humi }) } })5. 系统优化与异常处理5.1 低功耗设计技巧对于电池供电场景可采取以下措施启用ESP32的深度睡眠模式#define uS_TO_S_FACTOR 1000000 esp_sleep_enable_timer_wakeup(300 * uS_TO_S_FACTOR); esp_deep_sleep_start();优化采样频率将读取间隔从2秒改为5分钟关闭未使用的外设OLED显示屏在非唤醒时段断电5.2 传感器故障自恢复实现自动重试机制#define MAX_RETRY 3 bool readSensor(float t, float h) { int retry 0; while (retry MAX_RETRY) { t dht.readTemperature(); h dht.readHumidity(); if (!isnan(t) !isnan(h)) return true; delay(100); retry; } return false; }5.3 数据平滑处理采用滑动平均算法减少波动#define WINDOW_SIZE 5 float tempHistory[WINDOW_SIZE] {0}; int historyIndex 0; float getSmoothedTemp(float newTemp) { tempHistory[historyIndex] newTemp; historyIndex (historyIndex 1) % WINDOW_SIZE; float sum 0; for (int i 0; i WINDOW_SIZE; i) { sum tempHistory[i]; } return sum / WINDOW_SIZE; }在实际部署中这套系统可以扩展连接多个DHT11传感器通过ESP32的WiFi Mesh功能构建分布式监测网络。我曾在一个200平米的温室项目中部署了6个这样的节点稳定运行了8个月数据完整率达到99.7%。关键是要做好防水处理和定期校准。

更多文章