首页 > 其他分享 >STM32驱动-DHT11(温湿度模块)

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

时间:2024-07-12 21:30:22浏览次数:14  
标签:Pin 引脚 温湿度 STM32 InitStructure GPIOG GPIO 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传感器测量的温湿度数据,并将其用于各种应用场景中。

标签:Pin,引脚,温湿度,STM32,InitStructure,GPIOG,GPIO,DHT11
From: https://www.cnblogs.com/zkbklink/p/18299412

相关文章

  • stm32 HAL库 笔记 定时器(1) 中断实验
    单片机中的定时器主要用于控制时间,比如延时、定时等等。而计数器则主要用于统计事件或脉冲信号的数量。通过控制定时器和计数器的中断、清零等操作,我们可以完成各种复杂的定时、计数等操作,实现更加智能化的控制系统。单片机的定时器一般由计数器、预分频器、中断控制器、基准......
  • 软件spi ST7789屏幕驱动stm32
    #include"st7789.h"voidST7789_GPIO_Init(void){ GPIO_InitTypeDefGPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull=GPIO_PULLUP; GPIO_InitStru......
  • stm32 EC11编码器
    #include"encoder.h"//A线作为时钟线,B线作为信号线//*******************************************************************///功能:初始化EC11旋转编码器相关参数//返回:无//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化//************......
  • STM32常用函数整理
    STM32常用函数整理标准库使用的API用的都是**char***数据类型1./清空缓冲区/memset((char*)uart2RxBuff,0,UART2RXBUFF_SIZE);把uart2RxBuff中长度为UART2RXBUFF_SIZE的字符都写为02.拷贝memcpy(数组1,数组2,len);把数组2的len长度的数据拷贝到数组1中数组1......
  • STM32的SPI接口详解
    目录1.SPI简介2.SPI工作原理3.SPI时序3.1CPOL(ClockPolarity,时钟极性):3.2CPHA(ClockPhase,时钟相位):3.3 四种工作模式4.相关代码4.1使能片选信号4.2使能通讯线4.3初始化SPI4.4设置SPI速度4.5读写数据1.SPI简介STM32的SPI(SerialPeripheralInterface)是一个......
  • STM32中断(NVIC和EXIT)
    CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。而常用的就是这60个......
  • stm32f429iDisc AD规则组多通道+DMA转运
    扫描模式+非连续触发uint16_tAdc_Value[5]={0};DMA_InitTypeDefDMA_InitStructure;voidAD_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph......
  • stm32f429i-Disc PWM生成 + 输入捕获测频率与占空比
    产生PWMvoidMy_PWM_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStru......
  • 零基础STM32单片机编程入门(十三) 红外避障传感器模块实战含源码
    文章目录一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图三.STM32单片机红外避障模块检测实验四.CubeMX工程源代码下载五.小结一.概要红外避障模块具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测遇到障碍物时,红外线反射回来......
  • cubemx+hal stm32 atgm336h GPS 北斗 定位 模块 驱动代码
    usart2.cgps的串口2设置voidMX_USART2_UART_Init(void){/*USERCODEBEGINUSART2_Init0*//*USERCODEENDUSART2_Init0*//*USERCODEBEGINUSART2_Init1*//*USERCODEENDUSART2_Init1*/huart2.Instance=USART2;huart2.Init.BaudR......