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

news2024/12/27 13:52:48

一、项目介绍

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

主控芯片采用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和ADC
    GPIO_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);

    // 打开ADC
    ADC_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);     // 打开LED
        Delay(500);                          // 延时一段时间
        GPIO_ResetBits(LED_PORT, LED_PIN);   // 关闭LED
        Delay(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);

    // 配置USART2
    usartInitStruct.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);

    // 启动USART2
    USART_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.coloradmin.cn/o/1051022.html

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

相关文章

《PPT 自我介绍》:一本让你的职场表现更加出色的秘籍?

这里提供一个2000字左右的PPT自我介绍模板制作指南&#xff1a; 自我介绍是面试或工作中常见的情况&#xff0c;利用PPT可以给人留下更深刻的印象。但如何快速且专业地制作一个自我介绍PPT呢?这里给大家介绍几点技巧&#xff1a; 1. 选择一个简洁大方的PPT模板 首先要选择一…

最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

中秋海报制作不求人,详细教程来袭

中秋节是我国传统的节日&#xff0c;也是家庭团聚的重要时刻。在节日即将到来之际&#xff0c;如何设计一张温馨、美丽的中秋节海报&#xff0c;让家庭成员感受到节日的氛围和温暖呢&#xff1f;下面就为大家分享一些中秋节海报设计的秘诀。 一、选择合适的模版 登录乔拓云后&a…

NSSCTF做题(4)

[NISACTF 2022]checkin 简单的一道代码审计了 但是发现传参传不上去 后来发现 在选中nisactf的时候&#xff0c;注释里面的内容也被标记了 不知道是为什么&#xff0c;把它复制到010里边去看看 发现了不对的地方 nisactf应该传参 根据这个进行url编码 我们选择实际的参名和…

让文件传输变得更简单高效——推荐强大的Mac FTP客户端Transmit 5

无论是个人用户还是专业人士&#xff0c;文件传输都是我们日常工作中不可或缺的一部分。而针对Mac用户&#xff0c;Transmit 5正是一款强大且易用的FTP客户端&#xff0c;为您提供了最佳的文件传输体验。 Transmit 5在功能上非常丰富&#xff0c;可以满足各种文件传输需求。首…

uboot启动流程涉及reset函数

一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下&#xff0c;uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习&#xff0c;地址如下&#xff…

【2023保研】双非上岸东南网安

个人情况 学校&#xff1a;henu 专业&#xff1a;信息安全 排名&#xff1a;1/66 英语&#xff1a;六级500 竞赛&#xff1a;蓝桥杯PB国一&#xff0c;ISCC国一&#xff0c;密码数学挑战赛国三&#xff0c;还有其他一些省级水奖 论文&#xff1a;一篇EI在投&#xff08;三作通…

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

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

web:[极客大挑战 2019]Upload

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

华为OD机试 - 快递业务站 - 并查集(Java 2023 B卷 200分)

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

Java 基于 SpringBoot 的简历招聘系统

文章目录 1、效果演示2、 前言介绍3、主要技术4 **系统设计**4.1 系统体系结构4.2开发流程设计4.3 数据库设计原则 5 **系统详细设计**5.1管理员功能模块5.2用户功能模块5.3前台首页功能模块 6 源码咨询 1、效果演示 大家好&#xff0c;今天为大家带来的是基于 SpringBoot简历…

C理解(四):链表

本文主要探讨单链表与双链表相关知识。 linux内核链表(include/linux/list.h) 内核链表中纯链表封装,纯链表的各种操作函数&#xff08;节点创建、插入、删除、遍历&#xff09;,纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等 单链表 单链表链表头插…

WebGL笔记:绘制多个点,三角形,以及画各种不同的线条,面

绘制多点 1 &#xff09; WebGL 缓冲区 我们在用js定点位的时候&#xff0c;肯定是要建立一份顶点数据的&#xff0c;这份顶点数据是给着色器的&#xff0c;因为着色器需要这份顶点数据绘图然而&#xff0c;我们在js中建立顶点数据&#xff0c;着色器肯定是拿不到的&#xff…

Java开源工具库使用之Lombok

文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…

微信小程序开发基础(二)基本组件

本帖开始介绍小程序中的一些基本组件~ 微信小程序是一种轻量、快速、跨平台的应用程序&#xff0c;是微信公众号的重要组成部分。随着微信小程序的普及&#xff0c;越来越多的开发者和企业开始使用微信小程序来搭建自己的应用&#xff0c;但是对于初次接触微信小程序的开发者…

高德地图根据两点的经纬度计算两点之间的距离(修正版)

SQL语句可以用来计算两个经纬度之间的距离。下面是一个示例的SQL语句&#xff1a; SELECT id, ( 6371 * ACOS( COS( RADIANS( lat1 ) ) * COS( RADIANS( lat2 ) ) * COS( RADIANS( lng2 ) - RADIANS( lng1 ) ) SIN( RADIANS( lat1 ) ) * SIN( RADIANS( lat2 ) ) ) ) AS dista…

【切片】基础不扎实引发的问题

本次文章主要是来聊聊关于切片传值需要注意的问题&#xff0c;如果不小心&#xff0c;则很容易引发线上问题&#xff0c;如果不够理解&#xff0c;可能会出现奇奇怪怪的现象 问题情况&#xff1a; 小 A 负责一个模块功能的实现&#xff0c;在调试代码的时候可能不仔细&#x…

使用YOLOv5的backbone网络识别图像天气 - P9

目录 环境步骤环境设置包引用声明一个全局的设备 数据准备收集数据集信息构建数据集在数据集中读取分类名称划分训练、测试数据集数据集划分批次 模型设计编写维持卷积前后图像大小不变的padding计算函数编写YOLOv5中使用的卷积模块编写YOLOv5中使用的Bottleneck模块编写YOLOv5…

【前端】ECMAScript6从入门到进阶

【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 &#xff08;1&#xff09;ECMAScript 6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff…

k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD

测试环境使用的jenkins 正式环境使用的gitlab-ci 测试环境 创建yaml文件 apiVersion: v1 kind: ConfigMap metadata:name: dtk-go-tiktok-admin-configlabels:app.kubernetes.io/name: dtk-go-tiktok-adminapp.kubernetes.io/business: infrastructureapp.kubernetes.io/run…