DHT11 温湿度传感器简介

  • 功能:用于测量环境温度和湿度,输出数字信号。

  • 接口:单总线协议(需要软件模拟时序)。

  • 应用:广泛用于家庭自动化、环境监测等领域。

硬件连接

DHT11 引脚 功能 STM32 连接
VCC 电源输入 (+3.3V) 3.3V
GND GND
DATA 数据线 PC13

软件部分

DHT11 使用单总线通信协议,通过主机控制数据线高低电平时序与 DHT11 交互,实现温湿度数据读取。

#include "dth11.h"
#include "delay.h"

	
void DH11_GPIO_Init_IN()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd (dht11_GPIO_CLK, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/
    RTC_TamperCmd(RTC_Tamper_1, DISABLE);
	// 配置 GPIO 引脚模式为输入
	GPIO_InitStructure.GPIO_Pin = dht11_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
	GPIO_Init(dht11_GPIO_PORT, &GPIO_InitStructure);
	PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/
}

void DH11_GPIO_Init_OUT() 
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd (dht11_GPIO_CLK, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/
    RTC_TamperCmd(RTC_Tamper_1, DISABLE);
	GPIO_InitStructure.GPIO_Pin = dht11_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  
	GPIO_Init(dht11_GPIO_PORT, &GPIO_InitStructure);
	PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/
}

//主机发送开始信号
void DHT11_Start(void)
{
	DH11_GPIO_Init_OUT(); //输出模式
	
	dht11_high; //先拉高
	delay_us(30);
	
	dht11_low; //拉低电平至少18us
	delay_ms(20);
	
	dht11_high; //拉高电平20~40us
	delay_us(30);
	
	DH11_GPIO_Init_IN(); //输入模式
}


//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
	
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( Read_Data == 0); //从1bit开始,低电平变高电平,等待低电平结束
		delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移
		
		if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( Read_Data == 1 ); //高电平变低电平,等待高电平结束
	}
	return data;
}

//获取数据
void DHT11_REC_Data(unsigned int data[])
{
	//数据
	unsigned int rec_data[4];
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
	char buf[20];
	
	DHT11_Start(); //主机发送信号
	dht11_high; //拉高电平
	
	if( Read_Data == 0 ) //判断DHT11是否响应
	{
		while( Read_Data == 0); //低电平变高电平,等待低电平结束
		while( Read_Data == 1); //高电平变低电平,等待高电平结束
		
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
		
		dht11_low; //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		delay_us(55); //这里延时55us
		dht11_high; //随后总线由上拉电阻拉高进入空闲状态。
		
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	rec_data[0] = RH;
	rec_data[1] = RL;
	rec_data[2] = TH;
	rec_data[3] = TL;
	
	if(rec_data[2] && rec_data[0])
	{
		data[0] = rec_data[0];
		data[1] = rec_data[1];
		data[2]= rec_data[2];
		data[3] = rec_data[3];
//		sprintf(buf, "Temp = %d", rec_data[2]);
//		Gui_DrawFont_GBK16(20,30,BLUE,GRAY0, buf);
//		memset(buf, 0, sizeof(buf));
//		sprintf(buf, "Humi = %d", rec_data[0]);
//		Gui_DrawFont_GBK16(20,80,BLUE,GRAY0, buf);
//		memset(buf, 0, sizeof(buf));	
		
		//LCD_Show_Info(0, 0, &lv_font_montserrat_24, lv_color_hex(0x000000), "temp:%d", rec_data[2]);
		//LCD_Show_Info(0, 80, &lv_font_montserrat_24, lv_color_hex(0x000000), "humi:%d", rec_data[0]);
	}
}

 这个非常的简单,相信大家都心领神会了。

获取DHT11传感器值  

我们在获取传感器任务里面进行获取,我们先不用关注FreeRTOS,我们先去关注一下如何获取传感器数值。

void DHT11_REC_Data(unsigned int data[]) 

我们在dht11的源文件里面已经写好了,我们只需要直接调用即可。 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