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

打印 上一主题 下一主题

主题 815|帖子 815|积分 2445

媒介:

 源代码下载链接:


  • https://download.csdn.net/download/m0_74712453/90071668

功能演示


 

     基于stm32的火灾检测系统
  简介

这是最近别人让我帮他做的一个毕业设计,总体来说非常简单,半天都不需要就可以实现,我做完之后,计划开源在这里让各人进行学习,我们先看一下他的使命书吧:
   系统以STM32微控制器为焦点,通过集成多种火灾探测传感器、通信模块和报警装置,构建了一个完备的火灾报警系统。系统架构重要包罗以下几个部分:
  - **主控芯片**:STM32F103系列微控制器,负责处理全部逻辑和控制使命。
- **火灾探测传感器**:包罗烟雾传感器、火焰传感器、温度传感器等,用于及时监测楼宇内的火灾隐患。
- **通信模块**:通过Wi-Fi或以太网等通信方式,实现系统与云端服务器或当地监控中心的数据交互。
- **报警装置**:包罗声光报警器、短信报警器、电话拨号器等,用于在火灾发生时发出警报信号。
- **用户界面**:通过LCD表现屏或手机APP,提供友好的用户操作界面和及时信息表现。
   硬件资料

#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
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
  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"
  3. #include "Timer.h"
  4. #include "led.h"
  5. #include "MQ2.h"
  6. #include "ds18b20.h"
  7. #include "bsp_buzzer.h"
  8. #include "fire.h"
  9. #include "usart.h"
  10. #include "OLED.h"
  11. #include "gizwits_product.h"
  12. #define Refresh_Sensor_time 2000 //2000ms刷新一次传感器数值
  13. u8 BaoJin=0;//bit 0-7 bit0:温度,bit1:烟雾,bit2:火焰 bit为0表示该项正常,为1该项报警
  14. u16 Sensor_time=Refresh_Sensor_time;
  15. short real_template=0;//温度值
  16. u32 nongdu=0;//气体浓度
  17. u8 huoyan_state=1;//火焰状态 1:未检测到火焰 0:检测到火焰
  18. short template_Max=500;//温度最大值,超过报警,50.0摄氏度
  19. u32 nongdu_Max=1050000000;//浓度最大值,超过报警
  20. void Show_ZJM(void);//显示主界面
  21. void Baojin_Handle(void);//报警处理
  22. void Get_Sensor(void);//获取传感器值,并判断报警状态
  23. int main(void)
  24. {
  25.         OLED_Init();
  26.         OLED_ShowString(2,1,"initialing...");
  27.         for(int i=0;i<20;i++)
  28.         {
  29.                 delay_ms(1000);
  30.         }
  31.         OLED_Clear();
  32.        
  33.         /*模块初始化*/
  34.         LED_Init();
  35.         ADC_Sensor_Init();
  36.         DS18B20_Init();
  37.         FIRE_CONFIG();
  38.         Buzzer_Init();
  39.         Timer_Init();//定时器4,1ms进入一次中断
  40.         uart1_init(9600);//初始化串口1,与esp8266通讯
  41.         Timer2_Init();//初始化定时器2,为机智云提供1ms心跳
  42.         /*机智云初始化*/
  43.         userInit();
  44.         gizwitsInit();
  45.        
  46.        
  47.         /*显示主界面*/
  48.         Show_ZJM();
  49.        
  50.         while (1)
  51.         {
  52.                 /*刷新传感器数值,显示在oled上,并且根据数值判断此时报警状态*/
  53.                 Get_Sensor();
  54.                 /*根据报警状态,进行对应的处理*/
  55.                 Baojin_Handle();
  56.                 /*联网,上传数据,接收下发数据,这个项目不需要处理上面发下来发数据,这个函数其实没用*/
  57.                 gizwitsHandle((dataPoint_t *)&currentDataPoint);
  58.         }
  59. }
  60. //温(0) 度(1) 烟(2) 雾(3) 火(4) 焰(5) ℃(6) 报(7) 警(8) 正(9) 常(10) 异(11)
  61. void Show_ZJM(void)//显示主界面
  62. {
  63.         OLED_Clear();
  64.        
  65.         //温度:    ℃
  66.         OLED_ShowF16x16(1,1,0);
  67.         OLED_ShowChar(1,5,':');
  68.         OLED_ShowF16x16(1,10,6);
  69.        
  70.         //烟雾:   ppm
  71.         OLED_ShowF16x16(2,1,2);
  72.         OLED_ShowChar(2,5,':');
  73.         OLED_ShowString(2,10,"ppm");
  74.        
  75.         //火焰:
  76.         OLED_ShowF16x16(3,1,4);
  77.         OLED_ShowF16x16(3,3,5);
  78.         OLED_ShowChar(3,5,':');
  79. }
  80. void Baojin_Handle(void)//报警处理
  81. {
  82.         if(BaoJin==0)//状况正常
  83.         {
  84.                 BUZZER_OFF;//关闭蜂鸣器
  85.                 LED_TIP_OFF;//确保灯是关闭状态
  86.         }
  87.         else
  88.         {
  89.                 BUZZER_ON;//打开蜂鸣器
  90.         }
  91.        
  92.         if(BaoJin&0x01)//温度报警
  93.         {
  94.                 OLED_ShowF16x16(1,13,7);
  95.                 OLED_ShowF16x16(1,15,8);
  96.         }
  97.         else
  98.         {
  99.                 OLED_ShowString(1,13,"    ");
  100.         }
  101.        
  102.         if(BaoJin&0x02)//烟雾报警
  103.         {
  104.                 OLED_ShowF16x16(2,13,7);
  105.                 OLED_ShowF16x16(2,15,8);
  106.         }
  107.         else
  108.         {
  109.                 OLED_ShowString(2,13,"    ");
  110.        
  111.         }
  112.        
  113.         if(BaoJin&0x04)//火焰报警
  114.         {
  115.                 OLED_ShowF16x16(3,6,7);
  116.                 OLED_ShowF16x16(3,8,8);
  117.         }
  118.         else //显示正常
  119.         {
  120.                 OLED_ShowF16x16(3,6,9);
  121.                 OLED_ShowF16x16(3,8,10);
  122.         }
  123.        
  124. }
  125. void Get_Sensor(void)//获取传感器值
  126. {
  127.        
  128.         if(Sensor_time==0)
  129.         {
  130.                 TIM_Cmd(TIM4,DISABLE);
  131.                 TIM_SetCounter(TIM4,0);
  132.                 Sensor_time=Refresh_Sensor_time;
  133.                 TIM_Cmd(TIM4,ENABLE);
  134.         }
  135.         if(real_template>template_Max)
  136.         {       
  137.                 BaoJin|=0x01;
  138.         }
  139.         else
  140.         {
  141.                 BaoJin&=0xfe;
  142.         }
  143.         if(nongdu>nongdu_Max)
  144.         {
  145.                 BaoJin|=0x02;
  146.         }
  147.         else
  148.         {
  149.                 BaoJin&=0xfd;
  150.         }
  151.         if(huoyan_state==0)
  152.         {
  153.                 BaoJin|=0x04;
  154.         }
  155.         else
  156.         {
  157.                 BaoJin&=0xfb;
  158.         }
  159.                
  160. }
复制代码
总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表