stm32驱动DHT11温湿度模块使用方法和问题小结

2019-08-14来源: eefocus关键字:stm32驱动  DHT11  温湿度模块

最近在总结做过的几个项目,今天小结一下DHT11模块的使用。

对DHT11的使用,就是编写时序和stm32进行通信。

DHT11和stm32是通过一根线进行通信的,双方通过这根线上的电平变化来识别各种信号。

DHT11每次传输数据会输出40bit的数据,即5个字节,它们的含义如下:

在这里插入图片描述

每一位bit是0还是1是通过高电平的持续时间来判断的,如下两张图所示,‘0’和

‘1’都是先持续50us的低电平,而后持续一段时间高电平,‘0’的高电平会持续26-28us,‘1’的电平会持续70us,因此你在判断每位数据是’0’还是’1’时,有两种方法,一种是看持续时间,显然高电平持续时间超过28us的就是’1’;另一种方法是选取一个时间点,比如在高电平开始40us后如果仍然是高电平,那就是‘1’,我用的第二种方式,因为即使是在40us后来检查电平,对数据是’0’的情况也很好判断,因为下一位数据’0’的持续时间是50us。

在这里插入图片描述在这里插入图片描述

代码的话我贴几个比较重要的

stm32发出的开始信号,使引脚从高电平变为低电平,低电平持续20ms后再拉高电平,高电平持续40us等待DHT11发个响应信号,注意此时引脚应设为输入模式。


//主机拉低20ms

int retry=0;

set_out_high();

delay_ms(5);

set_out_low();

delay_ms(20);

set_in_high();

delay_us(40);


等待拉低代码如下,在编写时序时要检测到电平的变化可以使用下面的方法,使用while循环去检测,可以加上一个延时超时时间,我加的是100us,如果超过100us没有拉低就出错返回。


while(((GPIOB->IDR & (1<<0))==1) && retry <100)//等待拉低

{

delay_us(1);

retry++;

}

if(retry>= 100)

{

printf("time out1rn");

retry=0;

return ;

}else{

retry = 0;

}


等待拉高如下,功能同等待拉低相似


while(((GPIOB->IDR & (1<<0))==0) && retry <100)//等待拉高

{

delay_us(1);

retry++;

}

if(retry>= 100)

{

printf("time out2rn");

retry = 0;

return ;

}else{

retry = 0;

}


读取一个字节


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

{

while(((GPIOB->IDR & (1<<0))==0) && retry <100)//等待拉高

{

delay_us(1);

retry++;

}

if(retry>= 100)

{

printf("time out4rn");

retry = 0;

return ;

}else{

retry = 0;

}

delay_us(40);

if((GPIOB->IDR & (1<<0))==0)

{

h1->humi_int &= ~(1<<(7-j));

}else{

h1->humi_int |= 1<<(7-j);

while(((GPIOB->IDR & (1<<0))==1) && retry <100)//等待拉低

{

delay_us(1);

retry++;

}

if(retry>= 100)

{

printf("time out5rn");

retry = 0;

return ;

}else{

retry = 0;

}

}

}


判断’0’还是’1’的逻辑代码上面已经说了,可以结合代码看一看。

校验和的话,我没有使用,因为数据还是狠准确地。


在实际应用时遇到个问题,我是采用循环读的,如下


while(1)

{

    //清除之前的数据

h1.humi_dec=0;

h1.humi_int=0;

h1.ture_dec=0;

h1.ture_int=0;

//得到数据

humiture_get(&h1);

//打印数据

printf("humi:%d.%drn",h1.humi_int,h1.humi_dec);

printf("ture:%d.%drn",h1.ture_int,h1.ture_dec);

}  


结果每次开发板复位后只有第一次能成功读取,之后每次读取都会在发出开始信号阶段就超时返回。一开始以为是时序的问题,但由于最开始可以成功读出一次数据,表明时序是可以正常工作的,之后根据数据手册的时序图又检查了一遍,发现没有写结束信号,时序图中的结束信号是由主机主动拉高的,因此我加上了主动拉高的代码,并延时500ms,但问题依旧没有解决,最后我重头到尾看了一遍数据手册发现了这个

