STM32温湿度传感器(DHT11) +OLED+蜂鸣器 实战项目(含代码)

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

今天的学习内容是在昨天的dht11基础上,添加一个蜂鸣器模块。蜂鸣器模块则是一个非常实用的扩展,可以用来实现简单的报警功能。

1、硬件准备


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

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

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

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

蜂鸣器:一个简单的有源蜂鸣器模块,用于实现报警功能。

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

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

硬件连接

DHT11与STM32的连接

DHT11的连接非常简单,它只需要一个GPIO引脚与STM32相连。以下是具体的连接方式:

  • VCC:连接到STM32的3.3V电源。

  • GND:连接到STM32的地。

  • DATA:连接到STM32的一个GPIO引脚。

OLED显示屏与STM32的连接

OLED显示屏通过I2C接口与STM32相连,具体连接如下:

  • VCC:连接到STM32的3.3V电源。

  • GND:连接到STM32的地。

  • SCL:连接到STM32的I2C时钟线引脚。

  • SDA:连接到STM32的I2C数据线引脚。

蜂鸣器与STM32的连接

蜂鸣器模块的连接也非常简单:

  • VCC:连接到STM32的3.3V电源。

  • GND:连接到STM32的地。

  • 信号引脚:连接到STM32的一个GPIO引脚,用于控制蜂鸣器的开关。

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();				//更新显示,清屏,防止初始化后未显示内容时花屏
}

蜂鸣器初始化

void mfq_Init(void)	
{
	GPIO_InitTypeDef  GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
}

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

	 int main(void)
{
     uint32_t bufe[5];
	 OLED_Init();
    mfq_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、成果展示

四、总结

通过这次学习,我不仅成功地将蜂鸣器模块集成到了之前的温湿度监测系统中,还实现了简单的报警功能。这个过程不仅让我对STM32的GPIO控制有了更深入的理解,还让我学会了如何将多个硬件模块协同工作。希望我的分享能够帮助到同样在学习这条路上摸索的你。如果你有任何问题或者更好的建议,欢迎随时交流,让我们一起在嵌入式开发的道路上不断进步!


希望这篇文章对你有帮助!如果有任何需要调整或补充的地方,请随时告诉我。

(需要代码的私)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值