基于单片机的煤气泄漏检测报警装置设计

一、项目介绍

煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。

主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。煤气检测传感器选择了MQ-5,它能够检测到环境中的煤气浓度,并将其转换为电信号输出。装置通过读取传感器输出的模拟信号,并经过ADC转换获得相应的数字值,实时监测煤气浓度。

当检测到煤气浓度超过设定的安全阈值时,装置会触发报警机制。通过控制蜂鸣器发出高频报警声,吸引人的注意并提醒危险情况。同时,装置会控制LED灯光闪烁,以视觉方式提醒用户。这样的多重报警方式可以在不同环境中有效地引起人们的警觉。

为了进一步提高报警的及时性和可靠性,还集成了SIM800C模块,用于发送报警短信给指定的联系人。当煤气浓度超标时,装置会通过SIM800C模块发送预先设定的报警短信,通知相关人员及时采取措施。

通过以上设计,基于单片机的煤气泄漏检测报警装置能够实时监测环境中的煤气浓度,并在检测到异常情况时通过声光报警和短信通知提醒用户。这样的装置可以广泛应用于家庭、工业和商业环境中,为人们的生命财产安全提供有效的保障。

image-20230802163612836

image-20230802163555635

二、硬件选型

在这个设计中,选择了下面的硬件来实现煤气泄漏检测报警装置。

【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模块发送报警短信,用户可以及时采取措施来避免潜在的危险。这个项目结合了硬件设计和嵌入式软件开发的知识,为用户提供了一个可靠的煤气泄漏检测报警解决方案。

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

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

相关文章

[H5动画制作系列 ]变量,帧频,监听器等的生命周期基础测试

模式:按照上述抓图,actions层&#xff0c;1帧,写初始化代码,10帧写返回代码到2帧代码,2-10帧之间一直循环。1帧及10帧代码如下&#xff1a; 如果程序在1-10之间循环,会反复创建变量i,多个监听器等。所以,第一帧最好执行一次即可&#xff0c;程序在2-10帧之间一直循环。

MySQL Installer is running in Community mode

每天很准时的弹出&#xff1a; 这是由于检查MySql并且更新的一个定时任务&#xff0c;没有更新成功导致 解决办法&#xff1a;禁用定时任务 1.先关闭错误框 2.打开控制面板 &#xff0c;使用小图标查看 3. 打开管理工具&#xff0c;双击打开任务计划程序 4.双击进入&#xf…

epoll与socket缓冲区的恩恩怨怨

文章目录 前言一、什么是socket缓冲区二、阻塞与非阻塞内核缓冲区1、如果发送缓冲区满了会怎么样阻塞非阻塞 2、如果接受缓冲区为空会怎么样阻塞非阻塞 三、epoll与缓冲区的恩恩怨怨水平触发边缘触发非阻塞阻塞 结论 前言 本文深挖网络编程中的缓冲区&#xff0c;从什么是缓冲…

数据结构 | 树

树 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 有且仅有一个特定的称为根的结点。当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09;个互不相交的有限集T1,T2,…,Tm&#…

【Android】线程下载资源保证资源到位采用了 OkHttp的三方网络下载 文件缓存策略

背景 使用 SVGA的三方的url播放方式会比较慢&#xff0c;至少延迟3s以上才会出现svga效果&#xff0c;所以改变策略&#xff1a;将线上的svga全部下载到本地进行播放&#xff0c;那么就得将采用网络缓存的方式实现效果。 实现 那么就得实现以下几点&#xff1a; 初次下载缓…

专栏更新情况:华为流程、产品经理、战略管理、IPD

目录 前言 01 华为流程体系入门课 CSDN学院 02 产品经理进阶课 CSDN学院 03 BLM 战略方法论进阶课 04 IPD 进阶 100 例专栏 作者简介 前言 已上线四大课程专栏更新情况&#xff1a; 01 华为流程体系入门课&#xff08;视频图文&#xff09;&#xff1b; 02 硬件产品经…

UE4/5数字人MetaHuman通过已有动画进行修改

目录 通过已有动画修改动画 开始制作 创建一个关卡序列 将动画序列烘焙到控制绑定 打开我们自己创建的动画序列 之后便是烘焙出来 通过已有动画修改动画 首先架设我们已经有相关的MetaHuman的动画&#xff0c;但是这个动画因为是外部导入进来的&#xff0c;所以可能会出…

