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

手里有个温湿度传感器,想用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.2%RH     温度=35.1℃     

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

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

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

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

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

      

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

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

 

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

 

FPGA设计:

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

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

读出来的数据:02E0009C7EH

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

MARK:

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

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

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

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

永不止步步 发表于02-18 09:49 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号