温度湿度模块看起来简单,只有三个引脚(实际4个接口),但仔细一想,3个引脚分别作为VCC、GND、DATA用处的话,因为传给树莓派GPIO的只有高电平、低电平,那么怎么来读取整型的温度数字和湿度数字呢?这么一想,并不简单!反而是因为引脚少,它需要高低变化的时序信号来表达数值,还有一些其它信号如开始信号等等。看样子这次我们得先深入了解一下DHT11模块了。
0. 先来看模块结构和特性
如上图,三根引脚分别是:“+”对应VCC 3.3V或者5V,中间OUT为DATA接GPIO口,“-”对应电源负极。
1. DHT11模块时序信号
百度一下就能搜到中文版的说明书,传送门:http://wenku.baidu.com/link?url=TZ8UkMmHxmwWfMUlThThtYJpEx1-um21yejWpvB_XSAog3TIr2AStTXNPTYb0FhJ_mgsWI0_KUf-LAAU4t6_aBELQBLL8NPSh315A1Bztw7
我们需要掌握两个关键的时序信号:开始握手阶段和数据发送阶段。
1)开始握手阶段
主机端GPIO发送开始信号首先拉低至少18ms,然后拉高20-40us,模式变为IN等待信号输入。
DHT11等待主机端开始信号(低电平)结束后,发送80us低电平响应开始信号。然后DHT11拉高电平80us。握手完毕。
2)数据发送阶段
一次的湿度和温度数据,DHT11需要发送40bits(0、1)数据,每一位数据之前都以50us低电平开始ÿ