文章目录
一、前言
实物项目成品:

仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):
https://www.bilibili.com/video/BV124eS6qEWn/?vd_source=10da4d04d580bd6b34f7298120737c50
(资料分享见文末)
二、项目功能简介
【开源】STM32单片机实验室消防预警控制系统(代码 + 原理图 + 仿真)-编号:CY26045
功能介绍:
(1)OLED 屏幕实时显示温度、烟雾浓度、可燃气体浓度、火焰检测状态;
(2)独立按键可手动控制继电器通断,并设置各传感器报警阈值;
(3)当采集温度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启;
(4)当烟雾浓度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启;
(5)当可燃气体浓度大于设定阈值,蜂鸣器声光报警,继电器驱动风扇开启通风;
(6)火焰传感器检测到火焰,蜂鸣器声光报警,继电器启动水泵灭火;火焰报警优先级最高,即便温度、烟雾或可燃气体已经触发风扇,检测到火焰时水泵仍会开启;
(7)搭载 WiFi 模块,手机 APP 可查看全部监测数据、修改传感器阈值、远程控制继电器。
三、PCB设计

四、原理图设计

五、程序设计
代码如下():
c
#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "OLED.h"
#include "ds18b20.h"
#include "timer.h"
#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "usart1.h"
#include "stdint.h"
unsigned int MQ=0;
short temperature=0;
unsigned int yanwu;
unsigned char setTempValue=35;
unsigned int set_yanwu=65;
unsigned char set_MQ=60;
bool mode = 0;
bool shuaxin = 0;
bool shanshuo = 0;
u8 buff[30];//参数显示缓存数组
u8 count;
u8 sendflag=0;
unsigned char setn=0;
//采集
void displayMQ(void)
{
MQ=(float)Get_Adc_Average(1,3)*3.3/0.4095;
if(MQ>set_MQ && shanshuo)
{
OLED_ShowString(3,11," ");
}
else
{
sprintf((char*)buff,"%4dppm ",MQ);
OLED_ShowString(3,11,(char*)buff); //显示可燃气体
}
}
//采集烟雾
void displayyanwu(void)
{
yanwu=30*(Get_Adc_Average(0,3)*3.3/4095.0);
if(yanwu>set_yanwu && shanshuo)
{
OLED_ShowString(2,11," ");
}
else
{
sprintf((char*)buff,"%2dppm ",yanwu);
OLED_ShowString(2,11,(char*)buff); //显示烟雾
}
}
//采集温度
void displayTemperature(void)
{
temperature=DS18B20_Get_Temp();
if(temperature>setTempValue*10 && shanshuo)
{
OLED_ShowString(1,11," ");
}
else
{
if(temperature!=0)
{
sprintf((char*)buff,"%d.%dC",temperature/10,temperature%10);
OLED_ShowString(1,11,(char*)buff);
}
}
}
void displaySetValue(void)
{
if(setn == 1)
{
if(shanshuo)
{
OLED_ShowString(2,11," ");
}
else
{
sprintf((char*)buff,"%2dC",setTempValue);
OLED_ShowString(2,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_yanwu);
OLED_ShowString(3,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_MQ);
OLED_ShowString(4,11,(char*)buff);
}
}
if(setn == 2)
{
if(shanshuo)
{
OLED_ShowString(3,11," ");
}
else
{
sprintf((char*)buff,"%2dC",setTempValue);
OLED_ShowString(2,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_yanwu);
OLED_ShowString(3,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_MQ);
OLED_ShowString(4,11,(char*)buff);
}
}
if(setn == 3)
{
if(shanshuo)
{
OLED_ShowString(4,11," ");
}
else
{
sprintf((char*)buff,"%2dC",setTempValue);
OLED_ShowString(2,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_yanwu);
OLED_ShowString(3,11,(char*)buff);
sprintf((char*)buff,"%2dppm ",set_MQ);
OLED_ShowString(4,11,(char*)buff);
}
}
}
void keyscan(void)
{
if(KEY1 == 0)
{
delay_ms(20);
if(RELAY2==1)delay_ms(50);
if(KEY1 == 0)
{
while(KEY1 == 0);
if(setn == 0)
{
mode = !mode;
if(mode==0)
{
OLED_ShowChinese(4,4,19);
OLED_ShowChinese(4,5,20);
}
else
{
RELAY1=0;
RELAY2=0;
OLED_ShowChinese(4,4,21);
OLED_ShowChinese(4,5,22);
}
}
}
}
if(KEY2 == 0)
{
delay_ms(20);
if(KEY2 == 0)
{
while(KEY2 == 0);
BEEP=0;
if(mode==0)
{
setn ++;
RELAY1=0;
RELAY2=0;
}
if(setn == 1)
{
OLED_Clear();
}
if(mode==1)
{
RELAY1=~RELAY1;;
}
OLED_ShowChinese(1,3,16);
OLED_ShowChinese(1,6,17);
//显示"环境温度:"
OLED_ShowChinese(2, 1, 0);
OLED_ShowChinese(2, 2, 1);
OLED_ShowChinese(2, 3, 2);
OLED_ShowChinese(2, 4, 3);
OLED_ShowChar(2, 9, ':');
//显示"烟雾浓度:"
OLED_ShowChinese(3, 1, 23);
OLED_ShowChinese(3, 2, 24);
OLED_ShowChinese(3, 3, 25);
OLED_ShowChinese(3, 4, 26);
OLED_ShowChar(3, 9, ':');
OLED_ShowChinese(4, 1, 8);
OLED_ShowChinese(4, 2, 9);
OLED_ShowChinese(4, 3, 10);
OLED_ShowChinese(4, 4, 11);
OLED_ShowChar(4, 9, ':');
displaySetValue();
}
}
if(KEY3 == 0)//加
{
delay_ms(20);//
if(KEY3 == 0 )
{
while(KEY3 == 0);
if(setn == 0 && mode==1)
{
RELAY2=~RELAY2;
}
if(setn == 2)
{
if(set_yanwu<99)set_yanwu++;
}
if(setn == 1)
{
if(setTempValue<99)setTempValue++;
}
if(setn == 3)
{
if(set_MQ<99)set_MQ++;
}
displaySetValue();
}
}
if(KEY4 == 0)//减
{
delay_ms(20);//
if(RELAY2==1)delay_ms(50);
if(KEY4 == 0 )
{
while(KEY4 == 0);
if(setn == 0 && mode==1)
{
//RELAY2=~RELAY2;
}
if(setn == 2)
{
if(set_yanwu>0)set_yanwu--;
}
if(setn == 1)
{
if(setTempValue>0)setTempValue--;
}
if(setn == 3)
{
if(set_MQ>0)set_MQ--;
}
displaySetValue();
}
}
}
int main(void)
{
delay_init();
NVIC_Configuration();
delay_ms(500);
Adc_Init();
KEY_GPIO_Init();
DS18B20_Init();
OLED_Init(); //OLED初始化
OLED_Clear();
OLED_ShowString(2,1," Loading... ");
delay_ms(1000);
OLED_Clear();
//显示"环境温度:"
OLED_ShowChinese(1, 1, 0);
OLED_ShowChinese(1, 2, 1);
OLED_ShowChinese(1, 3, 2);
OLED_ShowChinese(1, 4, 3);
OLED_ShowChar(1, 9, ':');
//显示"烟雾浓度"
OLED_ShowChinese(2, 1, 23);
OLED_ShowChinese(2, 2, 24);
OLED_ShowChinese(2, 3, 25);
OLED_ShowChinese(2, 4, 26);
OLED_ShowChar(2, 9, ':');
//显示"光照强度:"
OLED_ShowChinese(3, 1, 8);
OLED_ShowChinese(3, 2, 9);
OLED_ShowChinese(3, 3, 10);
OLED_ShowChinese(3, 4, 11);
OLED_ShowChar(3, 9, ':');
//显示"工作模式:"
OLED_ShowChinese(4,1,14);
OLED_ShowChinese(4,2,15);
OLED_ShowChar(4, 5, ':');
while(1)
{
keyscan();
if(setn == 0)
{
if(shuaxin == 1)
{
shuaxin = 0;
displayMQ();
displayyanwu();
displayTemperature();
if(mode==0)
{
if(flameFlag==0)
{
RELAY2=1;
}
else
{
RELAY2=0;
}
if(MQ>set_MQ||temperature>setTempValue*10||yanwu>set_yanwu)
{
RELAY1=1;
}
else RELAY1=0;
if(MQ>set_MQ||temperature>setTempValue*10||yanwu>set_yanwu|| flameFlag==0)
{
BEEP=~BEEP;
}
else BEEP=0;
OLED_ShowChinese(4,4,19);
OLED_ShowChinese(4,5,20);
}
else
{
BEEP=0;
OLED_ShowChinese(4,4,21);
OLED_ShowChinese(4,5,22);
}
}
}
if(setn!=0)
{
displaySetValue();
}
delay_ms(10);
}
}
六、包含内容

七、资料分享
资料获取:请查看主页介绍搜索或观看开源视频获取