从零到一:ESP32与DHT11在VSCode+PlatformIO下的物联网温湿度监控系统搭建全攻略
2026/6/7 1:30:57 网站建设 项目流程

从零到一: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 DATAGPIO5需接10K上拉电阻
DHT11 VCC3.3V避免使用5V防止损坏
DHT11 GNDGND
OLED SCLGPIO22I2C时钟线
OLED SDAGPIO21I2C数据线
OLED VCC3.3V
OLED GNDGND

注意:DHT11信号线长度超过20cm时,建议增加屏蔽措施防止干扰

第一次连接时,我犯了个低级错误——将DHT11的VCC接在了5V引脚上,导致传感器发热且数据异常。后来查阅规格书才发现,虽然DHT11标称工作电压3.3-5.5V,但与ESP32配合时最好统一使用3.3V供电。

2. 开发环境配置

PlatformIO+VSCode的组合比Arduino IDE更专业,特别是代码自动补全和库管理功能。以下是具体配置步骤:

  1. 安装VSCode后,在扩展市场搜索"PlatformIO IDE"
  2. 创建新项目时选择"Espressif ESP32 Dev Module"
  3. 在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.8

MQTT示例代码片段

#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元的开发板就能实现联网和环境监测。后来在智能温室项目中,我又增加了土壤湿度传感器和继电器控制,整套系统成本控制在百元以内。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询