欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > LVGL+FreeRTOS实战项目:智能健康助手(dht11篇)

LVGL+FreeRTOS实战项目:智能健康助手(dht11篇)

2025/4/18 23:47:00 来源:https://blog.csdn.net/m0_74676415/article/details/145210493  浏览:    关键词:LVGL+FreeRTOS实战项目:智能健康助手(dht11篇)

DHT11 温湿度传感器简介

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

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

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

硬件连接

DHT11 引脚功能STM32 连接
VCC电源输入 (+3.3V)3.3V
GNDGND
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; //拉低电平至少18usdelay_ms(20);dht11_high; //拉高电平20~40usdelay_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~28usdata <<= 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拉低总线 50usdelay_us(55); //这里延时55usdht11_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的源文件里面已经写好了,我们只需要直接调用即可。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词