1. 项目概述:为什么选择ESP32+DHT11?
如果你正在寻找一个低成本、易上手的温湿度监测方案,ESP32搭配DHT11传感器绝对是入门级物联网项目的黄金组合。ESP32作为一款集成了Wi-Fi和蓝牙功能的微控制器,价格不到30元却能实现联网功能;而DHT11作为经典的数字温湿度传感器,虽然精度不算顶尖(温度±2℃,湿度±5%RH),但对于家庭温室监测、仓库环境监控等场景完全够用。
我去年帮朋友搭建过一个阳台种植监测系统,就是用这套方案实现的。实测在3米×4米的封闭阳台环境中,单个DHT11就能准确反映环境变化,数据通过Wi-Fi上传到手机APP,成本不到50元。相比动辄上千元的专业设备,这个方案对DIY爱好者特别友好。
2. 硬件准备与连接
2.1 所需材料清单
核心部件:
- ESP32开发板(推荐ESP32-WROOM-32,Type-C接口版本更方便)
- DHT11温湿度传感器(注意选择带PCB板的型号,稳定性更好)
可选配件:
- 0.96寸OLED屏幕(SSD1306驱动)
- 面包板+杜邦线(建议使用防反插的镀金线)
- Micro USB数据线(建议选带磁环的抗干扰线)
2.2 电路连接详解
DHT11的接线非常简单,只需要3根线:
DHT11引脚说明: - VCC → ESP32的3.3V - DATA → GPIO5(可自定义,但代码需同步修改) - GND → ESP32的GND这里有个实用技巧:在DATA引脚和VCC之间加一个4.7KΩ的上拉电阻,能显著提高信号稳定性。我遇到过好几次数据读取失败的情况,加上电阻后就再没出过问题。
如果使用OLED显示,接线如下:
OLED引脚说明: - SCL → GPIO22 - SDA → GPIO21 - VCC → 3.3V - GND → GND3. 开发环境搭建
3.1 VSCode配置指南
安装VSCode后,打开扩展市场搜索安装:
- PlatformIO IDE(必装)
- C/C++(代码提示)
- Python(部分依赖需要)
首次打开PlatformIO会自动安装核心组件,如果下载慢可以:
# 在终端设置镜像源 pio settings set mirrors.China https://mirrors.bfsu.edu.cn/pypi/web/simple
3.2 PlatformIO工程创建
- 点击PlatformIO主页的"New Project"
- 按如下配置:
Board: ESP32 Dev Module Framework: Arduino Location: 建议使用英文路径 - 创建完成后,在platformio.ini中添加依赖库:
lib_deps = adafruit/DHT sensor library@^1.4.4 olikraus/U8g2@^2.35.7
4. 代码实现解析
4.1 核心代码解读
在src/main.cpp中输入以下代码:
#include <Arduino.h> #include <DHT.h> #include <U8g2lib.h> // 硬件配置 #define DHTPIN 5 #define DHTTYPE DHT11 // 初始化对象 DHT dht(DHTPIN, DHTTYPE); U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); void setup() { Serial.begin(115200); dht.begin(); u8g2.begin(); u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 中文字体 } void loop() { delay(2000); // DHT11最小采样间隔1s float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("读取失败!"); return; } // OLED显示 u8g2.clearBuffer(); u8g2.drawStr(0, 20, "温度:"); u8g2.setCursor(40, 20); u8g2.print(t, 1); u8g2.drawStr(80, 20, "°C"); u8g2.drawStr(0, 40, "湿度:"); u8g2.setCursor(40, 40); u8g2.print(h, 1); u8g2.drawStr(80, 40, "%"); u8g2.sendBuffer(); // 串口输出 Serial.printf("温度: %.1f°C 湿度: %.1f%%\n", t, h); }4.2 常见问题处理
中文乱码问题:
- 需要手动导入中文字库
- 在platformio.ini中添加:
build_flags = -DU8G2_USE_LARGE_FONTS
数据读取失败:
- 检查接线是否松动
- 尝试降低I2C时钟频率:
Wire.setClock(100000); // 在setup()中添加
5. 功能扩展与优化
5.1 数据上传云端
添加WiFi连接和HTTP请求代码:
#include <WiFi.h> const char* ssid = "你的WiFi"; const char* password = "密码"; void connectWiFi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("连接成功"); } void postData(float t, float h) { HTTPClient http; http.begin("http://api.example.com/data"); http.addHeader("Content-Type", "application/json"); String payload = "{\"temp\":" + String(t) + ",\"humi\":" + String(h) + "}"; int code = http.POST(payload); Serial.printf("HTTP状态码: %d\n", code); http.end(); }5.2 低功耗优化
通过深度睡眠实现电池供电:
#define uS_TO_S_FACTOR 1000000 #define SLEEP_TIME 300 // 秒 void setup() { esp_sleep_enable_timer_wakeup(SLEEP_TIME * uS_TO_S_FACTOR); // ...其他初始化代码... } void loop() { // ...数据采集代码... esp_deep_sleep_start(); }6. 项目实战经验
在最近一个智能衣柜项目中,我发现DHT11在密闭空间容易出现冷凝水导致读数异常。解决方案是在传感器周围涂抹少量凡士林防水,同时将采样间隔从2秒延长到5分钟。另外,ESP32的WiFi信号在金属柜体内衰减严重,最终通过外置陶瓷天线解决了联网问题。
对于需要更高精度的场景,建议升级到DHT22或SHT30传感器,虽然价格贵3-4倍,但温度精度可达±0.3℃,湿度±2%RH。不过对于大多数日常应用,DHT11的性价比依然无敌。