目录

前言:

一、项目介绍和演示视频

二、硬件需求准备

三、硬件框图

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记之车票搜索为什么用Redis而不是ES?

在文章正式开始前&#xff0c;大家打开 12306.cn 搜索一趟列车&#xff0c;根据搜索条件判断&#xff0c;数据搜索技术使用 ElasticSearch 或者其它搜索技术是否合适&#xff1f; 这里我先把答案说下&#xff0c;12306 车票搜索用的是 Redis &#xff0c;而不是大家常用的 Ela…

揭秘AI:机器学习与深度学习的奥秘

文章目录 机器学习与深度学习1. 什么是人工智能&#xff1f;2. 机器学习、深度学习和人工智能又是什么关系&#xff1f;3. 人工智能解决了什么问题&#xff1f;为什么需要人工智能&#xff1f;4. 机器学习、深度学习常用术语1&#xff09;模型2&#xff09;数据集3&#xff09;…

【具体场景实践】使用存储过程查数据全流程+自动调度

文章目录 场景设计场景描述:公司员工管理系统需求1. 创建数据库和表2. 插入测试数据3. 复杂存储过程4. 调用存储过程5. 结果示例6. 细节优化存储过程总结7. 自动定期执行存储过程7.1 启用 MySQL 事件调度器7.2 创建定时任务(每天凌晨 2 点自动执行)7.3 查看和管理事件1️⃣ …

【ubuntu】——wsl中使用windows中的adb

一、引言 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;环境下工作时&#xff0c;有时需要使用 Android Debug Bridge&#xff08;ADB&#xff09;工具与 Android 设备进行交互。通过特定设置&#xff0c;能够在 WSL 中便捷地调用 Windows 系统中已安装的 ADB&a…

Centos离线安装gcc

文章目录 Centos离线安装gcc1. gcc是什么&#xff1f;2. gcc下载地址3. gcc的安装4. 安装结果验证 Centos离线安装gcc 1. gcc是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 项目下的开源编译器套件&#xff0c;主要用于将 C、C 等编程语言的源…

JAVA中的多态性以及它在实际编程中的作用

JAVA中的多态性以及它在实际编程中的作用&#xff1f; 在Java中&#xff0c;多态性是指一个对象可以具有多种形态。它主要体现在两个方面&#xff1a;编译时多态和运行时多态。 1.编译时多态 编译时多态通过方法重载&#xff08;Overloading&#xff09;来实现。方法重载是指…

NetLink内核套接字案例分析

一、基础知识 Netlink 是 Linux 系统中一种内核与用户空间通信的高效机制&#xff0c;而 Netlink 消息是这种通信的核心载体。它允许用户态程序&#xff08;如网络配置工具、监控工具&#xff09;与内核子系统&#xff08;如网络协议栈、设备驱动&#xff09;交换数据&#xff…

批量压缩与优化 Excel 文档,减少 Excel 文档大小

当我们在 Excel 文档中插入图片资源的时候&#xff0c;如果我们插入的是原图&#xff0c;可能会导致 Excel 变得非常的大。这非常不利于我们传输或者共享。那么当我们的 Excel 文件非常大的时候&#xff0c;我们就需要对文档做一些压缩或者优化的处理。那有没有什么方法可以实现…

基于深度学习的多模态人脸情绪识别研究与实现(视频+图像+语音)

这是一个结合图像和音频的情绪识别系统&#xff0c;从架构、数据准备、模型实现、训练等。包括数据收集、预处理、模型训练、融合方法、部署优化等全流程。确定完整系统的组成部分&#xff1a;数据收集与处理、模型设计与训练、多模态融合、系统集成、部署优化、用户界面等。详…

保姆级离线TiDB V8+解释

以前学习的时候还是3版本&#xff0c;如今已经是8版本了 https://cn.pingcap.com/product-community/?_gl1ujh2l9_gcl_auMTI3MTI3NTM3NC4xNzM5MjU3ODE2_gaMTYwNzE2NTI4OC4xNzMzOTA1MjUz_ga_3JVXJ41175MTc0MTk1NTc1OC4xMS4xLjE3NDE5NTU3NjIuNTYuMC41NDk4MTMxNTM._ga_CPG2VW1Y4…

spark实验2

一.实验题目 实验所需要求&#xff1a; centos7虚拟机 pyspark spark python3 hadoop分布式 统计历届春晚的节目数目 统计各个类型节目的数量&#xff0c;显示前10名 统计相声类节目历年的数目。 查询每个演员在春晚上表演节目的数量。 统计每年各类节目的数量&#xff0…

学习文章:Spring Boot 中如何使用 `@Async` 实现异步处理

文章目录 学习文章&#xff1a;Spring Boot 中如何使用 Async 实现异步处理 一、什么是 Async&#xff1f;优点&#xff1a; 二、Spring Boot 中启用 Async1. 启用异步支持2. 配置线程池&#xff08;可选&#xff09;3. 使用 Async 注解4. 调用异步方法 三、Async 的进阶用法1.…

Manus:成为AI Agent领域的标杆

一、引言 官网&#xff1a;Manus 随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;作为人工智能领域的重要分支&#xff0c;正逐渐从概念走向现实&#xff0c;并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中&#xff0c;Manus以其独…

Git Fast-forward 合并详解:原理、场景与最佳实践

在使用 Git 进行团队协作时&#xff0c;我们经常需要合并分支。合并方式有很多种&#xff0c;其中 Fast-forward&#xff08;快速合并&#xff09; 是一种最简单且无冲突的合并方式。本文将详细介绍 Fast-forward 的原理、适用场景、常见问题及最佳实践。 一、Fast-forward 合并…

命令行重启Ubuntu软件

我是用Todesk远程桌面&#xff0c;如果卡死的时候&#xff0c;只能通过ssh连接命令行。于是&#xff0c;就有了如标题所示的需求。 首先&#xff0c;我们看一下todesk在系统里叫什么名字&#xff1a; systemctl list-unit-files | grep -i todesk看到发现是"todeskd.serv…

算法每日一练 (11)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (11)全排列题目描述解题思路解题代码c/c…

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…

《SQL性能优化指南:新手如何写出高效的数据库查询

新手程序员如何用三个月成为SQL高手&#xff1f;万字自学指南带你弯道超车 在数据为王的时代&#xff0c;掌握SQL已成为职场新人的必修课。你可能不知道&#xff0c;仅用三个月系统学习&#xff0c;一个零基础的小白就能完成从数据库萌新到SQL达人的蜕变。去年刚毕业的小王就是…

【Unity】在项目中使用VisualScripting

1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

JConsole 在 Linux 上的使用

JConsole 在 Linux 上的使用指南 1. 启动 JConsole 远程监控 Linux 服务器上的 JVM 进程 1.1 修改 JMX 配置&#xff0c;允许远程访问 在 Linux 服务器 启动 Java 应用时&#xff0c;需要加上 -Djava.rmi.server.hostname<服务器IP>&#xff0c;完整的启动参数如下&am…