文章目录
一、火灾报警
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仿真。
感谢你的观看!