问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的火灾报警系统设计与实现

创作时间:
作者:
@小白创作中心

基于STM32的火灾报警系统设计与实现

引用
CSDN
1.
https://blog.csdn.net/m0_74712453/article/details/144252689

本文详细介绍了基于STM32的火灾报警系统的设计与实现。系统以STM32F103系列微控制器为核心,集成了多种火灾探测传感器、通信模块和报警装置。文章内容包括项目介绍、硬件实现、软件实现等多个方面,提供了完整的原理图、PCB设计以及源代码。

一、项目介绍和演示视频

该项目实现内容如下:
系统以STM32微控制器为核心,通过集成多种火灾探测传感器、通信模块和报警装置,构建了一个完整的火灾报警系统。系统架构主要包括以下几个部分:

  • 主控芯片:STM32F103系列微控制器,负责处理所有逻辑和控制任务。
  • 火灾探测传感器:包括烟雾传感器、火焰传感器、温度传感器等,用于实时监测楼宇内的火灾隐患。
  • 通信模块:通过Wi-Fi或以太网等通信方式,实现系统与云端服务器或本地监控中心的数据交互。
  • 报警装置:包括声光报警器、短信报警器、电话拨号器等,用于在火灾发生时发出警报信号。
  • 用户界面:通过LCD显示屏或手机APP,提供友好的用户操作界面和实时信息显示。

二、硬件实现

1. 硬件资料

序号
器件名称
型号
数量
1
STM32F103C8T6最小系统板
/
1
2
0.96寸OLED屏幕
/
1
3
MQ2烟雾传感器
MQ2
1
4
温度传感器
DS18B20
1
5
火焰传感器
3线
1
6
有源蜂鸣器
HYT-1205
1
7
三极管
SS8050
1
8
发光二极管
LED_TH-R_3mm
1
9
电阻
4.7K
R0603
10
电阻
1K
R0603
11
排母
3P
PM254-1-03-Z-8.5
12
排母
4P
PM254-1-04-Z-8.5
13
排母
2*4P
2.54mm,2×4Doublerowfemale
14
排母
20P
PM254-1-20-Z-8.5
15
esp8266
01s
1

2. 原理图和PCB

三、软件实现

1. 源码框架

工程文件:

  • Start:存放stm32配置的起始文件、内核相关文件、系统文件。
  • Library:存放stm32f103的标准库文件。
  • User:存放用户文件。
  • Hardware:存放硬件文件,包括蜂鸣器、LED、MQ2、DS18B20、fire、OLED......
  • System:存放用户写的一些系统文件,例如延时、时钟配置、串口配置以及相关宏定义。
  • Gizwits以及Utils:与联网配置有关的文件。

软件流程

1.1 定义各种宏

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Timer.h"
#include "led.h"
#include "MQ2.h"
#include "ds18b20.h"
#include "bsp_buzzer.h"
#include "fire.h"
#include "usart.h"
#include "OLED.h"
#include "gizwits_product.h"
#define Refresh_Sensor_time 2000 //2000ms刷新一次传感器数值
u8 BaoJin=0;//bit 0-7 bit0:温度,bit1:烟雾,bit2:火焰 bit为0表示该项正常,为1该项报警
u16 Sensor_time=Refresh_Sensor_time;
short real_template=0;//温度值
u32 nongdu=0;//气体浓度
u8 huoyan_state=1;//火焰状态 1:未检测到火焰 0:检测到火焰
short template_Max=500;//温度最大值,超过报警,50.0摄氏度
u32 nongdu_Max=1050000000;//浓度最大值,超过报警

1.2 模块上电等待稳定

由于传感器在刚刚上电的时候,还没稳定下来,可能会造成读数异常,我们这里延时20s,让传感器数值稳定一下。

OLED_Init();
OLED_ShowString(2,1,"initialing...");
for(int i=0;i<20;i++)
{
    delay_ms(1000);
}
OLED_Clear();

1.3 模块初始化

初始化各个使用到的模块,配置好对应的定时器和串口。

/*模块初始化*/
LED_Init();
ADC_Sensor_Init();
DS18B20_Init();
FIRE_CONFIG();
Buzzer_Init();
Timer_Init();//定时器4,1ms进入一次中断
uart1_init(9600);//初始化串口1,与esp8266通讯
Timer2_Init();//初始化定时器2,为机智云提供1ms心跳

