硬件连接很简单,在模块数据引脚和单片机数据IO口间串上一个上拉电阻,一般5.1K,超过一定距离就要降低了,一般也不会拿去测量很远的地方,如果真的很远,那数据传输不如使用无线方式了。同时还有一个滤波电容,用来增加抗干扰能力。
第二步:分析时序
官方的使用说明上,给了详细的时序说明。
建议按照这个时序说明来写程序,毕竟是官方的。很多其他来源的数据手册和这个相差很大。
关于唤醒从机,即主机先拉低数据线,再拉高这个过程,我个人认为从机被唤醒是检测到了由低到高的上升沿,所以一开始的拉低时间并不需要多精确,大概一个范围就可以,只要保证从机可以获取到数据线当前状态是低电平。DHT22在这里只要1ms左右就可以识别,而DHT11则需要20ms,这就大大提升了测量速度效率。拉低以后再拉高的维持时间,需要按照手册规定的范围来,因为如果太短,可能从机还没检测到这个跳变就没了,类似于数电中的寄存器保持时间Th;如果太长,后面从机的响应信号都已经发来了,你主机还在这拉高数据线,那就乱套了。
第三步:程序代码
以下是我个人的程序驱动代码,经检测切实可用。用的是STM32单片机,不过操作方法在各单片机上是通用的。
个人觉得在写这个时序的时候,最重要的就是简洁,一些判定达到目的就行,正点原子的STM32 开发板上给出的DHT11例程,在时序上多次使用变量retry去计数并且做1us的延时,但是基本上都没用到,那这样的话就白白增加了时间,要知道这些语句的执行时会耽误时间的,这时间还很多,难免会有一些时序上的错乱。
还有就是网上很多人强调的检验和的问题,如果不使用校验和,其实也会有数据出来,但是如果都是正确的操作,校验肯定能通过,注意程序中是(u8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) 楼主一度没有前面加上强制转换u8,导致校验未通过没有数据出来。四个八位数相加和大多数超过8位了,有的编译环境可能只留八位,但是楼主用的keil uv5,应该不是默认只留八位,需要自行强制转换。
第四步:结果
这里用的是串口将测出来的数据发送出来,省去小数部分,保留整数。
这里是发送11 03作为检测温湿度的指令来控制电路板检测一次温湿度。返回来的数值,第一个是湿度值,第二个是温度值。
多次测量,并且第5和第6次测量中间间隔时间为半小时,可以看到测量结果较为稳定。这里显示的是16进制,转换以后,湿度大概在50%左右,温度大概在18度左右,基本符合室内环境。
欢迎讨论咨询作者: 狂野的牛哥, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3867932.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
curton 2019-4-23 15:44
狂野的牛哥 2019-4-3 16:53
冰点1128 2019-4-3 16:45