目录
一、设计背景和意义
1.1设计背景
在智能化浪潮席卷各行各业的今天,厨房作为家庭生活中频繁使用且风险较高的空间,其安全问题越来越受到关注。根据相关统计数据显示,家庭火灾事故中相当一部分源于厨房,原因主要包括燃气泄漏、火源未熄、温度过高、电器老化等。传统厨房安全管理方式往往依赖人工巡视或单一报警器,存在反应滞后、功能单一、不可远程监控等明显弊端,无法满足现代家庭对安全、智能、便捷的高标准要求。
1.2设计意义
课题采用STM32F103C8T6为主控平台,结合MQ-5燃气传感器、DHT11温湿度传感器、火焰传感器等多种常见传感器模块,配合ESP8266 WiFi模块接入机智云平台,具有良好的硬件适配性与平台兼容性。通过软件层面对系统逻辑的精细设计,不仅提升了系统的实用价值,也为后续拓展更多智能联动场景(如联控窗户、电磁阀等)提供了技术基础。
从学术研究角度看,本课题涵盖了传感器数据处理、嵌入式控制、无线通信、云平台交互、状态机逻辑控制等多个计算机与电子工程交叉领域,能够有效提升学生在软硬件协同开发、系统集成设计以及项目实践中的综合能力。同时,课题选题紧贴社会需求,注重工程实践,具有较高的现实价值和推广前景,符合"以应用促科研、以科研带实践"的工程教育导向。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能厨房安全监控系统
三、硬件功能简介
3.1项目功能详解
- 传感器:检测液化气和烟雾浓度、火情、环境温湿度
- 数据显示:0.96OLED屏幕
- 执行机构:舵机(燃气阀门)、风扇(通风)、水泵(灭火)、蜂鸣器(声光报警)
- 云平台:通过ESP8266 WIFI联网后,接入机智云平台
- App远程监控:App远程监控传感器数据,控制执行机构
- 数据设定:系统通过按键或APP设定阈值,切换自/手动模式
- 手动模式:手机App或按键控制开关执行机构
- 自动模式:燃气浓度超过阈值,自动打开通风扇,声光报警;检测到火焰,自动开启水泵灭火,声光报警
3.2元器件清单
- 主控STM32F103C8T6
- ESP8266联网WiFi
- 0.96OLED显示屏幕
- MQ-5燃气传感器
- DHT11温湿度传感器
- 火焰传感器
- 舵机(模拟阀门)
- 风扇(通风)、水泵(灭火)
- 蜂鸣器+LED声光报警
- 按键
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
cpp
#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>
extern const unsigned char BMP[];
char display[16]; //显示缓存区
short temperature=0; //温度
u8 setTempValue = 40; //温度上限
u8 setSmokeValue = 60; //烟雾上限
u8 alarmFlag = 0x00; //蜂鸣器报警标志
u16 smoke=0; //烟雾
u8 setn=0; //记录设置按键按下的次数
u8 PWM=5; //PWM调节值,用于控制舵机
bool shanshuo=0;
bool shuaxin=0;
bool sendFlag = 1;
bool flameFlag=0;
void displayInitInterface(void) //显示初始页面
{
u8 i;
for(i = 0;i < 6;i ++)OLED_ShowCN(i*16+16,0,i+0,0); //显示中文: 厨房安全检测
for(i = 0;i < 2;i ++)OLED_ShowCN(i*16,4,i+6,0); //显示中文: 温度
for(i = 0;i < 2;i ++)OLED_ShowCN(i*16,6,i+8,0); //显示中文: 烟雾
OLED_ShowChar(32,4,':',2,0);
OLED_ShowChar(32,6,':',2,0);
}
void Get_Temperature(void) //获取温度
{
temperature=ReadTemperature();
if(temperature>=setTempValue){
if(!(alarmFlag&0x01)){
alarmFlag|=0x01;
shanshuo = 0;
}
}else{
alarmFlag&=0xFE;
}
if(temperature>=setTempValue && shanshuo){
OLED_ShowStr(40, 4," ", 2,0);
}else{
sprintf(display," %d",temperature);
OLED_ShowStr(40, 4, (u8*)display, 2,0);//显示温度
OLED_ShowCentigrade(68, 4); //显示摄氏度
}
}
void Get_Smoke(void) //获取烟雾浓度
{
u16 test_adc=0;
/* 获取烟雾浓度 */
test_adc = Get_Adc_Average(ADC_Channel_9,10);//读取通道9的10次AD平均值
smoke = test_adc*99/4096;//转换成0-99百分比
if(smoke>=setSmokeValue){
if(!(alarmFlag&0x02)){
alarmFlag|=0x02;
shanshuo = 0;
}
}else{
alarmFlag&=0xFD;
}
if(smoke>=setSmokeValue && shanshuo){
OLED_ShowStr(40, 6," ", 2,0);
}else{
printf(display," %02d %%",smoke);
OLED_ShowStr(40, 6, (u8*)display, 2,0);//显示温度
}
}
void displaySetValue(void) //显示设置值
{
if(setn==1){
OLED_ShowChar(56,4,setTempValue%100/10+'0',2,0);//显示
OLED_ShowChar(64,4,setTempValue%10+'0',2,0);//显示
}
if(setn==2){
OLED_ShowChar(56,4,setSmokeValue%100/10+'0',2,0);//显示
OLED_ShowChar(64,4,setSmokeValue%10+'0',2,0);//显示
OLED_ShowChar(72,4,'%',2,0);
}
}
void keyscan(void) //按键扫描
{
u8 i;
if(KEY1 == 0) //设置键
{
delay_ms(20);
if(KEY1 == 0){
while(KEY1 == 0);
setn ++;
if(setn == 1){
OLED_CLS();//清屏
for(i = 0;i < 4;i ++)OLED_ShowCN(i*16+32,0,i+10,0);//显示:设置温度
OLED_ShowCentigrade(75, 4); //显示摄氏度
}
if(setn == 2){
for(i = 0;i < 4;i ++)OLED_ShowCN(i*16+32,0,i+14,0);//显示:设置烟雾
OLED_ShowChar(80,4,' ',2,0);
}
if(setn >= 3){
setn = 0;
OLED_CLS();//清屏
displayInitInterface();
}
displaySetValue();
}
}
if(KEY2 == 0) //加键
{
delay_ms(80);
if(KEY2 == 0)
{
if(setTempValue < 99 && setn==1)setTempValue++;
if(setSmokeValue < 99 && setn==2)setSmokeValue++;
displaySetValue();
}
}
if(KEY3 == 0) //减键
{
delay_ms(80);
if(KEY3 == 0)
{
if(setTempValue > 0 && setn==1)setTempValue--;
if(setSmokeValue > 0 && setn==2)setSmokeValue--;
displaySetValue();
}
}
}
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
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);
}
}
七、项目资料包内容
