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.把引脚电平拉低并持续20msGPIO_ResetBits(GPIOG,GPIO_Pin_9);delay_ms(20);//3.把引脚电平拉高并持续30usGPIO_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;}elsereturn false; }
}
综上所述,STM32的DHT11实际上是指STM32微控制器与DHT11温湿度传感器模块配合使用的情况。通过合理的硬件连接和软件开发,STM32可以轻松地读取DHT11传感器测量的温湿度数据,并将其用于各种应用场景中。