从零到一:ESP32与DHT11在VSCode+PlatformIO下的物联网温湿度监控系统搭建全攻略
最近在工作室调试设备时,发现传统温湿度计无法远程监控环境数据,于是决定用ESP32和DHT11搭建一个低成本物联网监控系统。这个方案不仅实现了数据实时显示,还能通过WiFi上传云端,特别适合需要环境监测的创客、智能家居开发者和物联网初学者。
1. 硬件选型与连接
选择ESP32-WROOM-32作为主控芯片,主要看中其双核处理器和内置WiFi/蓝牙功能。相比Arduino UNO,ESP32的240MHz主频和520KB SRAM能轻松处理传感器数据与网络通信。
核心组件清单:
- ESP32开发板(Type-C接口版本)
- DHT11温湿度传感器(±2℃精度)
- 0.96寸OLED屏幕(SSD1306驱动)
- 杜邦线若干
硬件连接示意图:
| 组件 | ESP32引脚 | 备注 |
|---|---|---|
| DHT11 DATA | GPIO5 | 需接10K上拉电阻 |
| DHT11 VCC | 3.3V | 避免使用5V防止损坏 |
| DHT11 GND | GND | |
| OLED SCL | GPIO22 | I2C时钟线 |
| OLED SDA | GPIO21 | I2C数据线 |
| OLED VCC | 3.3V | |
| OLED GND | GND |
注意:DHT11信号线长度超过20cm时,建议增加屏蔽措施防止干扰
第一次连接时,我犯了个低级错误——将DHT11的VCC接在了5V引脚上,导致传感器发热且数据异常。后来查阅规格书才发现,虽然DHT11标称工作电压3.3-5.5V,但与ESP32配合时最好统一使用3.3V供电。
2. 开发环境配置
PlatformIO+VSCode的组合比Arduino IDE更专业,特别是代码自动补全和库管理功能。以下是具体配置步骤:
- 安装VSCode后,在扩展市场搜索"PlatformIO IDE"
- 创建新项目时选择"Espressif ESP32 Dev Module"
- 在platformio.ini中添加关键配置:
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino lib_deps = adafruit/DHT sensor library@^1.4.4 olikraus/U8g2@^2.35.7 monitor_speed = 115200遇到最头疼的问题是PlatformIO库下载慢,可以通过修改配置使用国内镜像:
# 在终端执行 pio settings set mirrors.aliyun https://mirrors.aliyun.com/platformio/3. 核心代码实现
项目代码主要分为传感器数据采集和OLED显示两大模块。先创建DHT和OLED的全局对象:
#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, U8X8_PIN_NONE, 22, 21);在setup()中初始化外设时,建议增加启动延时确保硬件就绪:
void setup() { delay(2000); // 等待硬件稳定 Serial.begin(115200); dht.begin(); u8g2.begin(); u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 中文字体 }数据采集部分需要注意DHT11的2秒采样间隔限制。我通过millis()实现非阻塞式采集:
void loop() { static uint32_t lastRead = 0; if(millis() - lastRead > 2000) { float h = dht.readHumidity(); float t = dht.readTemperature(); if (!isnan(h) && !isnan(t)) { displayData(t, h); lastRead = millis(); } } }OLED显示函数采用双缓冲机制避免闪烁:
void displayData(float temp, float humi) { u8g2.clearBuffer(); u8g2.drawUTF8(10, 20, "环境监测系统"); u8g2.drawHLine(0, 25, 128); char buffer[30]; sprintf(buffer, "温度: %.1f ℃", temp); u8g2.drawUTF8(10, 45, buffer); sprintf(buffer, "湿度: %.1f %%", humi); u8g2.drawUTF8(10, 65, buffer); u8g2.sendBuffer(); }4. 常见问题排查
问题1:OLED显示乱码
- 检查I2C地址是否正确(通常0x3C)
- 确认U8g2库初始化时选择的构造函数与硬件匹配
- 中文字体需要额外加载字库
问题2:DHT11读取失败
- 测量信号线电压是否在3.3V左右
- 检查上拉电阻是否接好
- 尝试降低I2C总线速度(在platformio.ini中添加
board_build.f_flash = 40000000L)
问题3:PlatformIO编译报错
- 删除.pio目录后重新编译
- 检查库版本冲突(特别是DHT库有多个变体)
- 更新PlatformIO核心到最新版
实际部署时发现,在密闭空间连续运行24小时后,DHT11数据会出现约5%的漂移。通过增加通风孔和使用软件滤波(滑动平均)解决了这个问题。
5. 进阶功能扩展
基础功能稳定后,可以进一步扩展:
WiFi数据上传(添加以下库):
lib_deps = knolleary/PubSubClient@^2.8MQTT示例代码片段:
#include <WiFi.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); void reconnect() { while (!client.connected()) { if (client.connect("ESP32Client")) { client.publish("sensor/temperature", String(t).c_str()); } else { delay(5000); } } }低功耗优化技巧:
- 启用ESP32的深度睡眠模式
- 将OLED改为间歇刷新
- 降低CPU主频(
setCpuFrequencyMhz(80))
这个项目最让我惊喜的是ESP32的性价比——不到30元的开发板就能实现联网和环境监测。后来在智能温室项目中,我又增加了土壤湿度传感器和继电器控制,整套系统成本控制在百元以内。