玩转传感器——dht11温湿度传感器(stm32版)(代码片段)

灵卯 灵卯     2023-03-11     608

关键词:

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


文章目录


前言

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


一、接口说明

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

1 接线图


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接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

(2)如下图所示,总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。

(3)如上图所示,总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据。

(4)如下图所示每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如下图所示:

数字1信号表示方法如下图所示:

数字0信号与数字1信号的不同之处在于高电平的时间不同,利用这点,我么们可以通过设置电平时间阈值来判断信号的种类。

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

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

VDD=5V,T = 25℃,除非特殊标注

注:最新版厂家升级,采样周期为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

1.2 复位DHT11

复位DHT11就是发送DHT11起始信号,告诉传感器通讯开始。

1.3 检查DHT11是否正常

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

1.4 DHT11初始化

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

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

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

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

循环读入一个字节的数据,并将每一步新加入的数据放置在最低位。

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

读取数据将数据存入数组,这里仅保留了温度数据的整数位,注意数据较验方法,校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位

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端口输入时,配置为上拉输入或者浮空输入,因为外接上拉电阻,所以默认为高电平
//有负信号输入,GPIO端口为1,当GPIO端口为1且retry小于100,retry自加,否则跳出循环执行下一步
	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发来高电平信号,GPIO端口为0,当GPIO端口为0且retry小于100,retry自加,否则跳出循环执行下一步
    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版本驱动函数的编写

stm32读取温湿度传感器dht11和dht21(am2301)系列问题(代码片段)

1、DHT11和DHT21传感器  这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com)。  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采... 查看详情

12-开发板接入小五物联实现远程控制(stm32采集温湿度传感器dht11)(代码片段)

采集DHT11温湿度数据,使用stm32f103zet6的GPIOG11引脚读取SHT11数据,通过串口打印采集的温湿度 dht11.c文件:#include"dht11.h"#include"delay.h"//复位DHT11voidDHT11_Rst(void)DHT11_IO_OUT();//SETOUTPUTDHT11_DQ_OUT=0;//拉低DQdelay_ms(20);/ 查看详情

stm32实例——基于stm32开发板实现传感数据采集-dht11温湿度采集(代码片段)

...集一、前言本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等。本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板进行项目开发。传感器将采集到的数据传... 查看详情

《嵌入式-stm32开发指南》第三部分外设篇-第1章温湿度传感器dht11(代码片段)

1.1理论分析1.1.1DHT11介绍DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。DHT11传感器包括一个... 查看详情

温湿度传感器(代码片段)

