玩转传感器——DHT11温湿度传感器(STM32版)

这篇具有很好参考价值的文章主要介绍了玩转传感器——DHT11温湿度传感器(STM32版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

玩转传感器——DHT11温湿度传感器(STM32版)



前言

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
dht11初始化,玩转硬件,stm32,单片机,物联网


一、接口说明

建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。

1 接线图

dht11初始化,玩转硬件,stm32,单片机,物联网
dht11初始化,玩转硬件,stm32,单片机,物联网

2 电源引脚

DHT11的供电电压为3~5.5 V。传感器上电后,要等待 1s 以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

3 串行接口(单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:

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

(2)数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和

(3)数据传送正确时,校验和数据等于
“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位

二、通信过程

(1)如下图所示,用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。
dht11初始化,玩转硬件,stm32,单片机,物联网
从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

(2)如下图所示,总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
dht11初始化,玩转硬件,stm32,单片机,物联网
(3)如上图所示,总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据。

(4)如下图所示每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如下图所示:
dht11初始化,玩转硬件,stm32,单片机,物联网
数字1信号表示方法如下图所示:
dht11初始化,玩转硬件,stm32,单片机,物联网
数字0信号与数字1信号的不同之处在于高电平的时间不同,利用这点,我么们可以通过设置电平时间阈值来判断信号的种类。

三、测量分辨率与电气特性

测量分辨率分别为 8bit(温度)、8bit(湿度)。

VDD=5V,T = 25℃,除非特殊标注
dht11初始化,玩转硬件,stm32,单片机,物联网
注:最新版厂家升级,采样周期为2秒,老版为1秒。

四、使用注意事项

1 工作与贮存条件

超出建议的工作范围可能导致高达3%RH的临时性漂移信号。返回正常工作条后,传感器会缓慢地向校准状态恢复。要加速恢复进程/可参阅6.3小节的“恢复处理”。在非正常工作条件下长时间使用会加速产品的老化过程。

2 暴露在化学物质中

电阻式湿度传感器的感应层会受到化学蒸汽的干扰,化学物质在感应层中的扩散可能导致测量值漂移和灵敏度下降。在一个纯净的环境中,污染物质会缓慢地释放出去。下文所述的恢复处理将加速实现这一过程。高浓度的化学污染会导致传感器感应层的彻底损坏。

3 恢复处理

置于极限工作条件下或化学蒸汽中的传感器,通过如下处理程序,可使其恢复到校准时的状态。在50-60℃和< 10%RH的湿度条件下保持2 小时(烘干);随后在20-30℃和>70%RH的湿度条件下保持 5小时以上。

4 温度影响

气体的相对湿度,在很大程度上依赖于温度。因此在测量湿度时,应尽可能保证湿度传感器在同一温度下工作。如果与释放热量的电子元件共用一个印刷线路板,在安装时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持外壳的良好通风。为降低热传导,DHT11与印刷电路板其它部分的铜镀层应尽可能最小,并在两者之间留出一道缝隙。

5 光线

长时间暴露在太阳光下或强烈的紫外线辐射中,会使性能降低。

6 配线注意事项

DATA信号线材质量会影响通讯距离和通讯质量,推荐使用高质量屏蔽线。

五、DHT11驱动程序

1 DHT11.c

1.1 配置输入输出GPIO

dht11初始化,玩转硬件,stm32,单片机,物联网

1.2 复位DHT11

复位DHT11就是发送DHT11起始信号,告诉传感器通讯开始。
dht11初始化,玩转硬件,stm32,单片机,物联网
dht11初始化,玩转硬件,stm32,单片机,物联网

1.3 检查DHT11是否正常

检查DHT11是否正常,正常的话会在单片机发送起始信号完成后,传感器返回80us低电平,然后发送80us高电平。即证明DHT11工作正常,该函数工作正常返回0,否则返回1,该函数中利用了while循环检测在一定时间内的电平变化,此类用法在后面也会经常用到。
dht11初始化,玩转硬件,stm32,单片机,物联网
dht11初始化,玩转硬件,stm32,单片机,物联网

1.4 DHT11初始化

在上电后,对IO端口初始化,和检查DHT11状态。需要特别指出的是,在上电后到对DHT11初始化前应有1s的稳定期,等待传感器稳定。可以在单片机上电后采用1s延时处理。
dht11初始化,玩转硬件,stm32,单片机,物联网

1.5 读取一位数据(返回值0/1)

该函数采用两个while循环是等待每个周期的电平变化,先等待低电平到来,后等待高电平到来,延时40us后判断引脚电平,来判断该位数据为1或0。之所以是40微秒是因为传感器数字0的信号持续时间为26-28us,数字1的信号持续时间为70us,选择一个中值来区分两种信号,当然也可以选择其他值,但最好在40us附近,在while循环中选择循环100次也就是100us,是因为防止当单片机由于某些原因迟迟收不到传感器电平信号,造成死机。
dht11初始化,玩转硬件,stm32,单片机,物联网
dht11初始化,玩转硬件,stm32,单片机,物联网

1.6 读取一个字节(返回值:读到的数据)

循环读入一个字节的数据,并将每一步新加入的数据放置在最低位。
dht11初始化,玩转硬件,stm32,单片机,物联网

1.7 读取DHT11数据(读取成功返回0,失败返回1)

读取数据将数据存入数组,这里仅保留了温度数据的整数位,注意数据较验方法,校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位
dht11初始化,玩转硬件,stm32,单片机,物联网

1.8 完成版.c文件

#include "stm32f10x.h"                  // Device header
#include "DHT11.h"
#include "Delay.h"

void DHT11_IO_OUT (void){ //温湿度模块输出函数
	
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}

void DHT11_IO_IN (void){ //温湿度模块输入函数
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入      
	GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}

void DHT11_RST (void){ 						//DHT11端口复位,发出起始信号(IO发送)
	DHT11_IO_OUT();							//端口为输出
	GPIO_ResetBits(DHT11_PORT,DHT11_IO); 	//使总线为低电平
	Delay_ms(20); 							//拉低至少18ms						
	GPIO_SetBits(DHT11_PORT,DHT11_IO); 		//使总线为高电平							
	Delay_us(30); 							//主机拉高20~40us
}

u8 DHT11_Check(void){ 	//等待DHT11回应,返回1:未检测到DHT11,返回0:成功(IO接收)	   
    u8 retry=0;			//定义临时变量
    DHT11_IO_IN();		//IO到输入状态	 
//GPIO端口输入时,配置为上拉输入或者浮空输入,因为外接上拉电阻,所以默认为高电平
//如果DHT11的数据线输入为高电平,且 retry 小于100,则将 retry 加1,并延时1微秒,重复这个过程直到 retry 大于等于100 或者DHT11的数据线输入变成低电平。如果 retry 大于等于100,表示检测失败,返回1;否则,将 retry 重置为0。
	while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry<100)	//DHT11会拉低40~80us
	{
		retry++;
        Delay_us(1);
    }
    if(retry>=100)return 1; 	
	else retry=0;
//如果DHT11的数据线输入为低电平,且 retry 小于100,则将 retry 加1,并延时1微秒,重复这个过程直到 retry 大于等于100 或者DHT11的数据线输入变成高电平。如果 retry 大于等于100,表示检测失败,返回1;否则,返回0,表示检测成功。
    while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry<100)  //DHT11拉低后会再次拉高40~80us
	{  
        retry++;
        Delay_us(1);
    }
    if(retry>=100)return 1;	    
    return 0;
}

