文章目录
- 一、火灾报警
- 1.题目要求
- 2.思路
- 2.1 主控
- 2.2 传感器
- 2.3 设定阈值--按键
- 2.4 报警和通风
- 2.5 OLED显示
- 2.6 电源部分
- 2.7 远程终端
- 3.仿真
- 3.1 未仿真时
- 3.2 仿真开始,界面1
- 3.3 切换界面2
- 3.4 切换界面3
- 4.仿真程序
- 4.1 程序说明
- 4.2 主函数
- 4.3 OLED显示函数
- 二、总结
一、火灾报警
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仿真。
感谢你的观看!