基于STM32的火灾报警系统(单片机毕设)

前言

源代码下载链接:

需要实物的可以私信博主或者在文章最下方添加好友。

目录

一、项目介绍和演示视频

二、硬件实现

1. 硬件资料

2. 原理图和PCB

三、软件实现

1. 源码框架

1.1 定义各种宏

1.2 模块上电等待稳定

1.3 模块初始化

1.4 网络配置

1.5 显示主界面

1.6 进入循环

1.7 处理信息

1.8 网络参数更新

2. 源码示例


一、项目介绍和演示视频

该项目实现内容如下:

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

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

实物图:

演示视频:

基于STM32的火灾报警系统演示视频

二、硬件实现

1. 硬件资料

#DescriptionCommentQuantity
1STM32F103C8T6最小系统板/1
20.96寸OLED屏幕/1
3MQ2烟雾传感器MQ21
4温度传感器DS18B201
5火焰传感器3线1
6有源蜂鸣器HYT-12051
7三极管SS80501
8发光二极管LED_TH-R_3mm1
9电阻 4.7KR06031
10电阻 1KR06031
11排母 3PPM254-1-03-Z-8.52
12排母 4PPM254-1-04-Z-8.52
13排母 2*4P2.54mm,2×4Doublerowfemale1
14排母 20PPM254-1-20-Z-8.52
15esp826601s1

2. 原理图和PCB

 原理图:

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;
	}
		
}

                                                                     👇🏻 需要实物 添加 博主👇🏻

### 基于STM32火灾报警系统设计方案及实现 #### 1. 系统组成与工作原理 该系统主要由STM32微控制器为核心,集成多种传感器用于环境参数监测。具体来说,火焰传感器负责检测是否存在明火;MQ-2气体传感器用来监控空气中可燃气体浓度;DHT11温湿度传感器则提供温度和相对湿度的数据采集功能[^1]。 为了提高系统的智能化水平,在硬件上还加入了OLED显示屏作为人机交互界面,允许用户直观地读取各项指标数值以及调整预警门限值。此外,GSM模块被引入以便在紧急情况下向指定联系人发送求救短消息通知[^3]。 #### 2. 软件架构设计 软件部分采用模块化编程思路来构建整个应用程序框架: - **初始化配置**:完成MCU外设资源分配、中断服务程序注册等工作; - **主循环逻辑**:持续轮询各个传感元件的状态变化情况,并依据预定义算法处理获取的信息流; - **事件驱动机制**:针对特定条件满足时触发相应动作序列(如开启警笛),并通过定时器控制其执行周期长度; - **通信协议栈**:封装好串口收发指令集供其他组件调用,确保能与其他设备正常交换信息[^2]。 ```c // 初始化函数示例 void System_Init(void){ // 配置GPIO端口模式 GPIO_Config(); // 设置ADC通道映射关系表 ADC_ChannelConfig(); // 开启USART接口使能位 USART_Enable(); } // 主函数入口点 int main(){ // 进入无限循环等待外部刺激发生 while(1){ Check_Sensors(); // 定期查询各路输入信号状态 Update_Display(); // 刷新屏幕上的数据显示 if(Is_AlarmNeeded()){ Trigger_Alert(); // 当达到告警标准后激活应急措施 } Delay_ms(50); // 添加适当延时减少CPU占用率 } } ``` #### 3. 关键技术要点说明 ##### 数据融合分析 考虑到单一类型的探测手段可能存在误判风险,因此建议综合运用多模态感知方式提升判断准确性。比如将烟雾浓度超标与否同周围气温异常升高现象相结合考虑,只有两者同时存在才认定为真实险情并采取下一步行动。 ##### 报警策略优化 除了常规的声音提示之外,还可以借助视觉反馈形式强化警示效果——即让LED灯闪烁不停直至人工干预解除危机为止。更重要的是要充分利用现代通讯工具的优势及时告知相关人员具体情况进展状况,从而争取更多救援时间窗口。 ##### 用户体验改善 为了让最终产品更加贴近实际应用场景需求,在UI界面上下功夫显得尤为重要。一方面可以通过图形化图标代替纯字符表达复杂概念;另一方面支持触摸屏操作简化菜单导航流程,让用户能够轻松自定义个性化偏好设置而不必依赖说明书指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值