基于ZIGBEE烟雾报警系统

基于ZIGBEE烟雾报警系统

目录:
1、任务书
2、设计思路
3、实现代码
4、上位机页面

1、任务书
1)检测地点的温度、湿度及烟雾浓度
2)前端服务平台实时反应显示监测地点的监测数据,若有异常及时反馈。根据设定的数据阈值和定时时间,判断温度、湿度、烟雾浓度数据是否达到报警要求(根据温湿度、烟雾浓度决定报警状态,不同浓度有不同报警状态),报警则发出光、声报警,并向手机/119 发送报警短信。
2、设计思路
主控采用STM32F103C8系列单片机,采用DHT11采集温湿度;MQ-2烟雾气敏模块采集烟雾浓度;zigbee无限串口收发作为通信模块;蜂鸣器作为报警方式;SIM800A作为通信模块;OLED作为显示屏幕。
通过单片机采集温湿度,烟雾浓度等信息,zigbee串口可以发送信息(该模块通过基础配置即可通信,配置成单对单),当出现烟雾浓度过高等或者温湿度异常,即发送报警信息,同时将报警信息发送到上位机(QT页面),上位机具备取消报警功能。
3、实现代码

#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include <DHT11.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define HUMstade 20
#define Temstade 20
#define Smokestade 30
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint8_t temperature = 1;  //温度
uint8_t humidity = 1;     //湿度
u8 buzz_stat=0;   //蜂鸣器状态  
u8 TIM2_i=0;   
u32 GAS_VALUE;
u32 DIS_GAS=0;
u32 oled_GAS;
u8 buff;
u8 Send_buff[13]="C9H30T22S69A0";
u8 KEY_state = 0;       //上位机是否取消报警 0:未处理  1:上位机取消报警   
u8 str1[]= "AT+CSCS=\"GSM\"\r\n";  //发送短息基础指令
u8 str2[]="AT+CMGF=1\r\n";
u8 str3[]="AT+CMGS=\"1********3\"\r\n";    //电话号码
u8 str4[]="Alarm:Have fire at home\r\n";   //发送内容
u8 str5 =0x1a;         //结束发送指令
u8 alarm_new_state=0;   //发送报警信息状态
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Alarm_Buzz(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc->Instance==ADC1)
    {
        GAS_VALUE=HAL_ADC_GetValue(&hadc1);  //获取ADC的值  12位ADC,0-4095
        GAS_VALUE=GAS_VALUE*100/(4095);         //将采集到的数据归一化,转化成百分制
    }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   //中断服务函数
{
    if(htim->Instance == TIM2)  //500ms
    {
        //Send_state=0;
        HAL_ADC_Start_IT(&hadc1);       //打开ADC中断
        DIS_GAS+=GAS_VALUE;             //累加气体数据的值,为后边均值做准备
        TIM2_i++;                       //一个计数变量累加
        OLED_ShowString(0,0,(u8*)"T=",16,1);
        OLED_ShowNum(16,0,temperature,2,16,1);   //显示温度
        OLED_ShowString(0,16,(u8*)"H=",16,1);
        OLED_ShowNum(16,16,humidity,2,16,1);     //显示湿度
        Send_buff[3]=humidity/10 +0X30;    //52    0x30---'0'
        Send_buff[4]=humidity%10 +0X30;
        Send_buff[6]=temperature/10 +0X30;
        Send_buff[7]=temperature%10 +0X30;
        OLED_Refresh();                            //刷新下屏幕
        if((oled_GAS>=30)&&KEY_state==0){ 
            buzz_stat=1;  //报警状态
        }
        else if((oled_GAS<30)||KEY_state==1){ 
            buzz_stat=0;             //正常状态
        }
        Alarm_Buzz();
        if(TIM2_i%4==0)                         //没四次进入一次执行
        {
            oled_GAS=DIS_GAS/4;   //滤波    烟雾浓度气体
            
            OLED_ShowString(48,0,(u8*)"G=",16,1);
            OLED_ShowNum(64,0,oled_GAS,2,16,1);        //气体采样数值 均值滤波
            Send_buff[9]=(oled_GAS)/10 +0X30;
            Send_buff[10]=(oled_GAS)%10 +0X30;
            if((oled_GAS>=30)&&KEY_state==0) buzz_stat=1;  //报警状态  如果烟雾浓度高于30,并且没有按下取消按键
            else if(KEY_state==1) buzz_stat=0;                         //正常状态   低电平蜂鸣器会叫
            Send_buff[12]=buzz_stat +0X30;   //把报警状态发送到上位机
            OLED_Refresh();     //更新显示
            HAL_UART_Transmit(&huart1,Send_buff,13,0xfff);    //发送到上位机的数据包 
                                                                //发送  阻塞发送
           DIS_GAS=0;                           //归零  重新累加
            
        }
 
        if(TIM2_i>127)  TIM2_i=0;    //计数清零
    }
}

 void Alarm_Buzz()   //报警信息
 {
     if(buzz_stat==1)  {   //报警
         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  //低电平  蜂鸣器报警
         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  //低电平 LED亮
         if(alarm_new_state>0) alarm_new_state=2;   //发送报警信息  //2
         alarm_new_state++;  //1->3->3   数据溢出
         
     }
     else {
         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);    //高电平,蜂鸣器不叫
         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  //高电平 LED亮
         alarm_new_state=0;           //发送状态清零
     }
 }
 
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)   //串口中断服务函数
{
    if(huart->Instance==USART1)    //上位机用的是串口1
    {
        
       if(buff=='A')    //取消
        {
           KEY_state=1;    //取消报警状态
            buff=' ';
        }
    }
}
void NewAlarn()    //手机短信报警信息
{
    if(alarm_new_state==1)   //开始发送报警信息
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
     HAL_UART_Transmit(&huart2,str1,15,0xfff);
    HAL_Delay(500);
 
    
    HAL_UART_Transmit(&huart2,str2,11,0xfff);
    HAL_Delay(500);

    
    HAL_UART_Transmit(&huart2,str3,23,0xfff);
    HAL_Delay(500);

    HAL_UART_Transmit(&huart2,str4,25,0xfff);
    HAL_Delay(500);
    
    HAL_UART_Transmit(&huart2,&str5,1,0xfff);
    HAL_Delay(500);  
     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    }
   
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);   //防止oled花屏
  DHT11_Strat();    //DHT11初始化
    OLED_Init();      //OLED初始化
    OLED_DisPlay_On();  //打开屏幕  
    HAL_TIM_Base_Start_IT(&htim2); //打开定时器2
    HAL_UART_Transmit(&huart1,(u8*)"C9H35T22S10A0",13,0xfff);//一开机给我们上位机发送初始化的数据
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

      OLED_ShowNum(48,16,KEY_state,1,16,1);  //按键状态
      OLED_Refresh();    //更新OLED显示
      if(((oled_GAS)<30) )KEY_state=0;  //
      DHT11_Read_Data(&temperature,&humidity);   //不断读取DHT11温湿度  采集速度比较慢  放中断卡死
      HAL_UART_Receive_IT(&huart1,&buff,1);
      //Alarm_Buzz();
        NewAlarn();
  }
