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

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

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

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

引用
CSDN
1.
https://blog.csdn.net/lihuadetongzhuo/article/details/146459435

本文介绍了一个基于STM32的森林火灾报警系统,该系统能够实时监测森林环境中的烟雾浓度、温度、湿度等参数,并在检测到异常时发出声光报警。系统通过无线通信模块将数据发送至手机APP,实现远程监控。文章详细介绍了系统的硬件组成、工作原理和代码实现,适合对嵌入式系统和物联网应用感兴趣的读者参考学习。

实现功能

  • 实时监测森林环境中的烟雾浓度、温度、湿度等参数
  • 当检测到的烟雾浓度超过设定阈值时,系统立即发出声光报警
  • 通过按键设置检测参数,如烟雾浓度阈值、报警温度等
  • 采用OLED屏幕实时显示烟雾浓度、温度、湿度等数据
  • 检测到明火或环境异常时,通过蜂鸣器发出报警
  • 将检测数据通过无线通信模块发送至手机APP,实现远程监控

主要元器件

  • 主控芯片:选用STM32单片机,负责数据采集、处理和输出控制
  • 烟雾传感器:采用MQ-2型烟雾传感器,实现对森林环境中烟雾浓度的检测
  • 温湿度传感器:采用DHT11温湿度传感器,实时监测环境温湿度
  • OLED显示屏:用于显示烟雾浓度、温度、湿度等数据
  • 声光报警模块:用于发出报警信号
  • 无线通信模块:采用WIFI,实现与手机APP的数据传输
  • 按键模块:用于设置检测参数

系统工作原理

系统以STM32单片机作为主控制器,结合DHT11、MQ-2和火焰传感器,构建了一个高效的森林火灾检测系统。通过DHT11传感器实时监测温湿度,MQ-2传感器检测空气中的烟雾浓度,火焰传感器则用于检测火焰的存在,确保对森林环境变化的全面感知。

系统通过这些传感器数据的实时采集与处理,能够及时发现异常情况,帮助管理人员进行预警和应急响应。为了便于管理人员实时查看森林环境状态,系统采用OLED液晶显示屏呈现温湿度、烟雾浓度等关键数据,使监控变得直观易懂。

同时系统采用ESP8266 WiFi模块实现无线通信,将实时采集到的数据传输至远程平台。通过与手机APP的连接,管理人员可以在任何地方通过APP查看数据和接收预警信息,实现远程监控。

系统还具备灵活的报警设置功能,管理人员可以根据森林环境的实际需求设置烟雾浓度的报警阈值。当烟雾浓度超过设定值或火焰被检测到时,系统会触发蜂鸣器进行声音报警,并通过APP向管理人员发送预警提示。此功能有助于及时发现火灾隐患,提高森林防火工作效率,减少火灾带来的损失。

代码实现

STM32代码采用C语言,标准库编写,软件是keil5,代码都有详细注释,看不懂可以截图问我

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>	
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "OLED.h"
#include "IO_Init.h"
#include "bsp_adc.h"
#include "DHT11.h"
extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];// ADC1转换的电压值通过MDA方式传到SRAM
float light,mq135,fire;
u8 mq135_set=30,fire_set=40;
u8 fire_sta;
u8 app_check() //手机APP的指令控制
{
    u8 app_key;
    app_key=0;
    if(USART1_RX_STA>5){
        delay_ms(50);
        if(strstr((const char *)USART1_RX_BUF,"GPIO0=0")){
            app_key= 1;
        }
        if(strstr((const char *)USART1_RX_BUF,"GPIO0=1")){
            app_key= 2;
        }
        if(strstr((const char *)USART1_RX_BUF,"GPIO0=2")){
            app_key= 3;
        }
        if(strstr((const char *)USART1_RX_BUF,"GPIO0=3")){
            app_key= 4;
        }
        if(strstr((const char *)USART1_RX_BUF,"GPIO0=4")){
            app_key= 5;
        }
        USART1_RX_STA=0;
        memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));
    }
    return app_key;
}
void key_deal()
{
    u8 key;
    key = Key_Scan();  //按键处理
    if(key==0){
        key = app_check();  //没有按键按下就处理APP数据
    }
    if(key==1){
    }
    if(key==2){  //阈值增加
        if(mq135_set<99)
            mq135_set++;
    }
    if(key==3){  //阈值减少
        if(mq135_set>10)
            mq135_set--;
    }
}
int main(void) //主函数
{	
    u8 str[60],i,time=50,Flag=0;
    SystemInit();
    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //   2组中断分组
    Beep_Init();		//蜂鸣器初始化
    Beep = 0;			//测试蜂鸣器
    OLED_Init();        //OLED初始化
    Beep = 1;			//关闭蜂鸣器
    usart1_Init(115200);//串口1,ESP8266 WIFI
    usart2_Init(115200);//串口2,调试用
    Esp8266_AP_Init();//ESP8266初始化为AP模式,会产生一个热点,WIFI,123456789
    ADCx_Init();  //ADC模拟量采集引脚初始化
    Key_Init();		//按键引脚初始化
    
  while(1)
    {
        key_deal();	//按键的处理判断
        delay_ms(100);
        if(time++>10)  //10次100ms就是1s一次
        {
            time=0;
            fire = 100-ADC_ConvertedValue[0]/40.95;   	 //ADC数据换成火焰监测数据
            mq135 = ADC_ConvertedValue[1]/40.95-1;    	//ADC数据转换成气体数据
            get_temperature_and_humidity();				//温湿度数据
            //间隔发送手机APP数据,不能发太快
            if(Flag){
                Flag=0;
                i= sprintf((char *)str,"%.0fW%.0fW%.1fW%dW ",temp,humi,mq135,fire_sta);
                UsartPrintf(ESP8266_USART,"AT+CIPSEND=0,%d\r\n",i);
            }
            else{
                UsartPrintf(ESP8266_USART,(char *)str);
                Flag=1;	
            }
        }
        //报警逻辑处理,数据异常蜂鸣器报警
        if((fire_sta)||(mq135>mq135_set))
        {
            Beep = !Beep;
        }
        else
            Beep = 1;
        
        //以下是显示逻辑部分
        OLED_printf(0,0,"Temp:%.0fC   ",temp);
        OLED_printf(0,2,"Humi:%.0f%%  ",humi);
        OLED_printf(0,4,"MQ:%4.1f%% %2d%%",mq135,mq135_set);
        if(fire>fire_set)
            fire_sta = 1;
        else
            fire_sta = 0;
        if(fire_sta==1)
            OLED_printf(0,6,"Fire   ");
        if(fire_sta==0)
            OLED_printf(0,6,"NO Fire ");
        
    }
}
  

原理图/PCB

原理图和PCB都使用立创EDA绘制,对新手较为友好。可以导出为AD格式的文件

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号