在这里插入图片描述

发现了左下角的注:采样周期间隔不得低于1秒钟。

所以我在数据采样结束后主动拉高电平并延时1.5秒,成功解决问题!


关键字:stm32驱动  DHT11  温湿度模块

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471069.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
下一篇:STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32驱动超声波模块

;           //使能中断NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM6,DISABLE);}//定时器6中断服务程序u32 msHcCount = 0;void TIM6_IRQHandler(void)   //TIM6中断{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM6, TIM_IT_Update);       
发表于 2019-08-19

ADIS16203角度传感器的stm32驱动实现要点

特征。ADIS16203提供下列嵌入式特性,无需外部电路,并提供简化的系统接口:可配置报警功能辅助12位模数转换器(ADC)辅助12位数模转换器(DAC)可配置数字I/O端口数字自测功能二、怎样从datasheet里面提取与驱动编写有关的信息1.spi的通讯速率从时序规格表可知该芯片的spi通讯速率最快是2.5MHz,普通模式是1MHz。2.SPI的极性和相位从时序图可知该芯片的相位CPHA=1(时钟空闲时高电平),极性CPOL=1(上升沿采样)3.CS片选信号由上图可知CS是低电平有效。4.spi一个数据帧的位数由图可知一个数据帧是16位的。5.spi发送数据位的顺序由图可知是先发高位(MSB)6.spi的读写控制由图可知控制
发表于 2019-08-14
ADIS16203角度传感器的stm32驱动实现要点

STM32驱动LCD12864显示屏

我们做一个电子产品,往往需要实现人机交互的功能。那么人机交互的方式除了输出到上位机通过电脑去显示,显示器也是一个很不错的方式,可用于一些不能使用电脑的场合。LCD12864显示器中的一种,具有价格低廉,操作简单的优点。今天就为大家带来一个STM32驱动12864的例程,使用SPI串行通信,仅仅需要三根数据线就可以完成通信。废话不多说,进入正题。接线:         RS----PB15RW----PB14EN----PB13PSB---GND1.初始化IO口以及显示屏void Lcd_Init(void) {    
发表于 2019-07-30

详细介绍STM32驱动程序库STM32F1xx_DFP中的文件含义及其作用

嵌入式应用程序的开发可以基于微控制器厂商提供的驱动程序库,也可以针对外设寄存器直接编写驱动程序。使用厂商提供的驱动程序库进行开发,简单、快捷,兼容性好,便于移植,但代码略多;直接针对寄存器编程进行开发(建议利用头文件stm32f10x.h定义的寄存器结构和位定义),费时耗力,但能够深入理解原理,代码简洁高效。所以,建议初学者从驱动程序库入手,逐渐深入到寄存器编程。MDK-ARM开发工具本身已经包含了STM32固件库,并可以通过软件包安装程序进行更新。STM32F1xxx_DFP.2.0.0的驱动程序主要在如下目录中:F:Keil_v5ARMPackKeilSTM32F1xx_DFP2.0.0Device,包含了开发所必须的基本代码
发表于 2019-07-30
详细介绍STM32驱动程序库STM32F1xx_DFP中的文件含义及其作用

STM32 之四 标准外设版 USB 驱动 + MSC(Host) + Fatfs 移植

写在前面现在,网上关于STM32的USB的文章数不胜数。写这篇文章仅仅是对于自我学习的一个记录。主要是对实际学习中遇到的一些棘手问题做个备忘录。使用的芯片为STM32F407VG 。目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library,最新版为2.2.0;一套为针对其Cube系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy libraryUSB驱动。更详细的请参考博文STM32 之 USB IP(USB模块) 详解。HAL库 + Legacy library USB库两个混用目前
发表于 2019-07-29
STM32 之四 标准外设版 USB 驱动 + MSC(Host) + Fatfs 移植

STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

1、DHT11和DHT21传感器    这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com)。    DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。    DHT21(AM2301)湿敏电容数字温湿度模块是一款含有己校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性
发表于 2019-08-15
STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved