基于stm32的火灾报警系统
功能演示基于stm32的火灾检测系统简介这是最近别人让我帮他做的一个毕业设计总体来说非常简单半天都不需要就可以实现我做完之后打算开源在这里让大家进行学习我们先看一下他的任务书吧:系统以STM32微控制器为核心通过集成多种火灾探测传感器、通信模块和报警装置构建了一个完整的火灾报警系统。系统架构主要包括以下几个部分- 主控芯片STM32F103系列微控制器负责处理所有逻辑和控制任务。- 火灾探测传感器包括烟雾传感器、火焰传感器、温度传感器等用于实时监测楼宇内的火灾隐患。- 通信模块通过Wi-Fi或以太网等通信方式实现系统与云端服务器或本地监控中心的数据交互。- 报警装置包括声光报警器、短信报警器、电话拨号器等用于在火灾发生时发出警报信号。- 用户界面通过显示屏或手机APP提供友好的用户操作界面和实时信息显示。硬件资料#DescriptionCommentQuantity1STM32F103C8T6最小系统板/120.96寸OLED屏幕/13MQ2烟雾传感器MQ214温度传感器DS18B2015火焰传感器3线16有源蜂鸣器HYT-120517三极管SS805018发光二极管LED_TH-R_3mm19电阻 4.7KR0603110电阻 1KR0603111排母 3PPM254-1-03-Z-8.5212排母 4PPM254-1-04-Z-8.5213排母 2*4P2.54mm,2×4Doublerowfemale114排母 20PPM254-1-20-Z-8.5215esp826601s1PCB图以及原理图软件分析工程文件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 BaoJin0;//bit 0-7 bit0:温度bit1:烟雾bit2:火焰 bit为0表示该项正常为1该项报警u16 Sensor_timeRefresh_Sensor_time;short real_template0;//温度值u32 nongdu0;//气体浓度u8 huoyan_state1;//火焰状态 1:未检测到火焰 0:检测到火焰short template_Max500;//温度最大值超过报警,50.0摄氏度u32 nongdu_Max1050000000;//浓度最大值超过报警2、模块上电等待稳定由于传感器在刚刚上电的时候还没稳定下来可能会造成读数异常我们这里延时20s让传感器数值稳定一下OLED_Init();OLED_ShowString(2,1,initialing...);for(int i0;i20;i){delay_ms(1000);}OLED_Clear();3、模块初始化初始化各个使用到的模块配置好对应的定时器和串口。/*模块初始化*/LED_Init();ADC_Sensor_Init();DS18B20_Init();FIRE_CONFIG();Buzzer_Init();Timer_Init();//定时器41ms进入一次中断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_time0){TIM_Cmd(TIM4,DISABLE);TIM_SetCounter(TIM4,0);real_templateDS18B20_Get_Temp();//获取温度值get_mq2_value((float *)nongdu);//获取气体浓度huoyan_statefire_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_timeRefresh_Sensor_time;TIM_Cmd(TIM4,ENABLE);}if(real_templatetemplate_Max){BaoJin|0x01;}else{BaoJin0xfe;}if(nongdunongdu_Max){BaoJin|0x02;}else{BaoJin0xfd;}if(huoyan_state0){BaoJin|0x04;}else{BaoJin0xfb;}}8、根据报警状态进行对应的处理通过BaoJin这个全局变量判断是否报警如果报警就会启动蜂鸣器以及打开led并且在对应报警项里面显示报警如果不报警则关闭蜂鸣器以及led并把报警标志去掉void Baojin_Handle(void)//报警处理{if(BaoJin0)//状况正常{BUZZER_OFF;//关闭蜂鸣器LED_TIP_OFF;//确保灯是关闭状态}else{BUZZER_ON;//打开蜂鸣器}if(BaoJin0x01)//温度报警{OLED_ShowF16x16(1,13,7);OLED_ShowF16x16(1,15,8);}else{OLED_ShowString(1,13, );}if(BaoJin0x02)//烟雾报警{OLED_ShowF16x16(2,13,7);OLED_ShowF16x16(2,15,8);}else{OLED_ShowString(2,13, );}if(BaoJin0x04)//火焰报警{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 CollectioncurrentDataPoint.valuereal_template real_template/10;//Add Sensor Data CollectioncurrentDataPoint.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 BaoJin0;//bit 0-7 bit0:温度bit1:烟雾bit2:火焰 bit为0表示该项正常为1该项报警 u16 Sensor_timeRefresh_Sensor_time; short real_template0;//温度值 u32 nongdu0;//气体浓度 u8 huoyan_state1;//火焰状态 1:未检测到火焰 0:检测到火焰 short template_Max500;//温度最大值超过报警,50.0摄氏度 u32 nongdu_Max1050000000;//浓度最大值超过报警 void Show_ZJM(void);//显示主界面 void Baojin_Handle(void);//报警处理 void Get_Sensor(void);//获取传感器值,并判断报警状态 int main(void) { OLED_Init(); OLED_ShowString(2,1,initialing...); for(int i0;i20;i) { delay_ms(1000); } OLED_Clear(); /*模块初始化*/ LED_Init(); ADC_Sensor_Init(); DS18B20_Init(); FIRE_CONFIG(); Buzzer_Init(); Timer_Init();//定时器41ms进入一次中断 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(BaoJin0)//状况正常 { BUZZER_OFF;//关闭蜂鸣器 LED_TIP_OFF;//确保灯是关闭状态 } else { BUZZER_ON;//打开蜂鸣器 } if(BaoJin0x01)//温度报警 { OLED_ShowF16x16(1,13,7); OLED_ShowF16x16(1,15,8); } else { OLED_ShowString(1,13, ); } if(BaoJin0x02)//烟雾报警 { OLED_ShowF16x16(2,13,7); OLED_ShowF16x16(2,15,8); } else { OLED_ShowString(2,13, ); } if(BaoJin0x04)//火焰报警 { 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_time0) { TIM_Cmd(TIM4,DISABLE); TIM_SetCounter(TIM4,0); Sensor_timeRefresh_Sensor_time; TIM_Cmd(TIM4,ENABLE); } if(real_templatetemplate_Max) { BaoJin|0x01; } else { BaoJin0xfe; } if(nongdunongdu_Max) { BaoJin|0x02; } else { BaoJin0xfd; } if(huoyan_state0) { BaoJin|0x04; } else { BaoJin0xfb; } }总结其实你只要学过一点stm32以上资料完全够你手动复刻去购买我硬件清单的对应模块然后找到商家要驱动代码移植到你的工程然后调用相应的函数到我给你的main.c里面关于网络配置这一块读者需要自己去查阅机智云官方的指导书进行学习不过其实这个项目将联网这几个函数删掉也完全可以联网只是为了让这个项目高级那么一点罢了只要看懂我这些自己去找对应模块代码移植这个项目就可以轻而易举的复刻出来了希望我这篇文章可以帮助到你如果需要完整的工程可以私信我。

相关新闻