处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl

处理conda安装工具的动态库问题——解决记录 处理conda安装工具的动态库问题——解决记录 - 简书 解决libssl.so.1.0.0: cannot open shared object file: No such file or directory问题 - 简书 openssl 默认版本问题&#xff08;Anaconda相关&#xff09;_anaconda openssl-…

web:[极客大挑战 2019]Upload

题目 页面显示为一个上传&#xff0c;猜测上传一句话木马文件 先查看源代码看一下有没有有用的信息&#xff0c;说明要先上传图片&#xff0c;先尝试上传含有一句话木马的图片 构造payload <?php eval($_POST[123]);?> 上传后页面显示为&#xff0c;不能包含<&…

架构案例2022(四十二)

促销管理系统 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…

【笔记】离线Ubuntu20.04+mysql 5.7.36 + xtrabackup定时增量备份脚本

一、环境 ● Ubuntu版本查看 lsb_release -a● mysql 版本查看 mysql --version我的是ubuntu 20.04&#xff0c;mysql是5.7.36&#xff0c;所以要用 install_percona-xtrabackup-24 二、原理 备份 通过ubuntu自带的定时器运行增量备份脚本备份文件可以存储在映射后的其他…

云原生Kubernetes:Pod控制器

目录 一、理论 1.Pod控制器 2.Deployment 控制器 3.SatefulSet 控制器 4.DaemonSet 控制器 5.Job 控制器 6.CronJob 控制器 二、实验 1.Deployment 控制器 2.SatefulSet 控制器 3.DaemonSet 控制器 4.Job 控制器 5.CronJob 控制器 三、问题 1. showmount -e 报错…

华为OD机试 - 判断字符串子序列(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&am…

京东大型API网关实践之路

概述 1、背景 京东作为电商平台&#xff0c;近几年用户、业务持续增长&#xff0c;访问量持续上升&#xff0c;随着这些业务的发展&#xff0c;API网关应运而生。 API网关&#xff0c;就是为了解放客户端与服务端而存在的。对于客户端&#xff0c;使开放给客户端的接口标准统…

2023-9-28 JZ54 二叉搜索树的第k个结点

题目链接&#xff1a;二叉搜索树的第k个结点 import java.util.*;/** public class TreeNode {* int val 0;* TreeNode left null;* TreeNode right null;* public TreeNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方…

TVP专家谈腾讯云 Cloud Studio:开启云端开发新篇章

导语 | 近日&#xff0c;由腾讯云 TVP 团队倾力打造的 TVP 吐槽大会第六期「腾讯云 Cloud Studio」专场圆满落幕&#xff0c;6 位资深的 TVP 专家深度体验腾讯云 Cloud Studio 产品&#xff0c;提出了直击痛点的意见与建议&#xff0c;同时也充分肯定了腾讯云 Cloud Studio 的实…

文件审计及文件完整性监控

什么是文件审核 对文件服务器中发生的所有事件的检查称为文件审核。这包括监视文件访问&#xff0c;其中包含谁访问了什么文件、何时以及从何处访问的详细信息;对访问最多和修改的文件的分析;成功和失败的文件访问尝试;等等。文件服务器审核过程的主要目标是跟踪在配置的服务器…

Vue3最佳实践 第六章 Pinia,Vuex与axios,VueUse 1(Pinia)

Pinia状态管理 在 Vue3 中项目中组件之间传递数据时&#xff0c;可以使用 Props 和 Emit&#xff0c;还可以使用 Provide/Inject 来代替 Props 和 Emit。Props 和 Emit 只能在具有父子关系的组件之间传递数据&#xff0c;所以层级越深&#xff0c;过程就越复杂。为了解决此类问…

蓝桥杯 题库 简单 每日十题 day11

01 质数 质数 题目描述 给定一个正整数N&#xff0c;请你输出N以内&#xff08;不包含N&#xff09;的质数以及质数的个数。 输入描述 输入一行&#xff0c;包含一个正整数N。1≤N≤10^3 输出描述 共两行。 第1行包含若干个素数&#xff0c;每两个素数之间用一个空格隔开&…

【IDEA】使用idea调试时查看对象集合的值

1、在实体类上添加toString方法 2、在要查看集合的地方右键View as→toString 3、View Text复制对象集合的值 4、复制map集合的值同理