火灾报警(烟雾&火焰检测)-STM8L

  • 最终实现效果
  • 设计目标
  • 硬件设计
    • 总电路图
    • 电源部分
    • 四方向火焰检测
    • 烟雾与温度检测
  • 软件设计

最终实现效果

设计目标

  1. 火焰检测报警(4方向),指示灯红色,蜂鸣器一直鸣叫。
  2. 烟雾报警,指示灯蓝色,蜂鸣器周期性鸣叫。
  3. 正常状态,指示灯绿色,蜂鸣器不叫。

硬件设计

总电路图

电源部分

电路供电可使用单个锂电池或外部5V供电,电路集成锂电池充电电路(TP4056),外部电源与锂电池供电自动切换,有外部供电时,使用外部电源,5V电源由SX1308经过升压得到,一个拨动开关控制系统电源(不控制锂电池充电,即系统未开,有外部供电也会对锂电池进行充电),3.3V由升压得到的5V经过稳压得到,火焰检测方向指示灯的电源可控,即可以控制指示灯是否显示。

四方向火焰检测

使用四个红外接收二极管作为火焰检测传感器,使用4路电压比较器LM339进行电压比较,检测到火焰输出低电平。可调整比较值VREF1,调整检测灵敏度。

烟雾与温度检测

烟雾检测使用MQ-2B烟雾传感器,温度使用NTC,分别设置比较阈值VREF2,VREF3,通过二路比较器LM393进行电压比较,输出端使用二极管来实现5V转3.3V。

软件设计

代码功能较为简单,有注释,就不多讲了。

