基于stm32的火灾报警系统(开源)

2025年4月2日 3点热度 0人点赞

前言:

源代码下载链接:

功能演示

基于stm32的火灾检测系统

简介

这是最近别人让我帮他做的一个毕业设计,总体来说非常简单,半天都不需要就可以实现,我做完之后,打算开源在这里让大家进行学习,我们先看一下他的任务书吧:

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

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

硬件资料

# Description Comment Quantity
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 1
10 电阻 1K R0603 1
11 排母 3P PM254-1-03-Z-8.5 2
12 排母 4P PM254-1-04-Z-8.5 2
13 排母 2*4P 2.54mm,2×4Doublerowfemale 1
14 排母 20P PM254-1-20-Z-8.5 2
15 esp8266 01s 1

PCB图以及原理图

软件分析

工程文件

Start:存放stm32配置的起始文件、内核相关文件、系统文件。

Library:存放stm32f103的标准库文件。

User:存放用户文件。

Hardware:存放硬件文件,包括蜂鸣器、LED、MQ2、DS18B20、fire、OLED......

System:存放用户写的一些系统文件,例如延时、时钟配置、串口配置以及相关宏定义。

Gizwits以及Utils:与联网配置有关的文件。

软件流程

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;//浓度最大值,超过报警

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

OLED_Init();

OLED_ShowString(2,1,"initialing...");

for(int i=0;i<20;i++)

{

delay_ms(1000);

}

OLED_Clear();

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心跳

4、网络配置(调用机智云官方的函数,进行协议的初始化,并且将芯片连接到我们手机)

/*机智云初始化*/

userInit();

gizwitsInit();

/*一件配网模式*/

gizwitsSetMode(2);

5、显示主界面,避免循环中不断显示重复的内容,浪费单片机资源

/*显示主界面*/

Show_ZJM();

6、进入循环,开始不断执行循环中的内容,也就是项目的重点部分。

7、刷新传感器数值,显示在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;

}

}

8、根据报警状态,进行对应的处理(通过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);

}

}

9、网络参数更新,对数据点的数值变量进行赋值操作(将传感器读取到的数值刷新到网络参数上面,协议当检测到数值发生变化后,会把数值刷新到手机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

}

10、联网,上传数据,接收下发数据,这个项目不需要处理上面发下来发数据,这个函数其实没用,但是为了配置网络步骤的完整性,这里还是添加上去了。

具体源码

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); } OLED_Clear(); /*模块初始化*/ 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(); /*联网,上传数据,接收下发数据,这个项目不需要处理上面发下来发数据,这个函数其实没用*/ 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; } } 

总结

其实你只要学过一点stm32,以上资料完全够你手动复刻,去购买我硬件清单的对应模块,然后找到商家要驱动代码,移植到你的工程,然后调用相应的函数到我给你的main.c里面,关于网络配置这一块,读者需要自己去查阅机智云官方的指导书进行学习,不过其实这个项目将联网这几个函数删掉也完全可以,联网只是为了让这个项目高级那么一点罢了,只要看懂我这些,自己去找对应模块代码移植,这个项目就可以轻而易举的复刻出来了,希望我这篇文章可以帮助到你,如果需要完整的工程,可以私信我。