【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)-阿里云开发者社区

开发者社区> 技术小美> 正文

【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)

简介:
+关注继续查看

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

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

不过直到三个多月之后的今天,才有时间和精力去研究相关内容。闲言少叙,先看一下DHT11的典型应用电路(见下图)。

 

通信接口为串行接口(单线双向),通信过程如下:

 

数字0和数字1的信号表示方法如下(有点类似红外遥控器的编码了):

 

一次完整的数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据

+8bi温度整数数据+8bit温度小数数据

         +8bit校验和

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

详细资料请从如下地址下载:http://download.csdn.net/source/2535109

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

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

设置时钟的代码如下:

//72M/(71+1)=1M   1us一次滴答     

CPU_TIMER_Initialize(timer,0xFFFF,71,TIMER_ISR,NULL);

STM32F10x_TIMER &tim=STM32F10x::TIMER(timer);

//TIM3_CH3

tim.CCMR[1] = 0x01 | 0x30;      //输入模式,滤波为映射到TI3

tim.CCER = 0x0200;              //下降沿有效

tim.DIER = 0x0008;               //中断

//tim.CCER |= 0x0100;           //捕获使能

//TIM3_CH4

tim.CCMR[1] |= 0x0200 | 0x3000; //输入模式,滤波为8   映射到TI3

tim.CCER |= 0x0000;             //上升沿有效

tim.DIER |= 0x0010;

//tim.CCER |= 0x1000;           //捕获使能

 

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

STM32F10x_TIMER &tim=STM32F10x::TIMER(timer);       

 time_index = 0;

 HT_Flag = FALSE;

 tim.CCER |= 0x0100;        //捕获使能

 tim.CCER |= 0x1000;        //捕获使能

 Sleep(10000);              //延时 10ms 最长 80+80+40*(50+70) = 4960us = 4.96ms

 tim.CCER &= ~0x0100;       //捕获禁止

 tim.CCER &= ~0x1000;       //捕获禁止

 tim.CR1 = 0x0;              //禁止计数 

 if(time_index>8)

 {

     UINT32 index=0;

          UINT32 data[128];

          

     for(int i=4;i<time_index;i+=2)

     {

        time_data[index++]=time_data[i];

     }

    

     if(index==40)

     {

        for(int i=0;i<5;i++)

        {

           HT_data[i]=0;

           for(int j=0;j<8;j++)

           {

              HT_data[i]|= time_data[i*8+j] > 40 ? (1 <<(7-j)) :0;

           }

        }

                  HT_Flag = (((HT_data[0]+HT_data[1]+HT_data[2]+HT_data[3]) & 0xFF) == HT_data[4]);

     }    

}

接线图和运行后的结果如下图所示,可以看出温湿度已经源源不断的被读出来了。

 

以上程序还是底层C/C++的代码,需要封装成托管类库才能供上层应用程序调用,不过这次我的思路和以前不同,不是简单的封装成一个读取接口就成了,我想这部分应用,更具有通用性,在《红外遥控器编码识别》中我们用到方式,其实很笨,并且很容易受到干扰,完全可以采用这种方式,这样做甚至直接就可以识别出相应的编码信息来。

所以,我打算专门写一篇这种接口封装的博文,以期应用开发的朋友,也可以开发出这种对时序要求严格的应用来。

 

MF快速参考: .NET Micro Framework 快速入门

MF中文讨论组:http://space.cnblogs.com/group/MFSoft/

微软官方论坛:MSDN微软中文技术论坛(.NET Micro Framework)

开发板简明手册:http://blog.sina.com.cn/s/blog_6b938f630100kh0k.html

【低价开发板】http://item.taobao.com/item.htm?id=7117999726







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/417824,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《ASP.NET 开发从入门到精通》----1.4 ASP.NET基础
ASP是微软公司推出的一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,指动态服务器页面(Active Server Pages,ASP)运行于IIS之中的程序。在2000年第二季度时,微软公司正式推动.NET策略,ASP也顺理成章地改名为ASP.NET。
2618 0
基于ASP.Net Core开发的一套通用后台框架
基于ASP.Net Core开发的一套通用后台框架写在前面这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过。如果您有发现错误,请告知我,我会第一时间修改。知其然,知其所以然,并非重复的造轮子。
18086 0
独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据集成学习方面的问题。
1536 0
用智能墨水打造超灵敏传感器 “写”到哪里感知就到哪里
据悉,海法以色列理工的人员开发出了一种能够识别并区分不同刺激的传感系统。该系统基于折纸艺术,结合了以色列理工开发的智能墨水材料。 “当前,对于特定目的的多用途传感系统存在巨大需求,”Haick说,“这些系统在医学、食品、环境监测、物联网等领域具有巨大的应用潜力。
2120 0
3-51单片机ESP8266学习-AT指令(开发板8266底层源码介绍)
上一篇链接  http://www.cnblogs.com/yangfengwu/p/8743502.html 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内部的,方便后期更新功能 看第一部分的源码 亲们可以直接把下面的第一部分(注意只下载第一部分就行)的程...
2195 0
《ASP.NET 开发从入门到精通》----1.2 Web技术简介
学习Web开发,不得不提到本地计算机和远程服务器的概念。顾名思义,本地计算机是指用户正在使用的、浏览站点页面的机器。对于本地计算机来说,最重要的构成模块是Web浏览器。
1289 0
索尼发布全球首款具有AI处理功能的智能视觉传感器
支持高速边缘人工智能(AI)处理,构建链接云服务的最佳视觉系统
742 0
【STM32 .Net MF开发板学习-27】GPRS通信实现
GPRS和以往连续在频道传输的方式不同,是以封包(Packet)式来传输。我们基于.NET Micro Framework 4.1平台,开发了YFSoft.Hardware.GPRS库,通过该库,用户简单调用相关接口,就可以实现GPRS通信。
691 0
+关注
4567
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载