基于STM32的火灾报警装置的Proteus仿真


一、火灾报警

1.题目要求

1、检测温度、烟雾浓度、火焰、一氧化碳浓度
2、设定温度阈值,高于阈值,蜂鸣器报警
3、设置烟雾浓度阈值,高于阈值报警,步进电机启动通风
4、检测环境火焰,发现火焰,蜂鸣器报警
5、oled显示温度、烟雾浓度、是否有火焰、一氧化碳浓度
6、手机端显示显示温度、烟雾浓度、是否有火焰、一氧化碳浓度

在这里插入图片描述

2.思路

2.1 主控

由系统框图可知我们需要一个单片机,这里首选还是STM32。因为有好几个传感器在Proteus仿真里面是没有的,得用滑动变阻器模拟,到时候就需要用到AD外设。

在这里插入图片描述

2.2 传感器

温度传感器Proteus仿真里面有常用的温度传感器DS18B20和温湿度传感器DHT11,这里选择DS18B20.

在这里插入图片描述
剩下的烟雾传感器,一氧化碳传感器,火焰传感器分别用滑动变阻器和开关去模拟。

在这里插入图片描述

2.3 设定阈值–按键

设定阈值的方式采用按键的形式,因为有多个阈值,所以这里规定了3个按键。

一个按键来切换显示的界面,在哪个界面下,另外两个按键就可以加减该界面下阈值的大小,是不是很方便。

在这里插入图片描述

2.4 报警和通风

报警和通风也是常见的,这里不详细描述了。

在这里插入图片描述
在这里插入图片描述

2.5 OLED显示

OLED显示温度、烟雾浓度、是否有火焰、一氧化碳浓度,要显示中文,这需要用到取模软件,如下所示:

在这里插入图片描述

参数设置为:

在这里插入图片描述

2.6 电源部分

在这里插入图片描述

2.7 远程终端

手机端显示显示温度、烟雾浓度、是否有火焰、一氧化碳浓度,仿真肯定是不能和手机端通讯的,所以老规矩放个远程终端。

在这里插入图片描述

3.仿真

3.1 未仿真时

在这里插入图片描述

3.2 仿真开始,界面1

在这里插入图片描述

3.3 切换界面2

在这里插入图片描述

3.4 切换界面3

CO浓度大于阈值,声光报警,开启风扇通风
在这里插入图片描述

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms

烟雾传感器:ADC1(PA0)

CO传感器:ADC2(PA1)

DS18B20温度传感器:DAT(PA3)

模拟Wifi模块(Uart1):9600(PA9:tx1,PA10:rx1)

KEY按键:
KEY1(PB0)
KEY2(PB1)
KEY3(PB2)

火焰传感器:FLAME(PB4)

风扇:FAN(PB10)

OLED显示屏:SCL(PB12),SDA(PB13)

蜂鸣器:BUZZER(PB15)

4.2 主函数

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	UserSystemInit();//用户配置初始化		
	while (1)
	{			
		if (stSysTime.flg._100ms + TEN_MILLISECOND < Time_millis()) //10ms
		{
			stSysTime.flg._10ms = Time_millis();
			Key_Scan();//按键扫描						
		}
		if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms
		{
			stSysTime.flg._50ms = Time_millis();						
			ADC_Scan();	//烟雾/CO浓度检测							
		}				
		if(stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
		{
			stSysTime.flg._100ms = Time_millis();					
			Receive_data_Handel();//数据接收判断 			
			Warning_function();//预警							
			OLED_Handel();//OLED显示								
			IWDG_ReloadCounter();//清开门狗 				
		}
		if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s
		{
			stSysTime.flg._1s = Time_millis();	
      Printf_Task();//打印任务			
		}
  }
}

4.3 OLED显示函数

