基于单片机的煤气泄漏检测报警装置设计
一、项目介绍
煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。
主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。煤气检测传感器选择了MQ-5,它能够检测到环境中的煤气浓度,并将其转换为电信号输出。装置通过读取传感器输出的模拟信号,并经过ADC转换获得相应的数字值,实时监测煤气浓度。
当检测到煤气浓度超过设定的安全阈值时,装置会触发报警机制。通过控制蜂鸣器发出高频报警声,吸引人的注意并提醒危险情况。同时,装置会控制LED灯光闪烁,以视觉方式提醒用户。这样的多重报警方式可以在不同环境中有效地引起人们的警觉。
为了进一步提高报警的及时性和可靠性,还集成了SIM800C模块,用于发送报警短信给指定的联系人。当煤气浓度超标时,装置会通过SIM800C模块发送预先设定的报警短信,通知相关人员及时采取措施。
通过以上设计,基于单片机的煤气泄漏检测报警装置能够实时监测环境中的煤气浓度,并在检测到异常情况时通过声光报警和短信通知提醒用户。这样的装置可以广泛应用于家庭、工业和商业环境中,为人们的生命财产安全提供有效的保障。


二、硬件选型
在这个设计中,选择了下面的硬件来实现煤气泄漏检测报警装置。
【1】主控芯片:STM32F103C8T6。该芯片是一款强大的低功耗微控制器,具有丰富的外设和良好的性能。它集成了多个通用输入输出引脚、模数转换器 (ADC)、定时器和串行接口等功能,适合用于各种嵌入式应用。
【2】煤气检测传感器:MQ-5。MQ-5是一种常见的煤气传感器,可检测到液化石油气(LPG)、天然气和甲烷等可燃气体。它基于半导体气敏材料,当检测到目标气体浓度超过设定阈值时,其电阻值发生变化。通过测量电阻值的变化,可以判断煤气的浓度是否超标。
【3】蜂鸣器:用于发出报警声音,提醒人们注意。选择合适的蜂鸣器需要考虑其音量大小、工作电压和驱动方式等因素。
【4】LED灯:用于提醒人们注意并指示报警状态。选择合适的LED需要考虑其亮度、工作电压和颜色等因素。
【5】SIM800C模块:用于发送报警短信。SIM800C是一款支持GSM/GPRS通信的模块,可以通过AT指令与主控芯片进行通信。它具有较小的体积、低功耗和稳定的性能,适合物联网应用中的短信通信需求。
三、系统设计思路
软件设计思路:
【1】初始化:对STM32F103C8T6单片机和外设进行初始化设置,包括引脚配置、时钟设置等。
【2】煤气检测:使用ADC模块读取MQ-5传感器的模拟信号,并转换为相应的数字值。
【3】煤气浓度判断:根据传感器的特性曲线,将读取到的数字值转换为实际的煤气浓度。
【4】报警判断:判断煤气浓度是否超过设定的安全阈值。
【5】报警处理:
- 控制蜂鸣器发出报警声。
- 控制LED灯光闪烁。
- 使用SIM800C模块发送报警短信给指定的联系人。
【6】主循环:在主循环中不断进行煤气检测和报警判断,保持系统的实时监测和报警功能。
伪代码示例:
初始化:初始化STM32F103C8T6单片机和外设设置主循环:while (true) {煤气检测();煤气浓度判断();报警判断();延时一段时间;}煤气检测:读取MQ-5传感器的模拟信号;将模拟信号转换为数字值;煤气浓度判断:根据传感器的特性曲线,将数字值转换为实际的煤气浓度;报警判断:if (煤气浓度超过安全阈值) {报警处理();}报警处理:控制蜂鸣器发出报警声;控制LED灯光闪烁;使用SIM800C模块发送报警短信给指定的联系人;
四、代码实现
4.1 主程序
#include "stm32f10x.h"// 定义蜂鸣器控制引脚和LED控制引脚
#define BUZZER_PIN GPIO_Pin_0
#define BUZZER_PORT GPIOA#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOA// 定义煤气传感器控制引脚
#define GAS_SENSOR_PIN GPIO_Pin_2
#define GAS_SENSOR_PORT GPIOA// 定义SIM800C模块的发送引脚
#define SIM800C_SEND_PIN GPIO_Pin_3
#define SIM800C_SEND_PORT GPIOA// 定义报警阈值
#define THRESHOLD 1000// 声明函数原型
void GPIO_Init(void);
void ADC_Init(void);
void Buzzer_Alarm(void);
void LED_Flash(void);
void Send_SMS(void);int main(void)
{// 初始化GPIO和ADCGPIO_Init();ADC_Init();while (1){// 进行煤气浓度检测u16 gasValue = ADC_GetConversionValue(ADC1);// 如果煤气浓度超过阈值,则触发报警if (gasValue > THRESHOLD){Buzzer_Alarm();LED_Flash();Send_SMS();}}
}// GPIO初始化函数
void GPIO_Init(void)
{// 打开GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef gpioInitStruct;// 配置蜂鸣器引脚为推挽输出gpioInitStruct.GPIO_Pin = BUZZER_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BUZZER_PORT, &gpioInitStruct);// 配置LED引脚为推挽输出gpioInitStruct.GPIO_Pin = LED_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED_PORT, &gpioInitStruct);// 配置煤气传感器引脚为模拟输入gpioInitStruct.GPIO_Pin = GAS_SENSOR_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GAS_SENSOR_PORT, &gpioInitStruct);// 配置SIM800C模块的发送引脚为推挽输出gpioInitStruct.GPIO_Pin = SIM800C_SEND_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SIM800C_SEND_PORT, &gpioInitStruct);
}// ADC初始化函数
void ADC_Init(void)
{// 打开ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);ADC_InitTypeDef adcInitStruct;// ADC配置adcInitStruct.ADC_Mode = ADC_Mode_Independent;adcInitStruct.ADC_ScanConvMode = DISABLE;adcInitStruct.ADC_ContinuousConvMode = ENABLE;adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;adcInitStruct.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &adcInitStruct);// 配置ADC通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);// 打开ADCADC_Cmd(ADC1, ENABLE);// 开始ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}// 触发蜂鸣器报警
void Buzzer_Alarm(void)
{GPIO_SetBits(BUZZER_PORT, BUZZER_PIN); // 打开蜂鸣器Delay(1000); // 延时一段时间GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN); // 关闭蜂鸣器
}// LED闪烁提醒
void LED_Flash(void)
{for (int i = 0; i < 10; i++){GPIO_SetBits(LED_PORT, LED_PIN); // 打开LEDDelay(500); // 延时一段时间GPIO_ResetBits(LED_PORT, LED_PIN); // 关闭LEDDelay(500); // 延时一段时间}
}// 发送报警短信
void Send_SMS(void)
{// 这里编写与SIM800C模块通信的代码,发送报警短信
}
4.2 SIM800C代码
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>// 定义SIM800C模块的串口引脚
#define SIM800C_USART USART2
#define SIM800C_USART_GPIO GPIOA
#define SIM800C_USART_TX_PIN GPIO_Pin_2
#define SIM800C_USART_RX_PIN GPIO_Pin_3// 定义发送缓冲区和接收缓冲区的大小
#define TX_BUFFER_SIZE 128
#define RX_BUFFER_SIZE 128// 声明全局变量
char tx_buffer[TX_BUFFER_SIZE]; // 发送缓冲区
char rx_buffer[RX_BUFFER_SIZE]; // 接收缓冲区
uint8_t rx_index = 0; // 接收缓冲区索引// 函数原型
void USART2_Init(void);
void USART2_SendString(const char* string);
void USART2_IRQHandler(void);
void Send_AT_Command(const char* at_command);
void Send_SMS(void);int main(void)
{USART2_Init();while (1){// 在主循环中调用Send_SMS函数即可触发发送短信}
}// 初始化USART2
void USART2_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 打开GPIOA和AFIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 打开USART2时钟GPIO_InitTypeDef gpioInitStruct;USART_InitTypeDef usartInitStruct;NVIC_InitTypeDef nvicInitStruct;// 配置USART2的GPIO引脚gpioInitStruct.GPIO_Pin = SIM800C_USART_TX_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SIM800C_USART_GPIO, &gpioInitStruct);gpioInitStruct.GPIO_Pin = SIM800C_USART_RX_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(SIM800C_USART_GPIO, &gpioInitStruct);// 配置USART2usartInitStruct.USART_BaudRate = 115200;usartInitStruct.USART_WordLength = USART_WordLength_8b;usartInitStruct.USART_StopBits = USART_StopBits_1;usartInitStruct.USART_Parity = USART_Parity_No;usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;usartInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_Init(SIM800C_USART, &usartInitStruct);// 配置USART2中断nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;nvicInitStruct.NVIC_IRQChannelSubPriority = 0;nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvicInitStruct);// 启动USART2接收中断USART_ITConfig(SIM800C_USART, USART_IT_RXNE, ENABLE);// 启动USART2USART_Cmd(SIM800C_USART, ENABLE);
}// 发送字符串到USART2
void USART2_SendString(const char* string)
{uint16_t length = strlen(string);for (uint16_t i = 0; i < length; i++){USART_SendData(SIM800C_USART, string[i]);while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);}
}// USART2中断处理函数
void USART2_IRQHandler(void)
{if (USART_GetITStatus(SIM800C_USART, USART_IT_RXNE) != RESET){char receivedData = USART_ReceiveData(SIM800C_USART);rx_buffer[rx_index++] = receivedData;// 处理接收到的数据// ...USART_ClearITPendingBit(SIM800C_USART, USART_IT_RXNE);}
}// 发送AT指令
void Send_AT_Command(const char* at_command)
{memset(rx_buffer, 0, RX_BUFFER_SIZE); // 清空接收缓冲区rx_index = 0;USART2_SendString(at_command);// 等待模块返回数据while (strncmp(rx_buffer, "OK", 2) != 0 && strncmp(rx_buffer, "ERROR", 5) != 0){// 延时一段时间Delay(10);}// 处理模块返回的数据// ...
}// 发送短信
void Send_SMS(void)
{// 发送AT指令设置短信模式Send_AT_Command("AT+CMGF=1\r\n");// 发送AT指令设置短信收件人和内容Send_AT_Command("AT+CMGS=\"+861**********\"\r\n");Send_AT_Command("Hello, this is a test message.\r\n");// 发送短信结束标志(Ctrl+Z)USART2_SendString("\x1A");
}
五、总结
本项目设计了一个基于单片机的煤气泄漏检测报警装置,通过使用STM32F103C8T6作为主控芯片和MQ-5煤气传感器进行煤气检测,有效地提醒用户煤气泄漏的危险。通过控制蜂鸣器和LED灯的报警机制,以及使用SIM800C模块发送报警短信,用户可以及时采取措施来避免潜在的危险。这个项目结合了硬件设计和嵌入式软件开发的知识,为用户提供了一个可靠的煤气泄漏检测报警解决方案。
相关文章:
基于单片机的煤气泄漏检测报警装置设计
一、项目介绍 煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。 主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。…...
[导弹打飞机H5动画制作] 导弹每次飞行的随机路线制作
技术核心提示: 第一步:检测引导层插件是否具备,如果没有手工添加: createjs.MotionGuidePlugin.install(); 第二步:增加全局变量: var fValue=0; var iOddEven =0; var missileObj=null; 第三步:填写 第一帧 代码: if (missileObj)stage.removeChild(missileObj);missile…...
OpenCV实现FAST算法角点检测 、ORB算法特征点检测
目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 ,ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …...
【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】
CGPROGRAM实现好用的GUI模糊效果 实现Blur模糊方式1C#代码如下方式1_Shader代码如下实现Blur模糊方式2方式2_Shader如下实现Blur模糊方式1 其他的模糊效果,在这一篇。 效果如图: 新建一个C#文件,命名为"CommandBlur",打开C#,删除内容,复制粘贴下面的代码:…...
AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)
随着技术的不断进步,现场服务组织正朝着远程支持转变,用以解决技能差距和生产力问题,提高员工培训和操作效率,同时为企业提高利润率,创造竞争优势。 本文将探讨增强现实(AR)、辅助现实…...
ChatGPT 在机器学习中的应用
办公室里一个机器人坐在人类旁边,Artstation 上的流行趋势,美丽的色彩,4k,充满活力,蓝色和黄色, DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效,…...
【JavaEE】锁策略
文章目录 前言1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重入锁6. 读写锁Java synchronized 分别对应哪些锁策略1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重…...
在 SDXL 上用 T2I-Adapter 实现高效可控的文生图
T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器,实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…...
Python分支结构和循环结构
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一.分支结构 分支结构是根据判断条件结果而选择不同向前路径的运行方式,分支结构分为:单分支,二分支和多分支。 1࿰…...
Unity调用API函数对系统桌面和窗口截图
Unity3D调用WINAPI函数对系统窗口截图 引入WINAPI函数调用WINAPI函数进行截图使用例子 引入WINAPI函数 using System; using System.Collections; using System.Runtime.InteropServices; using System.Drawing;[DllImport("user32.dll")]private static extern Int…...
【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?
问题 在学习操作系统的时候发现了这样一个问题,32位的CPU寻址空间只有4GB,难道只有4GB的空间可以使用吗?以此为始,我开始了一些思考。 思考 Q1:首先,我似乎混淆了一个概念,内存和外存&#x…...
UG NX二次开发(C++)-CAM-根据刀具对程序组进行重新分组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个三维模型3、在UG NX/CAM中创建多个加工程序4、采用UG NX二次开发(NXOpen)实现按照刀具分组程序组4.2 创建UI Styler4.1 实现逻辑4.2 生成的代码如下:4.3 测试效果4.…...
Unity如何实现TreeView
前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…...
Android widget 小部件使用指南强化版
Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图,这些数据和功能可以直…...
Linux下C语言操作网卡的几个代码实例?特别实用
前面写了一篇关于网络相关的文章:如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口!》 那么如何使用C语言直接操作网口? 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…...
noip2011选择旅馆
1.审题:第一个人与第二个人入住的旅馆要求是同色的; 两个人去消费的旅馆并没有要求与入住的旅馆是同色的(这点要小心) 2.要求记录以下数据: 1)a[color]表示当前同为颜色color的旅馆数 2)b[co…...
vue造轮子完整指南--npm组件包开发步骤
一、项目包文件的创建和初始化。 1. 新建项目包。 vue create <Project Name> //用于发布npm包的项目文件名 ps:一般选择自定义,然后不需要Vuex和Router,其他选项按自己实际情况选择安装即可。 2.修改原始src文件名、新增组件项目存放文件和修改…...
28 drf-Vue个人向总结-1
文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…...
线性代数(七) 矩阵分析
前言 从性线变换我们得出,矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 矩阵的序列 通过这个定义我们就定义了矩阵序列的收敛性。 研究矩阵序列收敛性的常用方法,是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特…...
myArm 全新七轴桌面型机械臂
引言 在不断演进的科技世界中,我们始终追求创新和卓越,以满足客户的需求并超越他们的期望。今天,我们很高兴地宣布我们的最新产品——myArm 300 Pi,一款七轴的桌面型机械臂。这款产品的独特之处在于其灵活性和可编程性,…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
