DHT11 温湿度传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| DHT11 模块 | 1 | — |
| 杜邦线 | 3 | — |
价格随渠道波动,以购买页实时为准。
如果你做的第一个"会感知环境"的项目,多半是从这块蓝色(或白色)的小方块开始的。点灯学会了控制输出,DHT11 则是你第一次让单片机"读懂"外面的世界——它告诉你现在房间多少度、多潮湿。十块钱以内,三根线,库一装就能跑,所以它几乎是每个人的传感器启蒙。
工作原理
DHT11 里塞了两个东西:一个电阻式测湿元件,一个 NTC 热敏电阻测温元件。
测湿靠的是一种吸湿材料。空气越潮,材料吸的水越多,它的电阻值就跟着变。芯片量出这个电阻,反推出相对湿度。测温就是常见的 NTC 热敏电阻——温度升高电阻下降,这是一条已知的曲线,量电阻就能算温度。
关键在于,这两路模拟量并不直接给你。DHT11 内部有一颗专用小芯片,把测出来的电阻先转成数字,再按一套固定时序,只用一根数据线把结果发出来。这就是"单总线"(1-Wire 风格的私有协议):收和发都走同一根线,不像 I2C 还要分时钟线和数据线。
这根线平时被上拉电阻拉成高电平。主机想读数据时,先把线拉低一段时间当作"起床信号",再松手;DHT11 收到后回一个应答,然后一位一位地把 40 个 bit(湿度整数、湿度小数、温度整数、温度小数、校验和)通过高电平的持续时长编码发出来——高电平短是 0,长是 1。整个过程是严格卡时间的微秒级时序,自己手搓很容易翻车。好在这些脏活库都替你封装好了,你只管调一个 read()。
接线
DHT11 一共三根有效线(四脚版有一个脚是空的)。
| DHT11 | ESP32 | 说明 |
|---|---|---|
| VCC | 3.3V | 接 5V 也能工作 |
| DATA | GPIO4 | 任意普通 GPIO 都行 |
| GND | GND | 共地 |
带小电路板的模块版通常已经把上拉电阻焊在板上了,三根线插上即可。
裸传感器(四脚直插那种)没有上拉,必须在 DATA 和 VCC 之间自己加一个 10kΩ 电阻,否则数据线悬空,读出来全是 nan。关于上拉是怎么回事,可以看 上拉电阻原理。
完整代码
用 Adafruit 的 DHT 库最省事。Arduino 库管理器搜 "DHT sensor library" 装上(它会让你顺带装 Adafruit Unified Sensor,一起装)。
#include "DHT.h"
#define DHTPIN 4 // DATA 接在 GPIO4
#define DHTTYPE DHT11 // 型号选 DHT11,不是 DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
Serial.println("DHT11 启动");
}
void loop() {
// DHT11 采样慢,间隔必须 >= 1 秒,这里给到 2 秒更稳
delay(2000);
float h = dht.readHumidity(); // 相对湿度 %
float t = dht.readTemperature(); // 摄氏度
// 读失败时返回 nan,一定要判一下
if (isnan(h) || isnan(t)) {
Serial.println("读取失败,检查接线和间隔");
return;
}
Serial.printf("温度: %.1f C 湿度: %.1f %%\n", t, h);
}
注意 DHTTYPE 写错是新手最常见的乌龙——拿 DHT11 的硬件却填了 DHT22,读数会全乱或全 nan。
你应该看到什么
串口监视器(波特率 115200)每 2 秒刷一行:
DHT11 启动
温度: 24.0 C 湿度: 53.0 %
温度: 24.0 C 湿度: 54.0 %
温度: 25.0 C 湿度: 52.0 %
DHT11 的温度只到整数位,所以你会发现小数点后永远是 .0——这不是 bug,是它的分辨率就这么粗。对着传感器哈口气,下一行湿度会明显往上跳,这是确认它真在工作的最快办法。
读数解读
把 DHT11 的能力摆清楚,免得你拿它去干超纲的活:
| 项目 | 量程 | 精度 | 分辨率 |
|---|---|---|---|
| 温度 | 0 ~ 50 °C | ±2 °C | 1 °C |
| 湿度 | 20 ~ 90 %RH | ±5 %RH | 1 %RH |
几个要记住的点:
- 量程窄。低于 0°C 或高于 50°C 它测不了,结冰天放室外就别指望了。
- 精度一般。±2°C 意味着它读 25°C,实际可能是 23~27°C 之间。做室内大致监测够用,做精密控制不行。
- nan 是它在喊救命。返回 nan 不代表环境异常,而是这一次通信失败了——下一节专门讲怎么治。
选型 / 避坑
读数为 0 或 nan 是 DHT11 最高频的问题,按这三条排查:①采样太快——读取间隔低于 1 秒它来不及响应,给到 2 秒最稳;②裸传感器忘了在 DATA 和 VCC 间加 10kΩ 上拉;③接触不良或杜邦线松动。三条占了九成的 nan。
DHT11 的定位就是"够便宜、够入门",下面这两个是你想升级时的去向:
- 要更准、量程更宽 → DHT22。同样的单总线接法、同样的库(
DHTTYPE改成DHT22即可),温度精度 ±0.5°C、湿度 ±2%,量程也宽得多。代码几乎不用改,性价比的下一档就是它。 - 要 I2C、要小体积、要工业级稳定 → SHT30。走 I2C 总线(占两根线但可以挂多个设备),精度和长期稳定性都比 DHT 系列强一截,适合做正经产品。
- 只测温度、不要湿度 → 看 DS18B20,防水款还能塞进土里测地温。
一句话取舍:练手和玩具用 DHT11,做点像样的东西换 DHT22,要上产品上 SHT30。
故障排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 一直 nan / 读失败 | 采样间隔 < 1 秒 | delay 改到 2000ms |
| 偶尔 nan | 接触不良 / 杜邦线松 | 换线、检查焊点 |
| 全程 nan(裸传感器) | 缺上拉电阻 | DATA-VCC 间加 10kΩ |
| 读数全乱 | DHTTYPE 填错 |
确认是 DHT11 不是 DHT22 |
| 温度小数永远 .0 | 正常现象 | DHT11 温度分辨率就是 1°C |
| 上电就没反应 | 接错脚 / 供电不足 | 核对 VCC/GND,换 USB 口 |
进阶 / 变体
读到串口只是第一步。下一步很自然:给它配一块屏,做成一个能离线看的桌面温湿度计。OLED 接 I2C,DHT11 接单总线,互不打架,加几行显示代码就成。具体怎么把传感器数据画到屏上,看 温湿度计显示项目 和 OLED 显示屏入门。
再往后,如果你想让设备"自己判断"——比如湿度低于某个值就提醒浇水、温度异常就报警——那就进入了 传感器 + AI 决策 的范畴,DHT11 正好是这条链路最省钱的输入端。
典型应用
- 室内温湿度计:配 OLED 或网页上报,最经典的第一个完整项目。
- 植物养护提醒:湿度过低时点亮一个 LED 或推一条消息。
- 机房/柜子简易监测:在精度要求不高的角落布几个,盯个大概。
- 纯练手:搞懂单总线、搞懂 nan、搞懂"模拟量怎么变成数字",DHT11 是最便宜的教具。
小结 · 相关
DHT11 测得不准、量程也窄,但它把"读取一个真实物理量"这件事的门槛压到了十块钱和三根线。它教会你的单总线时序、采样间隔、nan 排查,换到 DHT22、SHT30 上一样用得着。把它当起点,别当终点。
相关阅读:DHT11 入门实操 · DHT22 升级款 · 数字与模拟信号 · 上拉电阻 · 回传感器图鉴
参数以上方 datasheet 为准;本页为公开资料整理,接线和代码请结合实物验证。