#include "stm8l15x.h"//STM8L051/151公用库函数
#include "bsp_led.h"
#include "stdio.h"
void delay_us(u16 nCount);
void delay_ms(u16 nCount);
/**********************************************************************************************************
*   函 数 名: delay_us
*   功能说明: 微秒延时程序
*   形    参:nCount要延时的微秒数
*   返 回 值: 无
**********************************************************************************************************/
void delay_us(u16 nCount)
{nCount *= 3;while (--nCount);
}/**********************************************************************************************************
*   函 数 名: delay_ms
*   功能说明: 毫秒延时程序
*   形    参:nCount要延时的毫米数
*   返 回 值: 无
**********************************************************************************************************/
void delay_ms(u16 nCount)
{while (nCount--){delay_us(1000);}
}void UART1_Send_byte(unsigned char byte)  //发送一个8位的数据
{USART_SendData8(USART1, byte);//将接收到的数据发送出去while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void UART1_Send_str(unsigned char *str)   //发送字符串的数据
{while (*str){UART1_Send_byte(*str);str++;}
}
//将有符合整数转换为字符串
char *itoa(int num, char *str, int radix)
{char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //索引表unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数int i = 0, j, k; //i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。//获取要转换的整数的绝对值if (radix == 10 && num < 0) //要转换成十进制数并且是负数{unum = (unsigned) - num; //将num的绝对值赋给unumstr[i++] = '-'; //在字符串最前面设置为'-'号,并且索引加1}else unum = (unsigned)num; //若是num为正,直接赋值给unum//转换部分,注意转换后是逆序的do{str[i++] = index[unum % (unsigned)radix]; //取unum的最后一位,并设置为str对应位,指示索引加1unum /= radix; //unum去掉最后一位}while (unum);//直至unum为0退出循环str[i] = '\0'; //在字符串最后添加'\0'字符,c语言字符串以'\0'结束。//将顺序调整过来if (str[0] == '-') k = 1; //如果是负数,符号不用调整,从符号后面开始调整else k = 0; //不是负数,全部都要调整char temp;//临时变量,交换两个值时用到for (j = k; j <= (i - 1) / 2; j++) //头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1{temp = str[j]; //头部赋值给临时变量str[j] = str[i - 1 + k - j]; //尾部赋值给头部str[i - 1 + k - j] = temp; //将临时变量的值(其实就是之前的头部值)赋给尾部}return str;//返回转换后的字符串
}
void Init_Timer4(void)
{/* Init TIMER 4 */CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, ENABLE);//将主时钟信号送给定时器4(L系列单片机必需)/* HSI div by 1 --> Auto-Reload value: 16M / 64 = 1/4M, 1/4M / 1k = 250*/
//  TIM4_DeInit();TIM4_TimeBaseInit(TIM4_Prescaler_64, 250); //T=1ms  64分频 X=16M/64    中断溢出=X/250 进中断一次1msTIM4_SetCounter(250);TIM4_ClearFlag(TIM4_FLAG_Update);TIM4_ITConfig(TIM4_IT_Update, ENABLE);TIM4_Cmd(ENABLE);
}/* Includes ------------------------------------------------------------------*//* Private defines -----------------------------------------------------------*/
uint8_t Scan_Flag = 0;
uint16_t Fire_Scan_Count = 0;
uint16_t Smoke_Scan_Count = 0;
//uint8_t Temp_Humi_GET = 0;
uint8_t Warning_Flag = 0;
uint8_t Sec_Flag = 0;
uint8_t Sec_Count = 0;
uint8_t BEEP_Flag = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
uint8_t showstr[20] = {0};
void main(void)
{//    uint8_t i = 0;
//    int16_t Temp = 10;
//    uint16_t Humi = 20;
//    uint8_t data_temp = 0;uint8_t scan_temp = 0;/* Infinite loop *///使用内部HSI 16M 不分频CLK_HSICmd(ENABLE);//开始内部高频RCCLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);//HSI为系统时钟CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//不分频,16MCLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);//开启USART时钟
//SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA,ENABLE);//端口重映射,去掉注释之后USART1为PA2-TX、PA3-RX;注释之后USART1为TX-PC5、RX-PC6;复位之后USART会自动恢复至PC5、PC6USART_Init(USART1, (uint32_t)9600, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx)); //设置USART参数9600,8N1,接收/发送USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断USART_Cmd(USART1, ENABLE);//使能USARTInit_Timer4();enableInterrupts(); //中断使能LED_Init();      //LED GPIO 管脚初始化
//    LED_POWER_ON();GPIO_Init(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4, GPIO_Mode_In_PU_No_IT); //输入上拉无中断GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT); //输入上拉无中断GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_Out_PP_Low_Fast); //快速推挽输出默认低电平UART1_Send_str("\r\nHELLO,STM8L051!!!\r\n");while (1){if (Sec_Flag){if (++Sec_Count == 5){if ((Fire_Scan_Count >= 20)){Warning_Flag |= 0x80;//火灾警报}else{Warning_Flag &= 0x7D;}if (Smoke_Scan_Count >= 20){Warning_Flag |= 0x40;//烟雾警报}else{Warning_Flag &= 0xBF;}Fire_Scan_Count = 0;Smoke_Scan_Count = 0;Sec_Count = 0;}if ((Warning_Flag & 0x80) == 0x80)//火灾警报{LED2_L();LED_POWER_ON();LED1_H();BEEP_Flag = 1;}else{LED_POWER_OFF();LED1_L();if ((Warning_Flag & 0x40) == 0x40)//烟雾警报{LED2_L();LED3_H();BEEP_Flag = 2;}else{BEEP_Flag = 0;LED3_L();LED2_H();}}switch (BEEP_Flag){case 0:GPIO_ResetBits(GPIOA, GPIO_Pin_2);break;case 1:GPIO_SetBits(GPIOA, GPIO_Pin_2);break;case 2:GPIO_ToggleBits(GPIOA, GPIO_Pin_2);break;}Sec_Flag = 0;}if (Scan_Flag){scan_temp = GPIO_ReadInputData(GPIOB) & 0x1F;if (scan_temp != 0x1F){if ((scan_temp >> 4) == 0){Smoke_Scan_Count++;}else{Fire_Scan_Count++;}}scan_temp = GPIO_ReadInputData(GPIOC) & 0x10;//NTC检测if (scan_temp != 0x10)//温度过高{Fire_Scan_Count++;}Scan_Flag = 0;}}}#ifdef USE_FULL_ASSERT/*** @brief  Reports the name of the source file and the source line number*   where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval : None*/
void assert_failed(u8 *file, u32 line)
{/* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}
}
#endif

火灾报警(烟雾火焰检测)-STM8L相关推荐

  1. 基于视觉的烟雾/火焰检测数据集整理(检测、识别、分割)

    基于传感器的火灾预警系统,比较适用于较小空间. 随着视觉技术的发展,基于视觉的火灾预警系统,更适用于对森林等大范围场景进行 远距离监控1. 当前的烟雾火焰检测系统中,采用机器学习的视觉技术暂未广泛替代 ...

  2. 基于深度学习的火焰检测系统(YOLOv5清新界面版,Python代码)

    摘要:火焰检测系统用于检测日常是否出现火情,支持图片.视频.摄像头等多方式检测火焰.实现火灾警报功能,提供了登录注册界面.在介绍系统实现原理的同时,给出部分Python的实现代码以及PyQt的UI界面 ...

  3. 基于51单片机烟雾浓度检测超限报警Proteus仿真

    资料编号:158   下面是相关功能视频演示: 158-基于51单片机烟雾浓度检测超限报警Proteus仿真(源码+仿真+全套资料) 功能讲解: 采用51单片机作为CPU,ADC0832作为AD转换模 ...

  4. 毕设 深度学习 python opencv 火焰检测识别 火灾检测

    文章目录 0 前言 1 基于YOLO的火焰检测与识别 2 课题背景 3 卷积神经网络 3.1 卷积层 3.2 池化层 3.3 激活函数: 3.4 全连接层 3.5 使用tensorflow中keras ...

  5. 新型的火灾报警系统设有多个设备联动的模式,其能够服务于智能化以及化的火灾报警

    1 概述 进入新时期后,信息化手段正在全方面渗透于智能城市的全方面建设中,而与之有关的消防系统也具备了智能化的显著特征.然而不应当忽视,当前多数消防系统仍然设置为独立式的,针对各种类型的消防报警设施也 ...

  6. 智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)

    目录 mainPro.c(主函数) 指令工厂 inputCommand.h voiceControl.c(语音控制) socketControl.c(网络线程) 控制工厂 contrlEquipmen ...

  7. 用c语言编声光报警子程序,C语言编程的智能火灾报警监测系统

    用C语言来编写程序的火灾报警系统 智能火灾报警监测系统 [摘 要]本系统由检测装置烟雾传感器SS-168.光电传感器ST-178和温度传感器DS18B20,显示装置LCD和声光报警装置组成,并由单片机 ...

  8. 基于matab GUI的图形处理火焰检测系统

    编辑 换一个视频得到数据结果 网络和多媒体技术的普及,红外图像中的火焰检测 识别技术的科研价值在各领域得到充分展现.防灾救灾方面,红外图像中的火焰检测 识别技术能够迅速确定和锁定被灰尘遮盖的地震.矿难 ...

  9. 基于51单片机的火灾报警系统设计

    摘要 随着现代家庭用火.用电量的增加,家庭火灾发生的频率越来越高.火灾报警器也随之被广泛应用于各种场合. 本课题所研究的无线多功能火灾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2.A ...

  10. 毕业设计 单片机火灾报警系统设计与实现 - stm32 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 烟雾传感器介绍 3.1 类型 3.2 MQ系列传感器介绍 3.3 模块介绍 4 系统设计 4.1 自诊断故障报警功能 4.2 烟雾浓度显示 4 ...

最新文章

  1. 转:经典论文翻译导读之《Google File System》
  2. 试用MarkDown
  3. 服务器重启导致无法启动MySQL
  4. dict过滤 python_小猿圈解析Python开发的技巧都有哪些?
  5. 精确打印程序的运行时间
  6. 《FilthyRichClients》读书笔记(一)-SwingのEDT
  7. HDFS写入HBase
  8. mysql 附近3公里的,mysql 查询附近N公里内数据
  9. 深度解读旷视招股书:这557页带你看懂中国AI公司的生意经
  10. Thinkphp6.0博客源码分享【Wofl-blog】
  11. python将json转化为数组_将JSON转换为数组?
  12. 服装尺寸 html,国家标准规范服装尺寸表.doc
  13. F - Endless Walk
  14. 践行社会责任的路上,中概股们看到了怎样的风景?
  15. 多种汉语方言语音落地应用,微软智能语音解锁更多交互场景
  16. agv机器人无人仓系统-开源agv控制系统opentcs
  17. Android帧动画框架
  18. 技校考计算机专业大专考什么科目,高职专科考试科目有哪些 考什么内容
  19. 假设检验中原假设和备择假设的选取问题
  20. BFGS(Broyden-Fletcher-Goldfarb-Shanno)

热门文章

  1. SystemV 共享内存
  2. 聊天室 作业 java_java大作业设计报告-java聊天室.docx
  3. 高频面试题—聊一下Euraka的注册原理
  4. Windows10怎么下载MySQL,详解Windows10下载mysql的教程图解
  5. dh算法c语言,openssl开源程序dh算法解析之dh_key.c
  6. kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
  7. 关于hibernate的mappedBy的使用:
  8. GET 和 POST 的区别
  9. C语言实现蔡勒公式,用于给定年月日计算出当前是周几
  10. 画出psnr_计算图像的峰值信噪比PSNR以及均方根误差MSE