基于STM32的火灾报警设备(阿里云平台)

目录

前言:

一、项目介绍和演示视频

二、硬件需求准备

三、硬件框图

[1. 原理图](#1. 原理图)

[2. PCB](#2. PCB)

四、CubeMX配置

五、代码框架


前言:

源代码下载链接:

需要实物的可以私信博主或者在文章最下方添加好友。

一、项目介绍和演示视频

项目实物图:

项目演示视频:

基于STM32的火灾报警系统(阿里云平台)

二、硬件需求准备

  • STM32F103C8T6最小系统板
  • 0.96寸OLED屏幕
  • ESP88266-01s
  • DHT11温湿度模块
  • 火焰模块
  • 蜂鸣器
  • MQ2烟雾传感器
  • LED灯

三、硬件框图

1. 原理图

2. PCB

四、CubeMX配置

1、RCC配置外部高速晶振------HSE

2、SYS配置:Debug设置成Serial Wire

3、I2C配置:

4、串口配置:

****​5、TIM配置(开启中断):

6、ADC配置:

7、GPIO口配置(蜂鸣器、LED、火焰传感器) :

8、时钟树配置:

最后我们生成工程即可。

五、代码框架

主体代码循环界面:

变量作用说明: 看懂变量的作用是看懂代码的第一步:(代码中可能还有其他变量,那是后面便于增加项目功能的代码,有了它们就可以更便捷添加)

cpp 复制代码
uint8_t datas[5];//空气温湿度数据 数组23为温度整数小数  数组01为湿度整数小数
extern unsigned int Beep_Slow;//蜂鸣器减速,定时器使用,得以控制蜂鸣器响的频率
extern int Beep_flag;//蜂鸣器开关标志位------着火了1,没着火0
extern unsigned char Beep_data;//蜂鸣器GPIO 1-开  0-关

unsigned char Flame_flag = 0;//1-显示字体   0-不显示字体   实现字体闪烁现象
unsigned int Flame_Slow = 0;//定时器使用,字体闪烁频率实现

初始先连接热点,然后连接阿里云平台:

cpp 复制代码
u8g2_t u8g2;//定义一个U8g2结构类型变量
	
  u8g2Init(&u8g2);//初始化屏幕
  //清屏
  u8g2_ClearBuffer(&u8g2);
  u8g2_SendBuffer(&u8g2);
	
  HAL_TIM_Base_Start_IT(&htim3);//开启定时器3中断
  HAL_UART_Receive_IT(&huart1, &buf, 1);//开启串口中断
	

	
  HAL_UART_Transmit(&huart1, "Hello\r\n", strlen("Hello]\r\n"),0xffff);
	
  Home_Draw(&u8g2);//显示开机页面
	
  Wifi_Connect();//WIFI连接
  u8g2DrawTest(&u8g2);//开机动画
  u8g2_ClearBuffer(&u8g2);
  u8g2_SendBuffer(&u8g2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Home_Menu(u8g2);//循环界面(循环判断,刷新页面)
		
	}

全部初始化好外设后,封装函数显示到屏幕上

cpp 复制代码
//主页显示界面
void Home_Menu(u8g2_t u8g2)
{
	uint32_t Air = 0;
	
	while(1)//当前为第0菜单
	{
		
		
		Air = MQ2_data(u8g2, 0,  32, u8g2_font_ncenB10_tr);//打印MQ2模块的烟雾ADC转换数据
		Printf_DHT11(u8g2, 0,  0, u8g2_font_ncenB10_tr);//打印DHT11模块的温湿度数据
		u8g2_SendBuffer(&u8g2);
		u8g2_ClearBuffer(&u8g2);//刷新屏幕
		
		//火灾警报灯
		Beep();//处理蜂鸣器是否开关标志位
		if(Beep_flag == 1)//着火
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET);//开灯
		}
		else
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET);//关灯
		}
		//是否开启蜂鸣器
		if(Beep_data == 1)
		{
			if(Alarm_flag == 1)  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);
		}
		else if(Beep_data == 0)
		{
			if(Alarm_flag == 1)  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET);
		}
		
		
		if(Data_Slow > 1500 && Data_Slow < 1800 && Beep_flag == 0)  //数据上传减速后发送数据
		{
			aliyun_Data_flag = 1;//允许上传数据
			aliyun_Data(datas[2], datas[0], Air);
			
		}
		else if(Data_Slow > 1500 && Data_Slow < 1800 && Beep_flag == 1 && aliyun_Data_flag == 1)//着火了发送99℃
		{

			aliyun_Data_Beeping(99,  0,  99);//允许发送数据,上传99
			
			aliyun_Data_flag = 0;//发送一次后停止发送

		}
		
		
	}
	
}

MQ2模块封装函数内部:

