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

news2025/3/19 19:38:30

目录

前言:

一、项目介绍和演示视频

二、硬件需求准备

三、硬件框图

1. 原理图

2. PCB

四、CubeMX配置

五、代码框架


前言:

源代码下载链接:

  • https://download.csdn.net/download/m0_74712453/90474701

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

一、项目介绍和演示视频

项目实物图:

项目演示视频:

基于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、时钟树配置:

最后我们生成工程即可。

五、代码框架

主体代码循环界面:

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

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;//定时器使用,字体闪烁频率实现

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

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);//循环界面(循环判断,刷新页面)
		
	}

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

//主页显示界面
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模块封装函数内部: 

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封装函数内部:

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);
}

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

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;//关
	}
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA-流水灯

Quartus中使用Verilog实现 根据之前所学内容&#xff0c;打开Quartus 软件&#xff0c;新建FPGA项目文件&#xff0c;建立好空项目过后&#xff0c;选择Verilog HDL File&#xff0c;因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客&#xff1a; FPGA 实验报告&a…

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为&#xff1a; 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…

什么是YApi?开源接口管理平台部署教程

YApi 到底是个啥&#xff1f; 各位小伙伴们好呀&#xff01;今天要给大家介绍的是一款超级好用的接口管理神器——YApi&#xff01;它是一个高效、易用、功能强大的 API 管理平台&#xff0c;简直就是开发、产品、测试人员的福音啊&#xff01;&#xff01;&#xff01;它能帮…

深入理解事务

在数据库管理中&#xff0c;事务是一个至关重要的概念。无论是金融交易、库存管理还是用户数据更新&#xff0c;事务都确保了数据的完整性和一致性。本文将详细介绍为什么需要事务、什么是事务、事务的四大特征、如何在MySQL中使用事务以及MyBatis对事务的配置。 一、为什么需…

基于SpringBoot + Vue 的药店药品信息管理系统

基于SpringBootVue的药品药店药房信息系统(带文档) 角色: 用户&#xff0c;管理员&#xff0c;员工 功能: 管理员: 首页、个人中心、用户管理、员工管理、药品类别管理、药品信息管理、药品入库管理、药品出库管理、在线咨询管理、留言板管理、系统管理、订单管理。 用户:…

ubuntu下TFTP服务器搭建

tftp 命令的作用和 nfs 命令一样&#xff0c;都是用于通过网络下载东西到 DRAM 中&#xff0c;只是 tftp 命令 使用的 TFTP 协议&#xff0c; Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器&#xff0c; 需要安装 tftp-hpa 和 tftpd-hpa&#xff0c;命令…

解决:ModuleNotFoundError: No module named ‘_sqlite3‘

报错&#xff1a; from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下&#xff0c;重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…

技术债务的隐患:何时重构,何时妥协?

在快节奏的软件开发环境中&#xff0c;企业为了抢占市场或满足紧迫需求&#xff0c;往往不得不在短期内采取“捷径”来加速产品交付&#xff0c;这便引入了“技术债务”。短期内看似能迅速交付&#xff0c;但随着时间推移&#xff0c;这些未优化的代码和架构缺陷会逐渐累积&…

c#Winform也可以跨平台了GTK框架GTKSystem.Windows.Forms

一、简介 >> 新版下载&#xff0c;问题求助 QQ群&#xff1a;1011147488 1032313876 236066073&#xff08;满&#xff09; Visual Studio原生开发&#xff0c;无需学习&#xff0c;一次编译&#xff0c;跨平台运行. C#桌面应用程序跨平台&#xff08;windows、linux、…

ABAP PDF预览

画个屏幕 PDF JPG TXT都可以参考预览&#xff0c;把二进制流传递给标准函数就行 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *&am…

网络爬虫【爬虫库urllib】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库&#xff0c;无须安装&#xff0c;直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包&#xff0c;大致具备以下功能。 ● urlli…

卷积神经网络 - 卷积层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习卷积层。 卷积层&#xff08;Convolutional Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的核心组件&#xff0c;专门用于处理具有网格结构的数据&#xff08;如图像、音频、时间序…

玩转 Tailwind CSS:深入解析函数与指令

玩转 Tailwind CSS&#xff1a;深入解析函数与指令 如果你正在使用 Tailwind CSS&#xff0c;可能已经习惯了各种 text-center、mt-4 这样的类名&#xff0c;但你知道吗&#xff1f;Tailwind 其实还隐藏着一套 强大的函数与指令系统&#xff0c;可以让你的代码更加优雅、可维护…

Axure设计之下拉多选框制作教程C(中继器)

利用Axure制作下拉多选器组件可以极大地提升原型制作的效率和效果。以下是基于你提供的详细步骤的详细指导&#xff0c;帮助你在Axure中实现一个功能完善、高保真且可复用的下拉多选器组件。 一、案例预览 预览地址&#xff1a;https://pghy0i.axshare.com 实现效果包括&#…

Java基础语法练习42(基本绘图-基本的事件处理机制-小坦克的绘制-键盘控制坦克移动)

目录 一、图形的基本绘制 1.基本介绍&#xff1a; 2.入门代码如下&#xff1a; 3.常用图形的绘制, 示例代码如下&#xff1a; 二、坦克的绘制 三、事件处理机制 四、坦克的移动 一、图形的基本绘制 1.基本介绍&#xff1a; Component 类提供了两个和绘图相关最重要的方…

RabbitMQ 入门

RabbitMQ 入门 1RabbitMQ 介绍 RabbitMQ 是信息传输的中间者。本质上&#xff0c;他从生产者&#xff08;producers&#xff09;接收消息&#xff0c;转发这些消息给消费者&#xff08;consumers&#xff09;.换句话说&#xff0c;他能够按根据你指定的规则进行消息转发、缓冲…

yolo环境 pytorch环境配置 CUDA安装

我的成功案例&#xff1a;首先安装python 3.12.9的conda虚拟环境 &#xff08;如果不安装3.12的会报错误ModuleNotFoundError&#xff1a;没有名为“numpy._core”的模块&#xff09; 然后安装11.8cuda &#xff08;其实我是可以最高安装12.6的cuda但我实测&#xff0c;太高版…

ESP32(4)TCP通信

本章重点讲解 lwIP 的 Socket接口如何配置 TCP客户端&#xff0c;并在此基础上实现收发功能。 TCP Client 连接流程 在实现 TCP 协议之前&#xff0c;用户需要按照以下步骤配置结构体 sockaddr_in 的成员变量&#xff0c;以便建立 TCPClient 连接&#xff1a; ①&#xff1a;…

数学建模:MATLAB循环神经网络

一、简述 1.循环神经网络 循环神经网络&#xff08;RNN&#xff09;是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络&#xff0c;RNN在隐藏层中加入了自反馈连接&#xff0c;使得网络能够对序列中的每个元素执行相同的操作&#xff0c;同时保持一个“记忆”状态…

EagleTrader为何重申重要数据前后2分钟禁止交易?

3月12日&#xff0c;美国公布了2月份的CPI数据。 美国2月未季调CPI年率录得2.8%&#xff0c;为去年11月来新低&#xff0c;低于市场预期的2.9%。 美国2月季调后CPI月率录得0.2%&#xff0c;为去年10月来新低&#xff0c;预期值为0.3%&#xff0c;前值为0.5%。 数据公布后&#…