xzy610030

一起探讨,一起进步,一起分享!

DHT22(AM2302)数字温湿度传感器读取

1
阅读(11215)

手里有个温湿度传感器,想用STM32读取,但习惯性用FPGA来试试了。

这个传感器长这样:

引脚定义:

   


       AM2302的供电电压为3.3-6V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

DATA 用于微处理器与 AM2302之间的通讯和同步,采用单总线数据格式,一次通讯时间5ms左右 ,具体格式在下面说明,当前数据传输为40bit,高位先出。

数据格式: 40bit数据=16bit湿度数据+16bit温度数据+8bit校验和

例子:  接收40bit数据如下:      

         0000 0010 1000 1100  0000 0001 0101 1111  1110 1110

                  湿度数据         温度数据         校验和

             湿度高8+湿度低8+温度高8+温度低8=的末8=校验和

             例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110

             湿度=65.2RH     温度=35.1℃     

             当温度低于0℃时温度数据的最高位置1

             例如:-10.1℃表示为1000 0000 0110 0101  


       用户主机(MCU)发送一次开始信号后,AM2302从低功耗模式转换到高速模式,等待主机开始信号结束后,AM2302发送响应信号,送出40bit的数据,并触发一次信号采集。(注:主机从AM2302读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,请连续读两次以获得实时的温湿度值)

 

3.png

     空闲时总线为高电平,通讯开始时主机(MCU)拉低总线1~10ms后释放总线,延时20-40us后主机开始检测从机(AM2302)的响应信号。

     从机的响应信号是一个80us左右的低电平,随后从机在拉高总线80us左右代表即将进入数据传送。 

                               

4.png

      

      高电平后就是数据位,每1bit数据都是由一个低电平时隙和一个高电平组。低电平时隙就是一个50us左右的低电平,它代表数据位的起始,其后的高电平的长度决定数据位所代表的数值,较长的高电平代表1,较短的高电平代表0。共40bit数据,当最后一Bit数据传送完毕后,从机将再次拉低总线50us左右,随后释放总线,由上拉电阻拉高。

                               

数字1信号表示方法如下:

5.png


数字0信号表示方法.如下所示:

6.png


FPGA设计:

    协议很简单。。用状态机实现的,写的很随意。。。。

    很多变量都是随意命名的,因为当时就是测试一下这个传感器,发现花了一晚上,于是写博客mark一下,后续把代码整理优化后再贴上来吧。

  读出来的数据:02E0009C7EH

7.png

湿度:73.6RH   温度:15.6°-----------终于冬天走了

MARK:

(1)两次连续读取的时间不能太短,之前太短的时候,只能读取一次,第二次就失败了,因为应答失败。

http://wenku.baidu.com/link?url=mRDG_-EzxonXzYZf57ykIQf3oFV056cUzh8rT2mqaEbE9DMOgkn8MkxXHKNZ8VbIaFw1pPBoHVRrKUMqz5HF6NwIi3WQzhzBRCT1T2KZLS3


这个文章中说要2s,其实不用2s。


接下来,用STM32外接12864做菜单显示,并将数据发给上位机,上位机打算用java来做,慢慢来吧。朋友给取了一个高大上的名称:智能温室大棚,用LCD显示温湿度,用户可以通过按键进去菜单,在里面可以设置温湿度报警值,然后把温湿度通过串口(网口)实时的发送到电脑,在电脑上用java写一个上位机,绘制温度曲线~~~~