cpp 复制代码
int MQ2_data(u8g2_t u8g2,u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font)
{
	int value;
	
	char var_buff[100];
	char var_buff1[100];
	

	HAL_ADC_Start(&hadc1); //启动ADC单次转换
	HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC转换完成
	value = HAL_ADC_GetValue(&hadc1); //读取ADC转换数据
	
	
	u8g2_DrawXBMP(&u8g2, x, y, 16, 16, kong);//显示字体
	u8g2_DrawXBMP(&u8g2, x+16, y, 16, 16, qi);
	u8g2_DrawXBMP(&u8g2, x+32, y, 16, 16, zhi);
	u8g2_DrawXBMP(&u8g2, x+48, y, 16, 16, liang);
	
	u8g2_DrawXBMP(&u8g2, x, y+16, 16, 16, huo);
	u8g2_DrawXBMP(&u8g2, x+16, y+16, 16, 16, yan);
	
	sprintf(var_buff, ": %dppm",value);  //显示ADC转换数据
	sprintf(var_buff1, ": ");
	u8g2_SetFont(&u8g2, font);
	u8g2_DrawStr(&u8g2, x+64, y+16, var_buff);
  u8g2_DrawStr(&u8g2, x+32, y+32, var_buff1);
	
  if(Beep_flag == 0)//显示火焰正常
  {
		u8g2_DrawXBMP(&u8g2, x+40, y+16, 16, 16, zheng);
	   u8g2_DrawXBMP(&u8g2, x+56, y+16, 16, 16, chang);
  }
  else if(Beep_flag == 1)//着火,闪烁火焰不正常
  {
		if(Flame_flag == 0)//闪烁字体
		{
			
		}
		else if(Flame_flag == 1)
		{
			u8g2_DrawXBMP(&u8g2, x+40, y+16, 16, 16, bu);
			u8g2_DrawXBMP(&u8g2, x+56, y+16, 16, 16, zheng);
			u8g2_DrawXBMP(&u8g2, x+72, y+16, 16, 16, chang);
		}
		
  }

  
	return value;
}

DHT11封装函数内部:

cpp 复制代码
void Printf_DHT11(u8g2_t u8g2,u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font)
{
	char var_buf[100];
	char var_buf1[100];
	
	Read_Data_From_DHT();//读取温湿度数据
	
	u8g2_DrawXBMP(&u8g2, x, y, 16, 16, kong);
	u8g2_DrawXBMP(&u8g2, x+16, y, 16, 16, qi);
	u8g2_DrawXBMP(&u8g2, x+32, y, 16, 16, wen);
	u8g2_DrawXBMP(&u8g2, x+48, y, 16, 16, du);
	u8g2_DrawXBMP(&u8g2, x, y+16, 16, 16, kong);
	u8g2_DrawXBMP(&u8g2, x+16, y+16, 16, 16, qi);
	u8g2_DrawXBMP(&u8g2, x+32, y+16, 16, 16, shi);
	u8g2_DrawXBMP(&u8g2, x+48, y+16, 16, 16, du);
	
//	sprintf(var_buf , ": %d.%d C",datas[2],datas[3]);//显示小数
	sprintf(var_buf , ": %d C",datas[2]);
	sprintf(var_buf1, ": %d.%d %%",datas[0],datas[1]);//不显示小数
	u8g2_SetFont(&u8g2, font);//设置字体
	u8g2_DrawStr(&u8g2, x+64, y+16, var_buf);
  u8g2_DrawStr(&u8g2, x+64, y+32, var_buf1);
}

定时器减速,闪烁字体,滴答滴答蜂鸣器:

cpp 复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   //中断回调函数
{
	if(htim == (&htim3))//定时器3中断
	{
		Data_Slow++;//阿里云数据上传减速
		if(Data_Slow == 2000)  Data_Slow = 0;

		Working_Pro();
	
	}
}

void Working_Pro()
{
	Key_Slow++;
	if(Key_Slow == 10)  Key_Slow = 0;//按键消抖
	
	if(Beep_flag == 1)//蜂鸣器开  着火了
	{
		Beep_Slow ++;
		Flame_Slow ++;
		
		if(Flame_Slow == 500)//火焰状态显示
		{
			Flame_Slow = 0;//复位
			Flame_flag ^= 1;//取反
		}
		
		if(Beep_Slow < 200 && Beep_data == 0)
		{
			Beep_data = 1;//开
		}
		else if(Beep_Slow >= 200 && Beep_Slow < 400 && Beep_data == 1)
		{
			Beep_data = 0;
		}
		else if(Beep_Slow >= 400 && Beep_Slow < 600 && Beep_data == 0)
		{
			Beep_data = 1;
		}
		else if(Beep_Slow >= 600 && Beep_Slow < 1200 && Beep_data == 1)
		{
			Beep_data = 0;
		}
		else if(Beep_Slow == 1200 && Beep_data == 0)
		{
			Beep_Slow = 0;//复位
		}

	}
	else if(Beep_flag == 0)//蜂鸣器关
	{
		Beep_Slow = 0;
		Beep_data = 0;//关
	}
}

👇🏻 需要实物 添加 博主👇🏻

相关推荐
坏柠2 小时前
STM32与HAL库开发实战:深入探索ESP8266的多种工作模式
stm32·单片机·嵌入式硬件
Amy.com3 小时前
嵌入式2-按键
stm32·单片机·嵌入式硬件
printf_014 小时前
HAL库STM32常用外设—— CAN通信(一)
stm32·单片机·嵌入式硬件
小麦嵌入式4 小时前
Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!)
linux·驱动开发·stm32·嵌入式硬件·mcu·qt·ubuntu
代码总长两年半5 小时前
STM32---FreeRTOS事件标志组
stm32·单片机·嵌入式硬件
螺丝工人5 小时前
stm32 L432KC(mbed)入门第一课
stm32·单片机·嵌入式硬件
最爱是生活8 小时前
STM32之I2C硬件外设
stm32·单片机·嵌入式硬件
大牛攻城狮1 天前
使用DeepSeek完成一个简单嵌入式开发
stm32·ai·嵌入式·流水灯·deepseek·ai替代码农
加油JIAX1 天前
CT117E-M4 CubeMX与Keil5 MDK-ARM基础配置
arm开发·stm32·蓝桥杯·嵌入式