温湿度传感器硬件使用STM32F103RCT6DHT11(温湿度传感器)软件使用keil5MDK环境串口调试助手实现说明​根据DHT11温湿度传感器手册1.初始化DHT11复位DHT11,根据时序图写出设置```voiddht_Rst(void) dht_output();//设置dht11为普通推挽输出 dh... 查看详情

stm32-dht11温湿度传感器寄存器版本

参考技术A#include<stm32f4xx.h>#include"DHT11.h"#include"TIM6.h"/*函数功能:GPIO输出配置函数参数:返回值:说  明:PC0-DATA*/voidDHT11_OUT1()//时钟使能RCC->AHB1ENR|=(1<<2);//设置GPIO工作模式GPIOC->MODER&=~(3<<0);G... 查看详情

micropythonesp32读取dht11温湿度传感器数据(代码片段)

MicroPythonESP32读取DHT11温湿度传感器数据DHT11温湿度传感器接线说明ESP32-----DHT113.3V-----VCCGND-----GNDGPIO22-----DOUT本示例基于Thonny平台开发所引入的模块,如果没有按照,可以通过pipinstallxxxx命令在命令提示窗中进行安装,或... 查看详情

arduioesp32将dht11温湿度传感器数据在网页上显示(代码片段)

ArduioESP32将DHT11温湿度传感器数据在网页上显示串口监视数据和网页数据同步显示温湿度传感器ESP32开发板接线说明DHT11----ESP8266Data-----D7(gpio13)-- 查看详情

2.3.1传感器模块之dht11

2.3.1传感器模块之DHT111、产品概述2、应用领域3、特性4、电气特性5、淘宝购买(自己选择)6、DHT11原理图7、DHT11使用说明--串行接口(单线双向)8、封装信息9、51单片机代码10、DHT11--STM32F103C8T6代码10.1main10.2dht11.c10.3dht11.hDHT11是一款... 查看详情

基于stm32温湿度传感器采集报警系统设计(含超声波测距)(代码片段)

...计主要是通过读取DHT11和HCSR04的数值,(Proteus的传感器貌似这两款好用一点)把读取的DHT11和HCSR04数值通过转化在lcd1602中显示出来,还有就是可以设置通过按键设置DHT11的温湿度阈值。仿真原理图如下运行结果图&#... 查看详情

micropythonesp32读取dht11温湿度传感器数据+0.96“i2coled显示(代码片段)

【MicroPythonesp32】读取DHT11温湿度传感器数据+0.96“I2Coled显示✨本示例基于Thonny平台开发。相关篇《【MicroPythonRP2040】读取DHT11温湿度传感器数据+0.96“I2Coled显示》-📖ESP32dev引脚功能图🎄DHT11传感器🎄ssd1306I2C0.96... 查看详情

esp32-idf开发实例-传感器模块编程-dht11温度湿度传感器

DHT11温度湿度传感器ESP32是一系列高度集成的、专为移动设备、可穿戴电子产品设计的物联网模块,其集成了天线开关、RFbalun、功率放大器、低接收噪声放大器,滤波器、电源管理模块等,可以独立运行应用,也可以通过SPI/SDIO... 查看详情

esp3214.dht11湿度传感器实验(dht操作库)

上一篇:【ESP32】13.DS18B20温度传感器实验(OneWire和DallasTemperature库)前言:先放电路连接图:DHT11是一款已校准数字信号输出的温湿度传感器,湿度精度为+-5%RH,温度精度为+-2℃。量程的话湿度为20~90%RH,温度为0~50℃。和上一篇... 查看详情

esp3214.dht11湿度传感器实验(dht操作库)

上一篇:【ESP32】13.DS18B20温度传感器实验(OneWire和DallasTemperature库)前言:先放电路连接图:DHT11是一款已校准数字信号输出的温湿度传感器,湿度精度为+-5%RH,温度精度为+-2℃。量程的话湿度为20~90%RH,温度为0~50℃。和上一篇... 查看详情

stm32stm32f407+dht11(代码片段)

...DK一、DHT11简介DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程湿度5~95%RH,温度-20~+60℃。——来自百度百科测量范围:湿度5~95%RH,温度-20~+60℃测量精度:湿度±5... 查看详情

stm32stm32f407+dht11(代码片段)

...DK一、DHT11简介DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程湿度5~95%RH,温度-20~+60℃。——来自百度百科测量范围:湿度5~95%RH,温度-20~+60℃测量精度:湿度±5... 查看详情

stm32f103ve基于标准库下dht11数据串口打印输出(代码片段)

...1数据串口打印输出📜串口数据打印🌿DHT11温湿度传感器🔖本程序兼容极海APM32f103vc🛠引脚定义说明DHT11data引脚----->PB7🎉引脚可以根据需求任意切换。📝主程序代码🔰工程模版采用的是正点原子的... 查看详情

stm32f103使用dht11采集温湿度通过软件i2c驱动oled显示(代码片段)

一.温湿度传感器介绍1.主要参数供电电压:3.3-5.5V直流电输出为单总线数字信号温度测量范围0-50度(精度正负2度,分辨率1度)湿度测量范围为20-90%RH(精度为正负5%,分辨率1%)2.硬件连接模块的VCC接单... 查看详情