//printf("公主号:三颗金子");//获取完整工程
  /* USER CODE END 3 */
}

4、上位机界面
登录初始界面
显示界面

本文首发于DF创客社区,作者:利刃1979 原文链接:http://mc.dfrobot.com.cn/thread-297112-1-1.html 1 作品介绍 1.1 作品功能 本作品借助物联网技术开发了一种烟雾报警系统,用于监控火灾、煤气泄漏等不安全事故的发生。该烟雾报警系统由无线传感器网络节点和监控系统两个部分组成。无线传感器网络节点由多个感知模块组成,用于实时检测多个监控区域的环境参数(如烟雾气体浓度、一氧化碳浓度等),并通过传感器网络将所有数据传输至监控系统。监控系统由下位机、PC上位机、手机APP三个部分组成:下位机安装在用户监控场所,通过无线传感器网络实时接收传感器节点的环境参数,并利用ZigBee网络和WIFI网络将监控数据分别发送至监控中心的PC上位机和用户手机的APP,若被监控的区域发生火灾、煤气泄漏等安全事故,三者将同时报警,从而极大程度地减低了无法获取安全事故发生的问题的风险,能够第一时间对受灾的地点进行抢救。 本作品可用于普通家庭住宅用户安全事故的监控,一旦发生安全事故,家庭住宅的下位机、小区物业部门安装的PC上位机、住户手机的APP三者将同时发出报警信号,能够第一时间对事故地点进行抢救。1.2 作品创新点 本作品的创新点在于: 1、通过下位机、PC上位机、手机APP三种终端报警的方式降低无法第一时间获取安全事故发生的风险,能够第一时间对事故地点进行抢救; 2、利用无线传感器网络的优势,将监控传感器和监控系统分离成独立的模块,实现了增加监控区域只需安装独立的传感器节点的特性,极大程度地提升了系统的可扩展性,同时使得系统具有较低的扩展成本。 救;同时,本作品可用于酒店、办公楼、商业广场、工厂操作间等需要大面积多区域监控的场所。 2 准备事项 2.1 作品原理 如图2.1所示,本作品由无线传感器网络节点和监控系统两个部分组成。 无线传感器网络节点对监控点的环境参数进行采集并处理,通过无线通信模块将处理后的数据发送至下位机。 监控系统由下位机、PC上位机和手机APP三个部分组成。下位机对无线传感器网络节点传输的环境参数进行分析,同时在LCD进行显示,并通过WIFI和ZigBee网络将数据分别发送至手机APP和PC上位机;若接收的环境参数数据满足安全事故发生的条件,下位机将通过语音模块发出报警提醒,同时手机APP和PC上位机也将发出报警信号;若用户发现发出的报警信号为误触信号,用户可通过按键或者语音识别模块关闭报警。 图2.1 作品系统设计框图 2.2 作品设计 2.2.1 主控制器作品传感器节点采用STM32F103C8T6型号的单片机,下位机采用STM32F103RCT6型号的单片机。 2.1.2 传感器 传感器模块选用了市面上常见也是应用较为广泛的两种传感器,分别是烟雾浓度传感器MQ-2和一氧化碳浓度传感器MQ-7。 MQ-2可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200至300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。 MQ-7是一氧化碳气体传感器,所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2),采用高低温循环检测方式低温(1.5V加热)检测一氧化碳,传感器的电导率随空气中一氧化碳气体浓度增加而增大,高温(5.0V加热)清洗低温时吸附的杂散气体。使用简单的电路即可将电导率的变化,转换为与该气体浓度相对应的输出信号。MQ-7气体传感器对一氧化碳的灵敏度高,这种传感器可检测多种含一氧化碳的气体,是一款适合多种应用的低成本传感器。 MQ-2、MQ-7模块的实物图片如图2.2所示。 图2.2 MQ-2与MQ-7传感器实物图片 2.2.3 无线传输模块 无线传输模块的功能是将传感器采集到的监测数据发送到监控点,本作品采用NRF24L01 2.4GHz无线传输模块。NRF24L01是一款工作在2.4至2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurstTM模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。极低的电流消耗,当工作在发射模式下发射功率为-6dBm时电流消耗为9mA接收模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值