基于stm32的烟雾报警器
简介 通过MQ2可燃气体传感器检测可燃气体浓度,当可燃气体浓度高于必定值时传入高电平激发蜂鸣器。
使用器件:stm32f103,MQ2传感器模块探头,
功能
1,检测当前环境温度,有害气体浓度,并显示在屏幕上。
2,串口更改阈值信息,并显示在屏幕上。
3,若温度,气体浓度超过阈值,蜂鸣器报警。
系统设计
报警器系统结构框图如下图所示,系统以单片机为核心,配合外围电路共同完成:
信号采集
浓度显示
时间显示
状态显示
声音及闪烁报警
按键输入
故障自检等功能。
报警器采用巡检的工作方式,进行两级报警值设定,并发出不同的光、声信号。系统应采用高性能的单片机,要求工作稳定、测量精度高、通用性强、功耗低,保证报警器的准确性及可靠性,而且最好体积小,成本低有利于减少报警器的体积,降低报警器的成本
4.1 自诊断故障报警功能
当传感器加热丝或者电缆线发生断线或者接触不良的情况时, 报警器发出警报, 并且黄色指示灯闪烁, 提醒用户检查传感器或者电路线接触情况, 及时排除故障, 保证安全。
4.2 烟雾浓度显示
通过液晶屏显示可燃烟雾的浓度值, 并且可以切换到设置状态, 通过键盘设置或者更改报警限值, 以便于用户或检测人员随时观测烟雾浓度及更改报警限。
4.3 烟雾报警功能
当烟雾浓度连续 20 秒取值都在报警限值之上, 蜂鸣器开始报警, 且声音越来越急促,并且伴随红灯闪烁。 由于人对变化的信号更为敏感, 所以变化的声音及灯光更容易引起用户的注意。
4.4 防止报警器误报功能
快速重复检测及延时报警可以区别出是管道中可燃烟雾的泄漏, 还是由于打开阀门时的微量烟雾的散失。
4.5 看门狗自检单片机状态功能
调用单片机中的看门狗程序, 定时检查单片机工作状态, 一旦发现单片机出现死循环状态, 立即复位, 保证报警器工作正常。
4.6 与上位机通讯功能
可以实现与计算机串口通讯, 对报警器采取统一控制, 以及便于采集和处理数据, 也可以在计算机上更改报警限值等。
4.7 自动控制相关安全装置的扩展功能
留有继电器接口, 可以带动排风扇或大功率蜂鸣器, 也可以控制管道电子阀门, 可在报警的同时自动启动相关安全装置。
5 软件设计
主程序流程图如图所示。
第一要给传感器预热三分钟, 由于 MQ-2 型半导体电阻式烟雾传感器在不通电存放一段时间后, 再次通电时, 传感器不能立即正常采集烟雾信息,需要一段时间预热。 程序初始化结束后, 系统进入监控状态。 本论文的主程序设计先对传感器预热三分钟, 预热同时, 对传感器加热丝故障检测, 采用软件方式检测传感器加热丝或电缆线是否断线或者接触不良。
5.1 初始化流程
5.2 传感器数据滤波
在烟雾传感器对烟雾浓度采样时, 可能会遇到尖脉冲干扰的现象。 干扰一般只影响个别采样点的数据, 此数据与其他采样点的数据相差比较大。
5.3 报警子程序
当烟雾浓度超过报警设定值时, 报警器发出一种近似警笛的鸣叫声, 对应通道的红灯闪亮, 以提示操作人员采取安全对策或自动控制相关安全装置, 从而保障生产安全, 避免火灾和爆炸事故的发生。
部分代码
#ifndef __SMOKE_H
#define __SMOKE_H
#include “stm32f10x.h”
#include “stm32f10x_gpio.h”
//正常状态高电平,有烟雾低电平,单片机检测到下降沿触发中断
//引脚定义
#define SMOKE_INT_GPIO_PORT GPIOB
#define SMOKE_INT_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
#define SMOKE_INT_GPIO_PIN GPIO_Pin_4
#define SMOKE_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
#define SMOKE_INT_EXTI_PINSOURCE GPIO_PinSource4
#define SMOKE_INT_EXTI_LINE EXTI_Line4 //中断标志位
#define SMOKE_INT_EXTI_IRQ EXTI4_IRQn
#define SMOKE_IRQHandler EXTI4_IRQHandler
#define SMOKE_BIT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//读取
void EXTI_SMOKE_Config(void);
#endif
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//功能:烟雾探测器模块驱动
//作用:
//编写:MARK
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include “smoke.h”
#include “stm32f10x_gpio.h”
static void SMOKE_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置NVIC为优先级组1 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 配置中断源*/
NVIC_InitStructure.NVIC_IRQChannel = SMOKE_INT_EXTI_IRQ;
/* 配置抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 配置子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief 配置 IO为EXTI中断口,并设置中断优先级
* @param 无
* @retval 无
*/
void EXTI_SMOKE_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*开启GPIO口的时钟*/
RCC_APB2PeriphClockCmd(SMOKE_INT_GPIO_CLK,ENABLE);
/* 配置 NVIC 中断*/
SMOKE_NVIC_Configuration();
/* 选择用到的GPIO */
GPIO_InitStructure.GPIO_Pin = SMOKE_INT_GPIO_PIN;
/* 配置为浮空输入 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(SMOKE_INT_GPIO_PORT, &GPIO_InitStructure);
/* 选择EXTI的信号源 */
GPIO_EXTILineConfig(SMOKE_INT_EXTI_PORTSOURCE, SMOKE_INT_EXTI_PINSOURCE);
EXTI_InitStructure.EXTI_Line = SMOKE_INT_EXTI_LINE;
/* EXTI为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿下降沿中断触发 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
转载自:https://blog.csdn.net/m0_71572576/article/details/125541892