资讯详情

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

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


文章目录


前言

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


一、接口说明

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

1 接线图

2 电源引脚

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

3 串行接口(单线双向)

DATA 用于微处理器和 DHT11之间的通信和同步采用单总线数据格式,一次通信时间4ms数据分为小数部分和整数部分。具体格式如下所示。当前的小数部分用于未来的扩展,现在读出为零.操作流程如下:

二、通信过程

(1)如下图所示,用户MCU发送一次开始信号后,DHT从低功耗模式到高速模式,等待主机开始信号结束,DHT11发送响应信号40bit用户可以选择读取部分数据,触发信号采集。 从模式下,DHT如果没有接收到主机发送的开始信号,11接收到开始信号触发温湿度采集,DHT11不主动采集温湿度。收集数据后转换为低速模式。

(2)如下图所示,总线空闲状态为高电平,主机拉下总线等待DHT11响应时,主机必须拉下总线超过18毫秒,以确保DHT起始信号可以检测到。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℃,除非有特殊标记

四、使用注意事项

1 工作和储存条件

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

2 暴露在化学物质中

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

3 恢复处理

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

4 温度影响

气体的相对湿度在很大程度上取决于温度。因此,在测量湿度时,湿度传感器应尽可能在同一温度下工作。如果印刷电路板与释放热量的电子元件共用,应尽可能安装DHT远离电子元件,安装在热源下,同时保持外壳通风良好。为了减少热传导,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)

读取数据将数据存入数组,这里仅保留了温度数据的整数位,注意数据较验方法,

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版本驱动函数的编写

标签: 温湿度传感器lcd传感器屏蔽线四线气体传感器采样电路热量计传感器5660传感器复位推挽式传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台