要想使用一款外设,首先要找到这个外设对应的资料,以DHT11为例,获取资料的方式有以下几种,淘宝搜索对应外设,主页基本都有资料下载链接的;去论坛,贴吧,知乎等平台找。
我的资料就是从淘宝店家主页链接下载的,在这感谢这些开源的淘宝店家。DHT11主要是测量温度和湿度,可以精确到小数点后两位精度还是很不错的。
DHT11还是有局限性,可以看到湿度的测量范围时20~90,温度的测量范围时0-50,这个温度测量范围就决定了它的上限,当然日常使用是足够了。
通过接线图,可以知道DHT11和MCU是单线双线通讯方式,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位
如图一所示,DHT11和MUC的通讯方式,首先muc发送开始信号,DHT11从低功耗模式转换成高速模式,等待主机开始信号发送完毕,DHT11发送响应信号,告诉主机可以开始传输数据。发送40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
图一
下面开始讲解,总线空闲的时候为高电平,主机发送开始信号等待DHT11响应,主机首先拉低电平必须大于18ms,再拉高点20-40us。这样主机的开始信号就发送完毕,下面只需要等待DHT11响应。DHT11响应信号由DHT11发出,所以需要检测80us的低电平再检测80us高电平。主机设置为输出模式才能发送开始信号,接收DHT11响应信号主机要设置为输入模式。
图二
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉 高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定 了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有 响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如图4所示
数字1信号表示方法.如图5所示
下面开始撸代码
GPIO端口配置为输出模式
GPIO端口配置为输入模式
主机发送开始信号,设置GPIO端口为输出模式,拉高端口5ms做缓冲,拉低端口20ms做缓冲,再拉高电平30us。主机开始信号完成。
DHT11的响应信号,是DHT11向主机发送消息,主机设置为输入模式,使用while循环加超时机制检测电平的时间,低电平维持80us,计时超过100us远大于80us,退出循环,来的不是 响应信号。这里端口电压为什么没有取反,GPIO端口配置为上拉输入或浮空输入模式,空闲时为高电平,DHT11发送1主机GPIO端口接收到的是0;所以这里GPIO端口检测为高电平其实是检测低电平。
读取一个bit的数据
读取一个byte的数据
读取温度是湿度数据
DHT11.h
main.c
运行结果
注意:DHT11对时序要求很严格,没有按照时序写,数据就出来。