1.4 网络配置

调用机智云官方的函数,进行协议的初始化,并且将芯片连接到我们手机。

/*机智云初始化*/
userInit();
gizwitsInit();
/*一件配网模式*/
gizwitsSetMode(2);

1.5 显示主界面

避免循环中不断显示重复的内容,浪费单片机资源。

/*显示主界面*/
Show_ZJM();

1.6 进入循环

刷新传感器数值,显示在oled上,并且根据数值判断此时报警状态(通过定时器4进行定时,2s读取一次传感器数值,避免读取过快,传感器失灵,并将读取到的数值进行判断,如果数值异常,将BaoJin变量对应位置1,表面对应环境因素报警)。

void Get_Sensor(void)//获取传感器值
{
    if(Sensor_time==0)
    {
        TIM_Cmd(TIM4,DISABLE);
        TIM_SetCounter(TIM4,0);
        
        real_template=DS18B20_Get_Temp();//获取温度值
        get_mq2_value((float *)&nongdu);//获取气体浓度
        huoyan_state=fire_check();//获取火焰状态
        
        OLED_ShowNum(1,6,real_template/10,2);//显示温度
        OLED_ShowChar(1,8,'.');
        OLED_ShowNum(1,9,real_template%100%10,1);
        OLED_ShowNum(2,6,nongdu/1000000,4);//显示气体浓度
        Sensor_time=Refresh_Sensor_time;
        TIM_Cmd(TIM4,ENABLE);
    }
    if(real_template>template_Max)
    {
        BaoJin|=0x01;
    }
    else
    {
        BaoJin&=0xfe;
    }
    
    if(nongdu>nongdu_Max)
    {
        BaoJin|=0x02;
    }
    else
    {
        BaoJin&=0xfd;
    }
    
    if(huoyan_state==0)
    {
        BaoJin|=0x04;
    }
    else
    {
        BaoJin&=0xfb;
    }
}

1.7 处理信息

根据报警状态,进行对应的处理(通过BaoJin这个全局变量,判断是否报警,如果报警,就会启动蜂鸣器以及打开led,并且在对应报警项里面显示报警,如果不报警,则关闭蜂鸣器以及led,并把报警标志去掉)。

void Baojin_Handle(void)//报警处理
{
    if(BaoJin==0)//状况正常
    {
        BUZZER_OFF;//关闭蜂鸣器
        LED_TIP_OFF;//确保灯是关闭状态
    }
    else
    {
        BUZZER_ON;//打开蜂鸣器
    }
    if(BaoJin&0x01)//温度报警
    {
        OLED_ShowF16x16(1,13,7);
        OLED_ShowF16x16(1,15,8);
    }
    else
    {
        OLED_ShowString(1,13,"    ");
    }
    if(BaoJin&0x02)//烟雾报警
    {
        OLED_ShowF16x16(2,13,7);
        OLED_ShowF16x16(2,15,8);
    }
    else
    {
        OLED_ShowString(2,13,"    ");
    }
    if(BaoJin&0x04)//火焰报警
    {
        OLED_ShowF16x16(3,6,7);
        OLED_ShowF16x16(3,8,8);
    }
    else //显示正常
    {
        OLED_ShowF16x16(3,6,9);
        OLED_ShowF16x16(3,8,10);
    }
}

1.8 网络参数更新

对数据点的数值变量进行赋值操作(将传感器读取到的数值刷新到网络参数上面,协议当检测到数值发生变化后,会把数值刷新到手机APP上面,实现手机app查看室内环境参数)。

void userHandle(void)
{
    currentDataPoint.valueBaoJin = BaoJin;//Add Sensor Data Collection
    currentDataPoint.valuereal_template =real_template/10;//Add Sensor Data Collection
    currentDataPoint.valuenongdu =nongdu/1000000;//Add Sensor Data Collection
}

2. 源码示例

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Timer.h"
#include "led.h"
#include "MQ2.h"
#include "ds18b20.h"
#include "bsp_buzzer.h"
#include "fire.h"
#include "usart.h"
#include "OLED.h"
#include "gizwits_product.h"
#define Refresh_Sensor_time 2000 //2000ms刷新一次传感器数值

