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

发布者:sclibin最新更新时间: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  温湿度模块 引用地址:stm32驱动DHT11温湿度模块使用方法和问题小结

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

推荐阅读最新更新时间:2024-11-09 16:21

STM32驱动语音模块播报实时时间
前几天有个学生在用一个语音模块,遇到了点困难,为了方便调试,自己也买了两个一起玩了一下。 今天就来简单分享一下这个模块。 模块概述 DY-SV17F 语音模块,包括IO 分段触发,UART 串口控制, ONE_line 单总线控制,标准 MP3 等 7 种工作模式; 板载 5W D 类功放,可直接驱动 4Ω, 3~5W 喇叭; 支持 MP3,WAV 解码格式; 板载4MBte flash 存储,可通过 USB 数据线连接模块上的MicroUSB接口,电脑可以将模块识别为一个U盘,打开此存储更新音频文件即可。 工作模式配置 硬件连接 原理图 为了测试方便,各位也可以画一个PCB板,这样就可以避免使用一堆杜邦线进
[单片机]
STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103C8T6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) 温度传感器: DS1820 DS18B20是一个数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取; DS18B20内置了64位产品序列号,方便识别身份,在一根线上可以挂接多个DS18B20传感器,通过64位身份验证,可以分别读取来至不同传感器采集的温度信息。 二、DS18B20介绍 2.1 DS18B20 的主要特征 1. 全数字温度转换及输出。 2. 先进的单总线数据通信。 3. 最高 12 位
[单片机]
<font color='red'>STM32</font>入门开发: 编写DS18B20温度传感器<font color='red'>驱动</font>(读取环境温度、支持级联)
STM32通过硬件SPI模块软件模拟驱动来进行拓展
FSMC一般只有STM32大容量产品才具备。因此在使用中小容量产品外接存储器时,一般会通过硬件SPI模块软件模拟驱动来进行拓展。 本文将以常见的 NOR Flash(多个厂家有对标的同类产品)为例。 我使用的是普亚的P25Q32SH,这个flash除了贵和多一些功能外,在基本控制方面和华邦的W25Q32差不多,基本指令通用。但不同flash之间还是存在一些差异,要注意适配。 一、封装 8引脚的spi Flash除了封装方式有些差异,引脚排列基本是一模一样的。 代码: 总的来说还是很简单的。因为时间比较赶,只求能用,存在代码冗余和效率较低的问题,欢迎改进指正! 复制 //*****************
[单片机]
<font color='red'>STM32</font>通过硬件SPI<font color='red'>模块</font>软件模拟<font color='red'>驱动</font>来进行拓展
用48脚的STM32驱动16位并口TFT彩屏
TFT屏的接口有SPI,8080/6800并口,RGB,MIPI等许多种,用在单片机上的一般就是前两种。SPI的好处是简单,只需要连接六七条线,缺点是速度太慢了。SPI的最高时钟频率一般是单片机主频二分频,16位彩色时写一个像素需要33~34个时钟周期(传16位数据32个周期,协议消耗增加一两个周期),分辨率低了还好,320*240的屏刷全屏需要24.6万时钟周期,48M主频时就是51ms左右,已经有点嫌慢了。好在SPI可以用DMA方式异步写屏,CPU占用率低一些。 8080并口就快多了,一般用FSMC+DMA来驱动,实测最快时平均每个像素只需要12.6个时钟周期,也可以异步写屏,但是得用100脚或者144脚的STM32才有F
[单片机]
STM32单片机的FSMC对TFT的驱动
一、FSMC之我见 开始只是谈到别人对FSMC的理解,注意这里只讨论FSMC控制TFT,也就是在FSMC的NORPSRAM模式控制LCD,所以我们以下的分析都是基于这种模式的。 1、我们之前通过使用GPIO来模拟8080/6800时序从而达到驱动彩屏的,同样需要明白的一点就是我们也只是使用FSMC来模拟8080/6800时序,只不过这个读写速度有些快(使用了总线嘛),仅此而已! 简单一点就是:8080是通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作。 6800是通过“总使能(E)”和“读写选择(W/R)”两条控制线进行 2、那么了解到FSMC的三总线如下! 数据线:这个可以分为8位的和16位,这个不难
[单片机]
<font color='red'>STM32</font>单片机的FSMC对TFT的<font color='red'>驱动</font>
stm32六步法驱动bldc的步骤
STM32系列微控制器可以通过外部驱动电路实现BLDC(无刷直流电机)的六步法驱动。以下是基本的步骤和配置方法: 1. 硬件连接:将BLDC电机连接到STM32微控制器的外部驱动电路,通常包括功率驱动芯片和相关电路。确保正确连接三个电机线圈和电源。 2. 配置GPIO引脚:使用STM32的GPIO模块配置相应的引脚,用于控制外部驱动器的使能、PWM信号输出以及电机相序的切换。 3. 配置定时器:使用STM32的定时器模块来生成PWM波形。根据BLDC电机的要求,配置一个或多个定时器和通道来产生相应的PWM信号,以控制电机的速度和方向。 4. 编写驱动程序:根据BLDC电机的控制算法,编写一个驱动程序来控制GPIO引脚的状态和定时器
[单片机]
STM32+DHT11 读取温湿度数据显示
一、环境介绍 MCU: STM32F103C8T6 温湿度模块: DHT11 开发软件: Keil5 二、DHT11 介绍 DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。 每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口, 使
[单片机]
STM32单片机学习笔记(2):DHT11温湿度传感器
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。 硬件模块 STM32F103R4 DHT11 LCD1602 74HC373 软件工具 CubMX Proteus KEIL 电路连接图 STM32F103R4 DHT11 LCD1602 工作流程 首先还是先利用CubMX创建一个KEIL工程设置PA0位DHT11的数据口,这里之所以选用PA0,主要是有些版本的Prot
[单片机]
<font color='red'>STM32</font>单片机学习笔记(2):<font color='red'>DHT11</font><font color='red'>温湿度</font>传感器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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