STM32驱动-DHT11(温湿度模块)
一、DHT11模块简介
DHT11是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准,校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
二、DHT11引脚介绍
DHT11通常有三个引脚或四个引脚,但第四个引脚(NC)是保留引脚,通常不用。主要引脚包括:
- VCC:电源引脚,供电电压范围为3.3V~5.5V。
- DATA:数据输入输出引脚,用于与微控制器进行通信。
- GND:电源地引脚。
三、DHT11的工作原理
DHT11使用单总线数据格式,即使用一根数据线(DATA引脚)进行数据的发送和接收。传感器与微控制器之间的通信遵循DHT协议,该协议规定了数据传输的时序和数据格式。微控制器通过发送起始信号给DHT11,DHT11在接收到正确的起始信号后,会发送一个响应信号,并随后发送包含温湿度数据的40位数据包。这40位数据包由8位湿度整数数据、8位湿度小数数据、8位温度整数数据、8位温度小数数据和8位校验数据组成。
四、DHT11的使用注意事项
- 测量精度:DHT11的湿度测量精度范围为20%90%RH(相对湿度),温度测量精度范围为0°C50°C。但需要注意的是,DHT11的精度可能会受到环境因素的影响,如温度变化、湿度变化、气流等。因此,在使用DHT11进行测量时,应该尽量选择稳定的环境条件,以提高测量的准确度。
- 通信协议:DHT11与微控制器之间的通信需要严格遵循DHT协议,包括起始信号的发送、响应信号的接收以及数据包的解析等。
- 电源要求:DHT11的供电电压范围为3.3V~5.5V,因此在使用时需要确保电源电压在此范围内。
代码示例
void Dht11_OutputInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOG, &GPIO_InitStructure);
//引脚空闲高电平
GPIO_SetBits(GPIOG,GPIO_Pin_9);
}
void Dht11_InputInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
void Dht11_Config(void)
{
Dht11_OutputInit();
}
void start_dht11(void)
{
//1.配置引脚为输出模式
Dht11_OutputInit();
//2.把引脚电平拉低并持续20ms
GPIO_ResetBits(GPIOG,GPIO_Pin_9);
delay_ms(20);
//3.把引脚电平拉高并持续30us
GPIO_SetBits(GPIOG,GPIO_Pin_9);
delay_us(30);
}
bool dht11_ack(void)
{
int cnt=0;
Dht11_InputInit();
while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 && cnt < 80)
{
delay_us(1);
cnt++;
}
if(cnt >= 80)
return false;
cnt = 0;
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9)==0 && cnt < 80)
{
cnt++;
delay_us(1);
}
if(cnt>=80){
return false;
}
else{
return true;
}
}
uint8_t get_bit(void)
{
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9)==1);
while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9)==0);
delay_us(40);
if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9)==1)
{
return 1;
}
else{
return 0;
}
}
uint8_t get_byte(void)
{
uint8_t data=0;
for(int i=0;i<8;i++)
{
data<<=1;
data|=get_bit();
}
return data;
}
bool get_dht11_data(uint8_t data_buf[5])
{
start_dht11();
if(true ==dht11_ack())
{
for(int i=0;i<5;i++)
{
data_buf[i]=get_byte();
}
if( data_buf[4] == data_buf[0] + data_buf[1] + data_buf[2] + data_buf[3] )
{
return true;
}
else
return false;
}
}
综上所述,STM32的DHT11实际上是指STM32微控制器与DHT11温湿度传感器模块配合使用的情况。通过合理的硬件连接和软件开发,STM32可以轻松地读取DHT11传感器测量的温湿度数据,并将其用于各种应用场景中。
标签:Pin,引脚,温湿度,STM32,InitStructure,GPIOG,GPIO,DHT11 From: https://www.cnblogs.com/zkbklink/p/18299412