基于STM32的火灾报警设备(阿里云平台)
目录
前言:
一、项目介绍和演示视频
二、硬件需求准备
三、硬件框图
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);//允许发送数据,上传99aliyun_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;//关}
}
👇🏻 需要实物 添加 博主👇🏻
相关文章:
基于STM32的火灾报警设备(阿里云平台)
目录 前言: 一、项目介绍和演示视频 二、硬件需求准备 三、硬件框图 1. 原理图 2. PCB 四、CubeMX配置 五、代码框架 前言: 源代码下载链接: https://download.csdn.net/download/m0_74712453/90474701 需要实物的可以私信博主或者…...
用uv管理python环境/项目(各种应用场景)
一、安装uv 有python的情况 pip install uvWindows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"linux或macOS curl -LsSf https://astral.sh/uv/install.sh | sh二、换镜像源 uv不会读取pip的镜像源配置,所…...
java面试题之多线程
java面试题之多线程 什么是线程?什么是线程安全和线程不安全?什么是⾃旋锁?什么是CAS?什么是乐观锁和悲观锁?什么是AQS?什么是原⼦操作?在Java Concurrency API中有哪些原⼦类(atomic classes)&…...
FPGA-流水灯
Quartus中使用Verilog实现 根据之前所学内容,打开Quartus 软件,新建FPGA项目文件,建立好空项目过后,选择Verilog HDL File,因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客: FPGA 实验报告&a…...
browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案
browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为: 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…...
51单片机和STM32 入门分析
51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…...
什么是YApi?开源接口管理平台部署教程
YApi 到底是个啥? 各位小伙伴们好呀!今天要给大家介绍的是一款超级好用的接口管理神器——YApi!它是一个高效、易用、功能强大的 API 管理平台,简直就是开发、产品、测试人员的福音啊!!!它能帮…...
golang-struct结构体
struct结构体 概述 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是 Golang 中一种复合类型,它是由一组具有相同或不同类型的数据字段组成的数据结构。 结构体是一种用户自定义类型,它可…...
深入理解事务
在数据库管理中,事务是一个至关重要的概念。无论是金融交易、库存管理还是用户数据更新,事务都确保了数据的完整性和一致性。本文将详细介绍为什么需要事务、什么是事务、事务的四大特征、如何在MySQL中使用事务以及MyBatis对事务的配置。 一、为什么需…...
基于SpringBoot + Vue 的药店药品信息管理系统
基于SpringBootVue的药品药店药房信息系统(带文档) 角色: 用户,管理员,员工 功能: 管理员: 首页、个人中心、用户管理、员工管理、药品类别管理、药品信息管理、药品入库管理、药品出库管理、在线咨询管理、留言板管理、系统管理、订单管理。 用户:…...
ubuntu下TFTP服务器搭建
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令 使用的 TFTP 协议, Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器, 需要安装 tftp-hpa 和 tftpd-hpa,命令…...
解决:ModuleNotFoundError: No module named ‘_sqlite3‘
报错: from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下,重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…...
技术债务的隐患:何时重构,何时妥协?
在快节奏的软件开发环境中,企业为了抢占市场或满足紧迫需求,往往不得不在短期内采取“捷径”来加速产品交付,这便引入了“技术债务”。短期内看似能迅速交付,但随着时间推移,这些未优化的代码和架构缺陷会逐渐累积&…...
c#Winform也可以跨平台了GTK框架GTKSystem.Windows.Forms
一、简介 >> 新版下载,问题求助 QQ群:1011147488 1032313876 236066073(满) Visual Studio原生开发,无需学习,一次编译,跨平台运行. C#桌面应用程序跨平台(windows、linux、…...
ABAP PDF预览
画个屏幕 PDF JPG TXT都可以参考预览,把二进制流传递给标准函数就行 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *&am…...
网络爬虫【爬虫库urllib】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库,无须安装,直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包,大致具备以下功能。 ● urlli…...
卷积神经网络 - 卷积层
卷积神经网络一般由卷积层、汇聚层和全连接层构成,本文我们来学习卷积层。 卷积层(Convolutional Layer)是卷积神经网络(CNN)的核心组件,专门用于处理具有网格结构的数据(如图像、音频、时间序…...
玩转 Tailwind CSS:深入解析函数与指令
玩转 Tailwind CSS:深入解析函数与指令 如果你正在使用 Tailwind CSS,可能已经习惯了各种 text-center、mt-4 这样的类名,但你知道吗?Tailwind 其实还隐藏着一套 强大的函数与指令系统,可以让你的代码更加优雅、可维护…...
Axure设计之下拉多选框制作教程C(中继器)
利用Axure制作下拉多选器组件可以极大地提升原型制作的效率和效果。以下是基于你提供的详细步骤的详细指导,帮助你在Axure中实现一个功能完善、高保真且可复用的下拉多选器组件。 一、案例预览 预览地址:https://pghy0i.axshare.com 实现效果包括&#…...
本地部署Jina AI Reader:用Docker打造你的智能解析引擎
本地部署Jina AI Reader:用Docker打造你的智能解析引擎 🌟 引言:为什么需要本地部署?📌 场景应用图谱🔧 部署指南(Linux环境)1. 环境准备2. Docker部署3. 验证服务状态 🚀…...
Java基础语法练习42(基本绘图-基本的事件处理机制-小坦克的绘制-键盘控制坦克移动)
目录 一、图形的基本绘制 1.基本介绍: 2.入门代码如下: 3.常用图形的绘制, 示例代码如下: 二、坦克的绘制 三、事件处理机制 四、坦克的移动 一、图形的基本绘制 1.基本介绍: Component 类提供了两个和绘图相关最重要的方…...
RabbitMQ 入门
RabbitMQ 入门 1RabbitMQ 介绍 RabbitMQ 是信息传输的中间者。本质上,他从生产者(producers)接收消息,转发这些消息给消费者(consumers).换句话说,他能够按根据你指定的规则进行消息转发、缓冲…...
yolo环境 pytorch环境配置 CUDA安装
我的成功案例:首先安装python 3.12.9的conda虚拟环境 (如果不安装3.12的会报错误ModuleNotFoundError:没有名为“numpy._core”的模块) 然后安装11.8cuda (其实我是可以最高安装12.6的cuda但我实测,太高版…...
ESP32(4)TCP通信
本章重点讲解 lwIP 的 Socket接口如何配置 TCP客户端,并在此基础上实现收发功能。 TCP Client 连接流程 在实现 TCP 协议之前,用户需要按照以下步骤配置结构体 sockaddr_in 的成员变量,以便建立 TCPClient 连接: ①:…...
【从零开始学习计算机科学】软件测试(二)单元测试 与 集成测试
【从零开始学习计算机科学】软件测试(二)单元测试 与 集成测试 单元测试概述单元测试的内容单元测试的优点单元测试的停止准则单元测试的过程与文档管理单元测试的任务集成测试集成测试关注的问题模块分析集成测试与系统测试的区别集成测试与开发的关系集成测试的层次集成测试…...
数学建模:MATLAB循环神经网络
一、简述 1.循环神经网络 循环神经网络(RNN)是一种用于处理序列数据的神经网络。不同于传统的前馈神经网络,RNN在隐藏层中加入了自反馈连接,使得网络能够对序列中的每个元素执行相同的操作,同时保持一个“记忆”状态…...
EagleTrader为何重申重要数据前后2分钟禁止交易?
3月12日,美国公布了2月份的CPI数据。 美国2月未季调CPI年率录得2.8%,为去年11月来新低,低于市场预期的2.9%。 美国2月季调后CPI月率录得0.2%,为去年10月来新低,预期值为0.3%,前值为0.5%。 数据公布后&#…...
【Spring】声明式事务传播机制
1. 所有传播行为 REQUIRED(默认类型): 如果当前存在事务,则加入该事务;如果没有,则新建一个事务。适用于大多数业务场景。 SUPPORTS: 如果当前存在事务,则加入该事务;…...
个人blog系统 前后端分离 前端js后端go
系统设计: 1.使用语言:前端使用vue,并使用axios向后端发送数据。后端使用的是go的gin框架,并使用grom连接数据库实现数据存储读取。 2.设计结构: 最终展示:仅展示添加模块,其他模块基本相似 前…...
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
