#创作灵感  #STM32 #温湿度传感器 #dht11 #OLED  

今天是将具体成果录制成视频分享给大家~

STM32+温湿度传感器+0.96寸OLED

(视频也可以移步到视频栏观看)

1、硬件准备
在开始之前,我们需要准备以下硬件组件:

STM32开发板:我选择的是STM32F103C8T6,它具有强大的处理能力和丰富的外设接口,非常适合此类项目。

DHT11温湿度传感器:这是一个常用的数字温湿度传感器,能够同时测量温度和湿度,价格低廉且易于使用。

OLED显示屏:我使用的是0.96英寸的I2C接口OLED显示屏,它具有高对比度和低功耗的特点,非常适合用于显示温湿度数据。

面包板和杜邦线:用于连接各个硬件组件。

电源:为整个系统提供稳定的电源。

2、软件设计
开发环境搭建
我使用的是Keil uVision 5开发环境,它提供了完善的代码编辑、编译和调试功能。在开始编程之前,确保你已经安装了STM32的标准外设库,这将大大简化硬件操作的编程复杂度。

DHT11温湿度传感器驱动程序
初始化
首先,我们需要初始化STM32的GPIO引脚,将其配置为输入/输出模式,以适配DHT11的单总线通信方式。

u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PG端口时钟
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PG11端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
 	GPIO_SetBits(GPIOA,GPIO_Pin_11);						 //PG11 输出高
			     
	DHT11_Rst();  //复位DHT11
	return DHT11_Check();//等待DHT11的回应
} 
数据读取

接下来,我们需要编写代码来读取DHT11发送的温湿度数据。DHT11在接收到启动信号后,会通过单总线发送40位数据。

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}
显示屏初始化

接下来,我们需要初始化OLED显示屏,设置其显示模式、对比度等参数。

void OLED_Init(void)
{
	OLED_GPIO_Init();			//先调用底层的端口初始化
	
	/*写入一系列的命令,对OLED进行初始化配置*/
	OLED_WriteCommand(0xAE);	//设置显示开启/关闭,0xAE关闭,0xAF开启
	
	OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率
	OLED_WriteCommand(0x80);	//0x00~0xFF
	
	OLED_WriteCommand(0xA8);	//设置多路复用率
	OLED_WriteCommand(0x3F);	//0x0E~0x3F
	
	OLED_WriteCommand(0xD3);	//设置显示偏移
	OLED_WriteCommand(0x00);	//0x00~0x7F
	
	OLED_WriteCommand(0x40);	//设置显示开始行,0x40~0x7F
	
	OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常,0xA0左右反置
	
	OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常,0xC0上下反置
 
	OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
	OLED_WriteCommand(0x12);
	
	OLED_WriteCommand(0x81);	//设置对比度
	OLED_WriteCommand(0xCF);	//0x00~0xFF
 
	OLED_WriteCommand(0xD9);	//设置预充电周期
	OLED_WriteCommand(0xF1);
 
	OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别
	OLED_WriteCommand(0x30);
 
	OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭
 
	OLED_WriteCommand(0xA6);	//设置正常/反色显示,0xA6正常,0xA7反色
 
	OLED_WriteCommand(0x8D);	//设置充电泵
	OLED_WriteCommand(0x14);
 
	OLED_WriteCommand(0xAF);	//开启显示
	
	OLED_Clear();				//清空显存数组
	OLED_Update();				//更新显示,清屏,防止初始化后未显示内容时花屏
}

主程序

在主程序中,我们首先进行硬件初始化,然后进入主循环,定时采集温湿度数据并显示在OLED屏幕上。

	 int main(void)
{
     uint32_t bufe[5];
	 OLED_Init();
	 DHT11_Init();
    OLED_ShowChinese(0, 0, "温度:");
	OLED_ShowChinese(94, 0, "℃");
	OLED_ShowChinese(0, 16, "湿度:");
	OLED_ShowString(94,16,"RH",OLED_8X16);
	OLED_Update();
 
	while(1)
	{
		
		DHT11_Read_Data(&temp,&humi);
	  bufe[0]=temp;
		bufe[1]=humi;
	
		
		OLED_ShowNum(47,0,bufe[0],2,OLED_8X16);
		OLED_ShowNum(47,16,bufe[1],2,OLED_8X16);
		OLED_Update();
		fmq(temp,humi);
 
		 printf("temp=%d  , humi=%d RH\r\n",temp,humi);
 
	}
}

3、成果展示

4、总结与展望
         通过这次对STM32和DHT11温湿度传感器的学习,我不仅成功搭建了一个简单的温湿度监测系统,还对嵌入式开发有了更深入的理解。这个过程虽然遇到了一些挑战,但每一次的调试和优化都让我收获满满。希望我的分享能够帮助到同样在学习这条路上摸索的你。如果你有任何问题或者更好的建议,欢迎随时交流,让我们一起在嵌入式开发的道路上不断进步!

(有需要代码的私 )

Logo

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

更多推荐