u8 DHT11_Init (void){	//DHT11初始化
	RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);	//开始DHT11的时钟
	DHT11_RST();								//DHT11端口复位,发出起始信号
	return DHT11_Check(); 						//等待DHT11回应
}

//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
    u8 retry = 0;
    while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry < 100) //等待变为低电平
    {
        retry++;
        Delay_us(1);
    }
    retry = 0;
    while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry < 100) //等待变高电平
    {
        retry++;
        Delay_us(1);
    }
    Delay_us(40);//等待40us
    if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1)       //用于判断高低电平,即数据1或0
        return 1;
    else
        return 0;
}

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
    u8 i, dat;
    dat = 0;
    for (i = 0; i < 8; i++)
    {
        dat <<= 1;					//左移运算符,dat左移1位
        dat |= DHT11_Read_Bit();	//"|"表示按位或等于
    }
    return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp, u8 *humi)
{
    u8 buf[5];
    u8 i;
    DHT11_RST();						//DHT11端口复位,发出起始信号
    if(DHT11_Check() == 0)				//等待DHT11回应,0为成功回应
    {
        for(i = 0; i < 5; i++) 			//读取40位数据
        {
            buf[i] = DHT11_Read_Byte();	//读出数据
        }
        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])	//数据校验
        {
            *humi = buf[0];				//将湿度值放入指针humi
            *temp = buf[2];				//将温度值放入指针temp
        }
    }
    else return 1;
    return 0;
}


