DHT11是Arduino入门级环境监测最常用的传感器之一,十几块钱一个模块,能测温度0-50°C、湿度20-80%RH,精度温度±2°C、湿度±5%。做室内环境监测站、温室控制、宠物箱温湿度监测这类项目,从它入手就够了。接线简单、代码现成,适合新手第一次接触传感器。

DHT11和DHT22有什么区别,该选哪个
DHT11和DHT22外观差不多,都是4针(实际用3针)封装,但参数差很多。DHT11测温范围0-50°C、精度±2°C、湿度20-80%、精度±5%;DHT22测温-40到125°C、精度±0.5°C、湿度0-100%、精度±2%。DHT22贵一倍多但精度高很多。
如果你的项目对精度要求不高,比如就是看看室内温湿度、做个简单的环境监测显示,DHT11够了。如果要放室外、冰箱里、或者需要比较精确的湿度数据,直接上DHT22,别在DHT11上折腾。两者的代码库基本兼容,切换成本很低。
接线:三个引脚对应三根线
DHT11模块一般有3个引脚:VCC、DATA、GND。VCC接Arduino的5V,GND接地,DATA接任意数字引脚(比如D2)。注意模块版本不同引脚排列可能不一样,拿到手先看板子上的丝印标注。
跟DS18B20一样,DHT11的DATA线上也需要一个上拉电阻,一般是10kΩ接在DATA和VCC之间。好消息是大多数DHT11模块板上已经自带了这个上拉电阻,你只需要接三根线就行,不用额外加。如果你买的是裸芯片(4针直插),那就需要自己加电阻了。
代码:Adafruit DHT库直接调用
Arduino IDE里装Adafruit DHT sensor library和Adafruit Unified Sensor这两个库。装好之后代码极其简单:初始化DHT对象指定引脚和型号(DHT11或DHT22),loop里调dht.readTemperature()和dht.readHumidity()就完事了。
需要注意的是DHT11的读取间隔不能低于1秒,它的采样率就是1Hz。如果你代码里写delay(100)就去读,拿到的就是上一次的数据。另外读取偶尔会失败(返回NaN),正常现象,代码里加个判断跳过就行。
配合LCD1602做环境监测站
DHT11最常见的应用就是搭配LCD1602做一个小型环境监测站。LCD1602用I2C背包的话只需要4根线:VCC、GND、SDA、SCL,接到Arduino的A4(SDA)和A5(SCL)。代码里用LiquidCrystal_I2C库,setup里初始化地址(一般是0x27或0x3F),loop里读取温湿度然后lcd.setCursor和lcd.print显示。
第一行显示温度、第二行显示湿度,每隔2秒刷新一次。加上一个按钮切换摄氏/华氏,就是一个完整的桌面环境监测仪了。外壳可以3D打印一个,或者用现成的亚克力仪表盘装起来。
常见坑:读不出数据或者数值不对
第一个坑是供电不足。DHT11工作电流2.5mA左右看着不大,但如果你的Arduino已经挂了很多模块,5V供电可能不稳。遇到这种情况试试直接USB供电而不是从其他模块的5V引脚取电。
第二个坑是读取频率太快。前面说了间隔不能低于1秒,但很多人debug的时候把delay去掉反复读,结果全是NaN。正确做法是每秒读一次,读失败就打印一个错误提示继续循环。
第三个坑是湿度读数偏差大。DHT11的湿度精度本身就只有±5%,在低湿环境(比如冬天开暖气室内湿度低于30%)几乎测不准。这种场景换DHT22或者用专业的SHT30模块。DHT11适合的环境是常温常湿的室内。
DHT11作为入门级温湿度传感器,几块钱的价格、简单的接线、现成的库,用来做DIY环境监测项目再合适不过。新手从它入手学传感器通信协议,老手做简单的温湿度监测也够用。要求高的直接上DHT22或SHT30。










搭配1602做桌面温湿度计挺好玩的,我再加了个蜂鸣器,温度超过30度就报警,夏天用来提醒自己开空调。
读取频率这个坑踩过,debug的时候把delay去掉了,一直读到NaN还以为传感器坏了。后来加回delay(1000)就好了。
请问LCD1602的I2C地址怎么确定?0x27和0x3F都有人用,买回来不确定是哪个。
DHT11确实适合入门,我第一次做传感器项目就是用它。不过要说精度,冬天室内湿度低于30%的时候DHT11真的测不准,后来换了DHT22好多了。如果项目对湿度精度有要求,建议直接上DHT22,多花几块钱省很多事。