厨房作为家庭火灾高发区域,其安全隐患往往被日常使用所掩盖。这套基于STM32的厨房安全系统,是我在参与某智能家居项目时实际落地的解决方案。系统通过多传感器融合检测技术,实现了对烟雾、可燃气体、温湿度、明火的全方位监控,并具备本地联动控制和远程报警功能。
核心设计思路是构建一个"感知-决策-执行"的闭环系统:传感器网络实时采集环境参数,STM32进行阈值判断和逻辑处理,最终通过继电器阵列驱动执行机构(风扇、水泵、阀门等)。特别加入了ESP8266 WiFi模块,使得报警信息能够推送至手机APP,解决了传统报警器无法远程通知的痛点。
实际部署中发现,单纯依靠声光报警在用户外出时存在盲区,因此WiFi远程通知成为必备功能。同时自动/手动双模式设计,确保了系统在异常情况下仍可人工干预。
选用STM32F103C8T6作为主控芯片,主要基于三点考量:
最小系统电路设计要点:
c复制// 典型时钟配置代码(使用HSE)
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
MQ-2烟雾传感器:
MQ-4天然气传感器:
c复制// DHT11读取示例
void DHT11_Start(void){
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = DHT11_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
Delay_ms(18);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
Delay_us(30);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
c复制// 舵机角度控制函数
void Servo_SetAngle(uint8_t angle){
uint16_t pulse = 500 + angle * 2000 / 180;
TIM_SetCompare1(TIM3, pulse);
}
系统采用状态机架构,主要工作流程如下:
初始化阶段:
主循环任务:
中断服务:
c复制while(1){
if(sys_tick % 5 == 0){ // 1秒周期
Read_DHT11(&temp, &humi);
gas_val = ADC_Read(MQ2_CH);
wifi_heartbeat++;
}
if(KEY_Scan() == KEY_SET){
Enter_Config_Mode();
}
if(wifi_new_cmd){
Process_Wifi_Cmd();
wifi_new_cmd = 0;
}
}
为提高检测可靠性,采用三级判断机制:
初级过滤:硬件滤波(RC低通)+软件去抖
中级验证:多传感器交叉验证
高级决策:引入历史数据分析
c复制#define FIRE_THRESHOLD 800
#define GAS_THRESHOLD 650
uint8_t Check_Fire_Status(void){
static uint16_t fire_buf[5];
static uint8_t idx = 0;
fire_buf[idx++] = ADC_Read(FLAME_CH);
if(idx >=5) idx = 0;
uint16_t avg = (fire_buf[0]+fire_buf[1]+fire_buf[2]+fire_buf[3]+fire_buf[4])/5;
return (avg > FIRE_THRESHOLD) ? 1 : 0;
}
采用自定义轻量级协议,帧格式如下:
| 字节 | 内容 | 说明 |
|---|---|---|
| 0 | 0xAA | 帧头 |
| 1 | 数据长度N | 不含头尾 |
| 2 | 命令类型 | 0x01:上报 0x02:控制 |
| 3~N+2 | 数据内容 | JSON格式 |
| N+3 | 校验和 | 前面所有字节累加和 |
| N+4 | 0x55 | 帧尾 |
典型数据包示例:
AA 0D 01 {"T":26,"H":45,"G":320,"S":120} 2A 55AA 08 02 {"FAN":1,"PUMP":0} 45 55| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| MQ-2始终高报警 | 传感器污染或老化 | 用酒精清洁/更换新传感器 |
| DHT11读取失败 | 时序不精确或线缆过长 | 缩短连线至<20cm,检查上拉电阻 |
| WiFi频繁断开 | 电源干扰或信号弱 | 添加100μF电容,调整天线位置 |
| 舵机抖动不动作 | 电源功率不足 | 单独5V/2A供电,加大滤波电容 |
气体传感器阈值设置:
系统响应时间优化:
功耗控制技巧:
传感器布局原则:
执行机构安装:
采用MIT App Inventor快速开发的控制界面,核心功能包括:
关键实现代码块:
javascript复制function processData(packet){
let obj = JSON.parse(packet);
if(obj.T > temp_limit){
playAlarm("温度超标!当前:"+obj.T);
setIndicatorColor("red");
}
updateChart([obj.T, obj.H, obj.G/10]);
}
可选两种低成本方案:
阿里云IoT平台:
本地NAS存储:
针对电池供电场景的改进措施:
硬件层面:
软件层面:
c复制void Enter_LowPower_Mode(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
SystemInit(); // 唤醒后需重新初始化时钟
}
实际测试中,优化后的系统待机电流可从45mA降至8mA,使2000mAh电池可支持约10天工作。如需更长续航,建议采用太阳能充电方案,配合18650锂电池组。