/*******************************************************************************
 * 函数名:OLED_Handel
 * 描述  :OLED显示
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :100ms
*******************************************************************************/
void OLED_Handel(void)
{  	
		if(Interface_switching == 0)
		{		
				OLED_Show_Character(1,1,0,16);//温
				OLED_Show_Character(1,2,1,16);//度	
				OLED_Show_Character(1,3,2,16);//:			
			
				temperature = DS18B20_Get_Temp();
				temperature = (-1) * temperature;
		 
//				printf("temperature=%d\r\n",temperature);	 
			 
				Temp_High = temperature / 10;
				if(Temp_High < 10)
				{
					if(Temperature_jump == 1)
					{
							Temperature_jump = 0;
							OLED_Part_Clear(1,8,9);
					}
					OLED_ShowNum(1,10,Temp_High,1);			
				}
				else
				{
					Temperature_jump = 1;
					OLED_ShowNum(1,9,Temp_High,2);				
				}
				
		    if(Temp_High > Temp_Threshold)
				{
		        Warning1 = 1;					
				}
				else
				{
		        Warning1 = 0;							
				}				
				
				Temp_Low = temperature % 10;
				OLED_ShowNum(1,12,Temp_Low,1);
				OLED_ShowString(1, 11, ".");	
				OLED_Show_Character(1,7,3,16);	
				OLED_ShowString(1, 15, "C");	

				OLED_Show_Character(2,1,4,16);//阈
				OLED_Show_Character(2,2,5,16);//值	
				OLED_Show_Character(2,3,2,16);//:		

				OLED_ShowNum(2,10,Temp_Threshold,2);					
				
				OLED_Show_Character(2,7,3,16);	
				OLED_ShowString(2, 15, "C");					
				
				if(FLAME_Flag)
				{
					OLED_Show_Character(4,1,8,16);//火
					OLED_Show_Character(4,2,9,16);//焰	
					OLED_Show_Character(4,3,2,16);//:			

					OLED_Show_Character(4,5,10,16);//有						
				}
				else
				{
					OLED_Show_Character(4,1,8,16);//火
					OLED_Show_Character(4,2,9,16);//焰	
					OLED_Show_Character(4,3,2,16);//:	

					OLED_Show_Character(4,5,11,16);//无								
				}					
		}	
    else if(Interface_switching == 1)
		{		
				OLED_Show_Character(1,1,6,16);//烟
				OLED_Show_Character(1,2,7,16);//雾	
				OLED_Show_Character(1,3,2,16);//:		

		    if(ADC1_Value > ADC1_Threshold)
				{
		        Warning2 = 1;					
				}
				else
				{
		        Warning2 = 0;							
				}			
			
			  if(ADC1_Value < 10)
				{
						OLED_Part_Clear(1,8,9);					
				    OLED_ShowNum(1,10,ADC1_Value,1);						
				}
				else
				{					
				    OLED_ShowNum(1,9,ADC1_Value,2);	
				}					

				OLED_ShowString(1, 12, "%");				

				OLED_Show_Character(2,1,4,16);//阈
				OLED_Show_Character(2,2,5,16);//值	
				OLED_Show_Character(2,3,2,16);//:			

				OLED_ShowNum(2,9,ADC1_Threshold,2);					
				
				OLED_ShowString(2, 12, "%");					
		}
    else if(Interface_switching == 2)
		{		
				OLED_ShowString(1, 1, "CO");	
				OLED_Show_Character(1,2,2,16);//:	

		    if(ADC2_Value > ADC2_Threshold)
				{
		        Warning3 = 1;					
				}
				else
				{
		        Warning3 = 0;							
				}					
			
			  if(ADC2_Value < 10)
				{
						OLED_Part_Clear(1,8,9);								
				    OLED_ShowNum(1,10,ADC2_Value,1);						
				}
				else
				{					
				    OLED_ShowNum(1,9,ADC2_Value,2);	
				}				

				OLED_ShowString(1, 12, "%");				

				OLED_Show_Character(2,1,4,16);//阈
				OLED_Show_Character(2,2,5,16);//值	
				OLED_Show_Character(2,3,2,16);//:			

				OLED_ShowNum(2,9,ADC2_Threshold,2);					
				
				OLED_ShowString(2, 12, "%");				
		}		
}

二、总结

今天主要讲了基于STM32的火灾报警装置的Proteus仿真。

感谢你的观看!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值