你现在位置:首页>技术论文>数据通讯>正文
HT11温湿度传感器通信(上)
日期:2010-11-9 12:55:43 点击:
来源:本站整理
作者:
点击【】放大字体.
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Modbus Rtu Client即可读出温湿度数据。是方便了开发,不过价格不菲,要价要150元左右。
WWW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

网友fangyuan推荐了一款仅7元的DHT11温湿度传感器,刚开始以为是TTL电平的串口通信,后来一研究,原来通过一根数据线的双向通信,并且对时序要求很严格,这东西也许用单片做更容易,用STM32来做,反而有老虎吃天,无从下口之感。想来想去,最理想的方式也许需要深入研究时钟的输入捕获相关知识了。
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WWW_PLCJS_COM-PLC-技.术_网

DHT11的典型应用电路(见下图)。
WWW_PLCJS@_COM%-PLC-技.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWcW_PLCJS_COM-PLC-技.术_网

通信接口为串行接口(单线双向),通信过程如下:
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

——可——编——程——控-制-器-技——术——门——户

WWW_PL※CJS_COM-PLC-技.术_网

 
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

数字0和数字1的信号表示方法如下(有点类似红外遥控器的编码了):
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PLC※JS_COM-PmLC-技.术_网

WWcW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

一次完整的数据传输为40bit,高位先出。
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

数据格式:8bit湿度整数数据 8bit湿度小数数据
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WW.W_PLC※JS_C,OM-PL,C-技.术_网

8bi温度整数数据 8bit温度小数数据
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW.PLCJS.COM——可编程控制器技术门户

         8bit校验和
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW.PLCJS.COM——可编程控制器技术门户

其工作模式为:用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
WWcW_PLCJS_COM-PLC-技.术_网

W1WW_P4LCJS_COM-PLC-技.术_网

单片机读取数据的一般思路就是,延时一定的时间,去读Data数据线的电平是高是低,从而判断数据是0还是1。不过这样做,对延时精度要求很高,否则很容易把起始位当成数据位来判断了。
WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW.PLCJS.COM——可编程控制器技术门户

但是在STM32系统,由于存在多任务和中断程序,如果用传统的延时方法,是很难满足多任务下数据读取需求的,所以我最直接的思路还是,通过时钟的输入捕获功能,获取Data数据线上所有上升沿和下降沿的精确时间,有了这个数据,就可以非常精确的判断出数字0和数字1了。
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PL※CJS_COM-PLC-技.术_网

设置时钟的代码如下:
WWW_P※LCJS_COM-PLC-)技.术_网

W1WW_P4LCJS_COM-PLC-技.术_网

//72M/(71 1)=1M   1us一次滴答     
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WWW_PLC※JS_COM-PmLC-技.术_网

CPU_TIMER_Initialize(timer,0xFFFF,71,TIMER_ISR,NULL);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

plcjs.技.术_网

STM32F10x_TIMER &tim=STM32F10x::TIMER(timer);
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

//TIM3_CH3
——可——编——程——控-制-器-技——术——门——户

WWW_P※LCJS_CO※M-PLC-技-.术_网

tim.CCMR[1] = 0x01 | 0x30;      //输入模式,滤波为映射到TI3
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

tim.CCER = 0x0200;              //下降沿有效
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

tim.DIER = 0x0008;               //中断
WWW_PLCJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

//tim.CCER |= 0x0100;           //捕获使能
WWW_PLCJS_COM-PLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

//TIM3_CH4
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

tim.CCMR[1] |= 0x0200 | 0x3000; //输入模式,滤波为8   映射到TI3
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

tim.CCER |= 0x0000;             //上升沿有效
P.L.C.技.术.网——可编程控制器技术门户

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

tim.DIER |= 0x0010;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

//tim.CCER |= 0x1000;           //捕获使能
WWcW_PLCJS_COM-PLC-技.术_网

——可——编——程——控-制-器-技——术——门——户

 
WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

中断TIMER_ISR函数里,记下中断发生时刻的计数器的值,根据这些值,就可以换算为实际的温湿度数据了,相关代码如下:
WW.W_PLCJS_COM-PLC-技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

STM32F10x_TIMER &tim=STM32F10x::TIMER(timer);       
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

——可——编——程——控-制-器-技——术——门——户

 time_index = 0;
WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PLCJS_COM-PLC-技.术_网

 HT_Flag = FALSE;
P.L.C.技.术.网——可编程控制器技术门户

WWW_PLCJS_COM-PLC-技.术_网

 tim.CCER |= 0x0100;        //捕获使能
W1WW_P4LCJS_COM-PLC-技.术_网

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 tim.CCER |= 0x1000;        //捕获使能
WWcW_PLCJS_COM-PLC-技.术_网

WWcW_PLCJS_COM-PLC-技.术_网

 Sleep(10000);              //延时 10ms 最长 80 80 40*(50 70) = 4960us = 4.96ms
P.L.C.技.术.网——可编程控制器技术门户

WWW_P※LCJS_COM-PLC-)技.术_网

 tim.CCER &= ~0x0100;       //捕获禁止
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 tim.CCER &= ~0x1000;       //捕获禁止
WWW_PLCJS_COM-PLC-技.术_网

WW.W_PLCJS_COM-PLC-技.术_网

 tim.CR1 = 0x0;              //禁止计数 
WWW_PLCJS_COM-PLC-技.术_网

P.L.C.技.术.网——可编程控制器技术门户

 if(time_index>8)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW.PLCJS.COM——可编程控制器技术门户

 {
——可——编——程——控-制-器-技——术——门——户

WWW_P※LCJS_COM-PLC-)技.术_网

     UINT32 index=0;
P.L.C.技.术.网——可编程控制器技术门户

W1WW_P4LCJS_COM-PLC-技.术_网

          UINT32 data[128];
WWW_PLC※JS_COM-PmLC-技.术_网

WW.W_PLCJS_COM-PLC-技.术_网

          
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

     for(int i=4;i<time_index;i =2)
plcjs.技.术_网

W1WW_P4LCJS_COM-PLC-技.术_网

     {
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWcW_PLCJS_COM-PLC-技.术_网

        time_data[index ]=time_data[i];
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW_P※LCJS_CO※M-PLC-技-.术_网

     }
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

    
WW.W_PLCJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

     if(index==40)

本新闻共2页,当前在第11 2  
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行