STM3项目开源:厨房火灾安全检测系统(代码+原理图+仿真)
·
一、前言
实物项目成品
仿真项目成品:

哔哩哔哩开源视频链接(复制浏览器打开):
https://www.bilibili.com/video/BV17fbi66Es9/?
(资料分享见文末)
二、项目功能简介
功能:
1、STM32 为主控核心,完成系统数据处理。
2、OLED 屏幕显示烟雾浓度、环境温度、明火状态。
3、MQ‑4 检测烟雾/天然气/甲烷;DS18B20 采集环境温度;火焰传感器检测厨房明火。
4、三 个按键实现参数设置、数值加、数值减,可配置温度、气体浓度报警上限。
5、温度超限:屏幕闪烁,风扇启动降温。
6、气体浓度超限:屏幕闪烁,风扇排气,舵机关闭燃气通道。
7、检测到明火:屏幕显示火焰标识,水泵模拟灭火,舵机关闭燃气通道,蜂鸣器声光报警。
8、ESP8266‑WiFi 上传数据至手机端,手机可查看温度、烟雾浓度,出现明火显示火焰图标。
9、手机端远程修改温度、气体浓度报警阈值。
三、PCB硬件设计

四、原理图设计

五、程序设计
部分代码如下:
#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "gpio.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "timer.h"
#include "usart1.h"
#include "esp8266.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //中断优先级配置
I2C_Configuration(); //IIC初始化
delay_ms(200);
OLED_Init(); //OLED液晶初始化
OLED_CLS(); //清屏
OLED_ShowStr(0, 2, " loading... ", 2,0);//显示加载中
ESP8266_Init(); //ESP8266初始化
Adc_Init(); //adc初始化
KEY_GPIO_Init(); //按键引脚初始化
MOTOR_GPIO_Init(); //舵机初始化
DS18B20_GPIO_Init(); //温度初始化
DS18B20_Init(); //初始化显示
OLED_CLS(); //清屏
displayInitInterface(); //显示初始界面
TIM3_Init(99,71); //定时器初始化,定时100us
//Tout = ((arr+1)*(psc+1))/Tclk ;
//Tclk:定时器输入频率(单位MHZ)
//Tout:定时器溢出时间(单位us)
while(1)
{
keyscan(); //按键扫描
if(setn == 0)
{
if(shuaxin == 1) //大概300ms刷新一次数据
{
Get_Temperature(); //获取温度
Get_Smoke(); //获取烟雾
shuaxin = 0;
}
if(FLAME == 0) //检测到火焰
{
delay_ms(10);
if(FLAME == 0)
{
if(flameFlag == 0)
{
OLED_DrawBMP(88,4,120,8,(unsigned char *)BMP); //显示火焰图片
}
flameFlag = 1;
RELAY = 1; //检测到有火,开启水泵
}
}
else
{
if(flameFlag == 1)
{
OLED_ShowStr(88, 4, " ", 2,0);
OLED_ShowStr(88, 6, " ", 2,0);
}
flameFlag = 0;
RELAY = 0; //关闭水泵
}
if(temperature>=setTempValue || smoke>=setSmokeValue || flameFlag)BEEP=1;else BEEP=0; //检测到温度烟雾超标火焰蜂鸣器报警
if(temperature>=setTempValue || smoke>=setSmokeValue)FAN=1;else FAN=0; //烟雾温度超标都开启风扇
if(smoke>=setSmokeValue || flameFlag)PWM=15;else PWM=5; //烟雾超标或者是检测到火焰,舵机动作,模拟关闭阀门
}
UsartSendReceiveData();
delay_ms(10);
}
}
void TIM3_IRQHandler(void)//定时器3中断服务程序,用于记录时间
{
static u16 timeCount1 = 0;
static u16 timeCount2 = 0;
static u16 timeCount3 = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志位
timeCount1 ++;
if(timeCount1<=PWM)MOTOR=1; else MOTOR=0;
if(timeCount1>=200) //20ms一周期
{
timeCount1 = 0;
}
timeCount2++;
if(timeCount2 >= 3000) //300ms
{
timeCount2 = 0;
shanshuo = !shanshuo;
shuaxin = 1;
}
timeCount3++;
if(timeCount3 >= 10000) //1000ms
{
timeCount3 = 0;
sendFlag = 1;
}
}
}
六、包含内容

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


所有评论(0)