u8 BaoJin=0;//bit 0-7 bit0:温度,bit1:烟雾,bit2:火焰 bit为0表示该项正常,为1该项报警
u16 Sensor_time=Refresh_Sensor_time;
short real_template=0;//温度值
u32 nongdu=0;//气体浓度
u8 huoyan_state=1;//火焰状态 1:未检测到火焰 0:检测到火焰
short template_Max=500;//温度最大值,超过报警,50.0摄氏度
u32 nongdu_Max=1050000000;//浓度最大值,超过报警
void Show_ZJM(void);//显示主界面
void Baojin_Handle(void);//报警处理
void Get_Sensor(void);//获取传感器值,并判断报警状态
int main(void)
{
    OLED_Init();
    OLED_ShowString(2,1,"initialing...");
    for(int i=0;i<20;i++)
    {
        delay_ms(1000);
    }
    
    /*模块初始化*/
    LED_Init();
    ADC_Sensor_Init();
    DS18B20_Init();
    FIRE_CONFIG();
    Buzzer_Init();
    Timer_Init();//定时器4,1ms进入一次中断
    uart1_init(9600);//初始化串口1,与esp8266通讯
    Timer2_Init();//初始化定时器2,为机智云提供1ms心跳
    /*机智云初始化*/
    userInit();
    gizwitsInit();
    
    
    /*显示主界面*/
    Show_ZJM();
    
    while (1)
    {
        /*刷新传感器数值,显示在oled上,并且根据数值判断此时报警状态*/
        Get_Sensor();
        /*根据报警状态,进行对应的处理*/
        Baojin_Handle();
        /*网络参数更新,对数据点的数值变量进行赋值操作*/
        userHandle();
        /*联网,上传数据,接收下发数据,这个项目不需要处理上面发下来发数据,这个函数其实没用*/
        gizwitsHandle((dataPoint_t *)&currentDataPoint); 
    }
}
//温(0) 度(1) 烟(2) 雾(3) 火(4) 焰(5) ℃(6) 报(7) 警(8) 正(9) 常(10) 异(11)
void Show_ZJM(void)//显示主界面
{
    OLED_Clear();
    
    //温度:    ℃
    OLED_ShowF16x16(1,1,0);
    OLED_ShowChar(1,5,':');
    OLED_ShowF16x16(1,10,6);
    
    //烟雾:   ppm
    OLED_ShowF16x16(2,1,2);
    OLED_ShowChar(2,5,':');
    OLED_ShowString(2,10,"ppm");
    
    //火焰:
    OLED_ShowF16x16(3,1,4);
    OLED_ShowF16x16(3,3,5);
    OLED_ShowChar(3,5,':');
}
void Baojin_Handle(void)//报警处理
{
    if(BaoJin==0)//状况正常
    {
        BUZZER_OFF;//关闭蜂鸣器
        LED_TIP_OFF;//确保灯是关闭状态
    }
    else
    {
        BUZZER_ON;//打开蜂鸣器
    }
    
    if(BaoJin&0x01)//温度报警
    {
        OLED_ShowF16x16(1,13,7);
        OLED_ShowF16x16(1,15,8);
    }
    else
    {
        OLED_ShowString(1,13,"    ");
    }
    
    if(BaoJin&0x02)//烟雾报警
    {
        OLED_ShowF16x16(2,13,7);
        OLED_ShowF16x16(2,15,8);
    }
    else
    {
        OLED_ShowString(2,13,"    ");
    
    }
    
    if(BaoJin&0x04)//火焰报警
    {
        OLED_ShowF16x16(3,6,7);
        OLED_ShowF16x16(3,8,8);
    }
    else //显示正常
    {
        OLED_ShowF16x16(3,6,9);
        OLED_ShowF16x16(3,8,10);
    }
    
}
void Get_Sensor(void)//获取传感器值
{
    
    if(Sensor_time==0)
    {
        TIM_Cmd(TIM4,DISABLE);
        TIM_SetCounter(TIM4,0);
        Sensor_time=Refresh_Sensor_time;
        TIM_Cmd(TIM4,ENABLE);
    }
    if(real_template>template_Max)
    {	
        BaoJin|=0x01;
    }
    else
    {
        BaoJin&=0xfe;
    }
    if(nongdu>nongdu_Max)
    {
        BaoJin|=0x02;
    }
    else
    {
        BaoJin&=0xfd;
    }
    if(huoyan_state==0)
    {
        BaoJin|=0x04;
    }
    else
    {
        BaoJin&=0xfb;
    }
        
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号