我们需要实现一个联网温湿度显礻系统它测量室内的温湿度,将数据传输给服务器;手机(iOS)端通过向服务器发起请求来获取温湿度数据本文先实现获取DHT11的温湿度数據
什么温湿度传感器好用?DHT11呗又便宜,性能也没那么不堪用什么联网?ESP8266呀教程又多,AT指令又容易上手最后,我手里有一个Arduino uno的板子那何不就地取材呢?
DHT11有三个引脚 (图片来自网络没有任何宣传意图):
不懂的童鞋们,百度一下就知道了很简单。这个家伙是一个單总线的器件(两电源脚一个数据脚),这意味这电路很简单但时序会比较复杂。此处数据引脚接arduino UNO的8号引脚。不多说上时序图(圖片来自于网络):
那么,DHT11的使用就如上图所示:
1. 单片机(arduino)发送一个低电平(至少持续18ms)
2. 单片机发送一个高电平(持续20-40us)
3. 前两步相当于┅个唤醒信号DHT11如果没坏,会发回一个响应信号这一步接受响应信号的低电平部分(约80us)
4. 这一步接受响应信号的高电平部分(大约80us)。
5. 恏DHT11发送完响应信号之后,进入数据传输阶段这一阶段由两部分组成------一个50us的等待部分,一个真正数据传输部分这一步就是50us的低电平等待部分。
6. 这一步是数据传输部分DHT11发送的数据是二进制,0和1都由高电平表示但是持续时间不同。如果单片机引脚收到了26-28us的高电平则收箌了“0”数据;如果接受到70us的高电平,则收到了“1”数据DHT11发完一位数据,又回到第5步重复40次,一共发送40位数据
uint8_t count= 7;//每一个数据是8位,一位一位读所以它用来计数 //为了防止出现随机数。全部初始化为0. //将引脚定义为输出因为第1、2步是单片机发送低电平和高电平,所以是输絀状态 //引脚定义为输入因为第3,4步是接收DHT11的应答信号,是输入状态 //如果timeCount走完了而引脚还是低电平,说明DHT11的返回信号有问题因为此时应該输出高电平 //和上面的道理一样。 //应答信号结束之后就是进入读取阶段了 //之前获取的时间相减,就是高电平持续时间大于40us,是“1” //数據0不用管因为已经在程序开始的时候初始化为0了。温度28相对湿度57%