STM32驱动-DHT11(温湿度模块)

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传感器测量的温湿度数据,并将其用于各种应用场景中。

posted @ 2024-07-12 21:26  琨为玉也  阅读(49)  评论(0编辑  收藏  举报