2 DHT11.h

定义了以下几个函数和IO口宏定义,标注了各自的功能。
dht11初始化,玩转硬件,stm32,单片机,物联网


总结

本文介绍DHT11温湿度传感器,及STM32版本驱动函数的编写文章来源地址https://www.toymoban.com/news/detail-778149.html

到了这里,关于玩转传感器——DHT11温湿度传感器(STM32版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32+DHT11温湿度传感器

    STM32+DHT11温湿度传感器

    DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据

    2023年04月13日
    浏览(38)
  • STM32--DHT11温湿度传感器

    STM32--DHT11温湿度传感器

    本文介绍基于STM32F103实现的DHT11温湿度传感器数据采集及显示,完整代码见文末链接 一、DHT11传感器简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期

    2024年02月16日
    浏览(39)
  • STM32—DHT11温湿度传感器

    STM32—DHT11温湿度传感器

    (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3).首先图二部分是单片机向DHT11发送我要开始的信号,此时单片机IO口处于输出模式,输出低电平至少18MS,

    2024年02月19日
    浏览(39)
  • FPGA—DHT11数字温湿度传感器

    FPGA—DHT11数字温湿度传感器

    目录 1. 理论学习 2.实操 2.1 顶层模块 2.1.1 整体模块框图 2.1.2 顶层代码 2.2 DHT11 控制模块 2.2.1 模块框图 2.2.2 状态转换图绘制 2.2.3 波形图绘制 2.2.4 RTL代码 2.3 上板验证 3. 总结 DHT11简介        DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应

    2024年02月06日
    浏览(198)
  • FPGA读取DHT11数字温湿度传感器

    FPGA读取DHT11数字温湿度传感器

    最近在做一个DHT11相关的东西,写了一个DHT11控制模块。参考了正点原子和野火电子的文档资料后总觉得又乱又杂,所以自己跟着数据手册写了一遍,当然了也很感谢正点原子和野火文档的帮助。 DHT11是一种数字温湿度传感器,有4个引脚但只有三个有效引脚,分别是VDD,DATA和

    2024年02月05日
    浏览(39)
  • 51单片机(DHT11温湿度传感器)

    51单片机(DHT11温湿度传感器)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制 相对湿度和温度测量 全部校准,数字输出 长期稳定性 超长的信号传输距离:20米 超低能耗:休眠 4 引脚

    2024年02月02日
    浏览(38)
  • stm32读取DHT11温湿度传感器

    stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(35)
  • stm32连接DHT11温湿度传感器

    stm32连接DHT11温湿度传感器

    目录 1. DHT11简介 1.1. 连接电路  1.2. 串行接口 (单线双向)  2. cubeMX设置 3. 代码开发  3.1. 实现定时函数 3.2. 打开串口调试 3.4. 测试代码实现 4. 运行效果 信息如下: 建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使 用合适的上拉电阻  DHT11的供电电压为 3-5

    2023年04月16日
    浏览(39)
  • DHT11温湿度传感器(配合树莓派使用)

    DHT11温湿度传感器(配合树莓派使用)

    DHT11是一种数字温湿度传感器,可以测量周围环境的温度和相对湿度。该传感器使用单个数字信号线与微控制器通信,具有较高的可靠性和稳定性。它适用于许多应用领域,如气象观测、室内环境监测、工业控制等。 DHT11传感器使用的基本原理是通过感应元件测量周围环境的

    2024年02月06日
    浏览(14)
  • FPGA project : dht11 温湿度传感器

    FPGA project : dht11 温湿度传感器

    没有硬件,过几天上板测试。        其他模块都是之前的,就不发了。    

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包