ESP32 读取 DHT11 温湿度并串口输出
·
ESP32 读取 DHT11 温湿度并串口输出:GPIO14 接线、库使用与常见问题排查(Arduino)
DHT11/DHT22 是嵌入式项目中最常见的温湿度传感器之一,价格低、接线简单,适合做环境监测、智能家居、设备箱体温湿度保护等场景。本文基于一段可直接运行的 Arduino 示例代码,完整讲解如何在 ESP32 上通过 GPIO14 读取 DHT11 的温湿度数据,并在串口监视器中周期性输出。
1. 实现功能概述
本程序实现了以下功能:
- 使用
DHT库驱动 DHT11 传感器 - 数据线接在 ESP32 的 GPIO14
- 初始化串口(9600 波特率)
- 每 2 秒读取一次传感器数据(符合 DHT11 的最低采样周期要求)
- 读取:
- 湿度(%RH)
- 温度(℃)
- 若读取失败(返回 NaN),在串口输出错误提示并跳过本次打印
2. 硬件准备与接线说明
2.1 所需硬件
- ESP32 开发板
- DHT11 传感器模块(或裸传感器)
- 杜邦线若干
2.2 DHT11 引脚与接线
常见 DHT11 模块一般有 3~4 个引脚:
- VCC → ESP32 3.3V(多数模块支持 3.3V;若模块标注 5V 也可,但 ESP32 IO 仍是 3.3V 逻辑)
- GND → ESP32 GND
- DATA → ESP32 GPIO14
如果你用的是“裸 DHT11”(非模块),通常需要在 DATA 与 VCC 之间加一个上拉电阻(4.7kΩ~10kΩ)。
大多数成品模块已经自带上拉电阻,可直接接线。
3. 依赖库安装(Arduino IDE)
本程序依赖 DHT.h,通常通过安装 Adafruit 的 DHT 库获得。
在 Arduino IDE 中:
- 工具 → 管理库(Library Manager)
- 搜索并安装:
DHT sensor library(Adafruit)- 通常还会提示安装
Adafruit Unified Sensor,建议一并安装(兼容性更好)
4. 完整 Arduino 程序代码
下面是你提供的原始代码,可直接复制运行:
#include <DHT.h>
// 配置传感器
#define DHTPIN 14 // 数据引脚接GPIO14
#define DHTTYPE DHT11 // 传感器型号,DHT22 则改为 DHT22
DHT dht(DHTPIN, DHTTYPE); // 初始化DHT对象
void setup() {
Serial.begin(9600); // 串口初始化
dht.begin(); // 传感器初始化
}
void loop() {
// 等待传感器稳定(DHT11每次读取间隔至少1秒,DHT22至少2秒)
delay(2000);
// 读取温湿度数据
float h = dht.readHumidity(); // 湿度值(%RH)
float t = dht.readTemperature(); // 温度值(℃),默认摄氏度,华氏度用 readTemperature(true)
// 检查读取是否失败
if (isnan(h) || isnan(t)) {
Serial.println("读取传感器数据失败!");
return;
}
// 串口打印数据
Serial.print("湿度: ");
Serial.print(h);
Serial.print(" %RH\t");
Serial.print("温度: ");
Serial.print(t);
Serial.println(" ℃");
}
5. 代码逻辑详解(关键点)
5.1 选择传感器类型与数据引脚
#define DHTPIN 14
#define DHTTYPE DHT11
DHTPIN决定数据线接到哪个 GPIODHTTYPE决定驱动协议细节
如果你换成 DHT22,需要改成:
#define DHTTYPE DHT22
5.2 初始化 DHT 对象
DHT dht(DHTPIN, DHTTYPE);
这行代码创建了 DHT 驱动对象,后续所有读写都通过 dht 完成。
5.3 setup():串口与传感器初始化
Serial.begin(9600);
dht.begin();
Serial.begin(9600)用于串口打印调试信息dht.begin()会初始化传感器驱动(必须调用)
5.4 loop():控制采样间隔并读取数据
delay(2000);
DHT 传感器对采样周期有要求:
- DHT11:推荐至少 1 秒一次
- DHT22:推荐至少 2 秒一次
你的代码使用 2 秒,兼容性更稳。
读取部分:
float h = dht.readHumidity();
float t = dht.readTemperature();
readHumidity()返回湿度百分比(%RH)readTemperature()默认返回摄氏度
如果要华氏度:
float tf = dht.readTemperature(true);
5.5 读取失败判断:NaN 检测
DHT 协议时序要求较严格,读失败在实际项目中很常见。库通常会返回 NaN,因此你做了:
if (isnan(h) || isnan(t)) {
Serial.println("读取传感器数据失败!");
return;
}
这可以避免输出无效数据,同时便于排查接线或供电问题。
6. 串口查看方式与输出示例
上传程序后,打开 Arduino IDE 的串口监视器:
- 波特率选择 9600
- 你会看到每 2 秒输出一行,例如(示意):
湿度: 45.00 %RH 温度: 26.00 ℃
7. 常见问题排查(读取失败最常见的原因)
如果你频繁看到“读取传感器数据失败!”,通常按以下顺序排查:
-
供电与地线是否可靠
- DHT11 对供电稳定性比较敏感
-
DATA 引脚是否接对 GPIO14
-
是否缺少上拉电阻
- 裸传感器尤其常见;模块一般自带
-
采样间隔是否过短
- DHT11 不要小于 1 秒
- DHT22 不要小于 2 秒
-
线太长/干扰太强
- 线过长时建议缩短,或增加滤波与更好的供电去耦
-
GPIO 选择不当
- ESP32 某些引脚有启动/下载相关功能,尽量使用常规 GPIO(14 通常可用)
8. 实战扩展建议(下一步怎么做)
当你能稳定读取 DHT11 后,可以很自然地扩展为:
- 在 OLED 上显示温湿度(结合 SSD1306)
- 超过阈值触发风扇/蜂鸣器/继电器
- 上报 MQTT/HTTP 到服务器
- 存入 SD 卡或发送到蓝牙/串口上位机
例如加入“温度过高报警”逻辑(示意):
if (t > 35.0) {
Serial.println("温度过高,触发报警!");
}
9. 总结
这份 ESP32 + DHT11 Arduino 程序完成了一个标准的温湿度采集闭环:
- 初始化串口与传感器
- 按规定周期读取温湿度
- 判断 NaN 处理读取失败
- 串口输出数据,便于调试与验证
更多推荐




所有评论(0)