DHT11应该是电子爱好者用得最多的温湿度传感器了——几块钱一个,一根数据线就能通信,全网资料一大堆。但很多人只会抄别人的代码,时序出了问题就抓瞎。今天把DHT11的程序从时序层面拆开讲,看完你完全可以自己手写一个驱动。
先看参数:湿度测量范围一般是20%-90%RH,精度±5%RH;温度0-50℃,精度±2℃;采样周期不要低于1秒,读太快数据会错乱。接口是单总线,有用的就三根线——VCC、DATA、GND,DATA线必须加4.7k到10k的上拉电阻(淘宝买的模块版一般板载了,裸的传感器芯片一定要自己加)。
通信从起始信号开始:主机(单片机)把总线拉低至少18毫秒,然后释放总线拉高20-40微秒。DHT11检测到这个起始信号后,会主动拉低总线80微秒作为响应,再拉高80微秒,表示"我准备好了",紧接着开始连续输出40位数据。整个过程是主机发起、从机应答,时序都是微秒级的,程序里延时函数要写得准。
40位数据的结构是:湿度整数8位+湿度小数8位+温度整数8位+温度小数8位+校验和8位。每一位都以50微秒的低电平开头,后面高电平的长短决定这一位是0还是1——高电平持续26-28微秒是0,持续70微秒是1。所以程序上的读法很固定:等低电平结束,等高电平开始,延时40微秒后采样,这时候是高电平就记1,低电平就记0。
拿51单片机举例,代码骨架大概是这样:DATA脚定义成sbit位变量;起始段把DATA拉低,调用毫秒级延时18ms以上,然后释放总线;等DHT11的响应信号过去;然后一个循环跑40次,每次先while(!DATA)等低电平结束,再while(DATA)等高电平开始后延时40微秒采样,按位拼进接收变量;最后把5个字节收完,前4个字节相加的低8位等于校验和字节,说明这帧数据是完整的。
常见的坑列一下:第一,上电后1秒内不要读,传感器内部自检没完成,读了也白读;第二,读出来全是0或者全是255,八成是时序写错了或者DATA线没上拉电阻;第三,读数据的过程中如果有中断打断,时序就乱了,读DHT11时最好关中断,读完再开;第四,DHT11的温度小数字节永远是0,别指望它能给你小数,要小数精度得换DHT22;第五,校验和不对的直接丢掉这次数据,等下个周期重新读,不要用错数据。
进阶建议:DHT11精度一般,做温湿度监控要求高一点的,换DHT22(AM2302)或者I2C接口的SHT30,DHT22时序跟DHT11几乎一样就是分辨率到0.1了,SHT30带CRC校验更可靠。工业场合不推荐DHT系列,漂移比较明显。总的来说,DHT11拿来做学习项目非常合适,重点是把这套微秒级单总线时序吃透——学会了这个,DS18B20、DHT22那些单总线器件的驱动你都能自己写。
上一篇:gcc-3.4.0.tar.gz源码编译安装:Linux下没有yum源时怎么从源码装GCC
下一篇:没有了