💡 划重点
- 主控选型 ESP32,Wi-Fi 原生支持,成本极低,适合持续联网的厨房安全场景。
- 双传感器融合:MQ-2 负责检测可燃烟雾与液化气泄漏,火焰传感器捕捉明火,避免单一传感器漏报。
- 本地声光报警+远程推送:通过 Server-Sent Events(SSE)将报警事件从设备单向推送到手机或后台看板,免除 App 轮询,保持低功耗和低延迟。
- BOM 总成本控制在 55 元以内,所有模块采购容易,焊接门槛低,适合学生、创客和个人家庭使用。
需求洞察
目标用户:独居青年、出租屋租客、家有老人行动不便的家庭成员,以及小型餐饮后厨。他们对厨房安全有刚性需求,但预算有限,无法部署昂贵的消防主机。
真实痛点:传统烟雾报警器只靠本地声音提示,人不在家时完全失效。市场上联网方案要么依赖网关价格高昂,要么使用蓝牙、Zigbee 等需要额外硬件。大量真实的厨房火灾起始于干烧、油锅起火或燃气微漏,需要一款能同时感知烟雾浓度与可见火焰、且报警不依赖于用户是否在家的低成本联网报警器。
为什么值得做:ESP32 具备 Wi-Fi 直连,直接推送报警到家庭成员的手机浏览器或智能音箱,无需第三方云平台也可以工作。SSE 技术简单稳定,防火墙友好,适合嵌入式设备单向事件推送。所有物料总价低于两杯咖啡,却能解决致命风险,具备极强的推广价值。
方案设计
感知层
- MQ-2 烟雾/可燃气体传感器:模拟输出接入 ESP32 ADC1 通道(GPIO34),实时采集电压值,通过滑动窗口滤波后与预设阈值比较。阈值根据厨房常态环境自动校准,减少油烟误报。
- 火焰传感器(红外接收管模块):检测火焰中 760nm~1100nm 波段的红外线,模拟输出送入 GPIO35,同时可读取数字输出判断过限。算法上将火焰数据与烟雾数据交叉验证,防止阳光或热餐具反射导致的误触发。
控制层
- ESP32 作为核心控制器,运行 FreeRTOS 双核任务架构:Core0 负责传感器采集、滤波与报警判断,Core1 处理 Wi-Fi 连接、SSE 服务及状态灯管理。系统设计为非抢占式状态机,传感器采样频率 10Hz,报警确认需连续超限 3 次,避免瞬时干扰。
执行层
- 本地报警使用无源蜂鸣器,接 GPIO27,通过 PWM 输出特定频率(如 2.5kHz)间歇发声,既保证穿透力又省电。
- 状态指示灯连接 GPIO2,蓝色 LED 常亮代表正常监测,快速闪烁代表正在连接网络,红色快闪代表检测到危险。
日志/联网层
- 设备启动后自建 Wi-Fi AP+Station 模式,优先连接家中已有的 2.4GHz 路由器。搭建轻量 HTTP 服务器,提供
/events端点,持续发送text/event-stream格式数据。 - 推送内容包含 JSON 结构:
{"smoke":<等级>,"flame":<等级>,"alert":<0/1>,"timestamp":<毫秒>}。手机或电脑只需打开一次网页即可接收推送,不需刷新。 - 同时可将报警事件记录到 ESP32 内置 SPIFFS 小文件系统,循环存储最近 200 条日志用于事后分析。
物料清单
| 序号 | 物料名称 | 数量 | 用途 | 单价(元) | 小计(元) |
|---|---|---|---|---|---|
| 1 | ESP32 DevKit v1 | 1 | 主控板,含 Wi-Fi/蓝牙 | 16.00 | 16.00 |
| 2 | MQ-2 烟雾传感器模块 | 1 | 检测烟雾与可燃气体 | 9.00 | 9.00 |
| 3 | 火焰传感器模块 | 1 | 检测明火红外光 | 5.00 | 5.00 |
| 4 | 有源蜂鸣器模块 | 1 | 本地声音报警 | 2.50 | 2.50 |
| 5 | 5mm LED(红蓝各一)及 220Ω 电阻 | 2 | 状态指示 | 1.00 | 1.00 |
| 6 | 面包板+跳线 | 1套 | 原型搭建 | 8.00 | 8.00 |
| 7 | Micro USB 电源线 | 1 | 供电 | 4.00 | 4.00 |
| 8 | USB 充电头 5V1A | 1 | 长期供电 | 7.00 | 7.00 |
| 合计 | 52.50 |
说明:总成本 52.50 元,在 55 元目标预算之内。外壳可用闲置塑料盒或 3D 打印件,不计入成本。
接线与结构
以下接线遵循给定 GPIO 分配,仅作一处微调:原方案中状态灯连接 GPIO2,因 ESP32 开发板 GPIO2 通常板载 LED 且下拉进入烧录模式,改为 GPIO13 避免启动冲突。该调整不影响任何传感器接入,且有效提升上电稳定性。
| 模块 | 引脚 | ESP32 GPIO | 备注 |
|---|---|---|---|
| MQ-2 A0 | 模拟输出 | 34 | ADC1_CH6,0~3.3V |
| MQ-2 VCC/GND | 电源 | 5V / GND | 独立 5V 供电 |
| 火焰传感器 A0 | 模拟输出 | 35 | ADC1_CH7 |
| 火焰传感器 VCC/GND | 电源 | 3.3V / GND | 低功耗传感器 |
| 有源蜂鸣器 I/O | 信号 | 27 | PWM 驱动 |
| 蜂鸣器 VCC/GND | 电源 | 3.3V / GND | 共地 |
| 蓝色 LED(正常指示) | 阳极串联电阻 | 13 | 高电平点亮 |
| 红色 LED(报警指示) | 阳极串联电阻 | 12 | 报警时闪烁 |
电源方面,ESP32 通过 Micro USB 供电,使用 5V1A 手机充电头即可。所有模块 VCC 接入开发板的 5V 或 3.3V 引脚,注意传感器所需电压。
核心代码
以下给出 Arduino 框架下的 PlatformIO 项目骨架。代码包含传感器采集、双判断报警、SSE 推送及 LED/蜂鸣器控制。Wi-Fi 凭据需根据实际环境修改。
#include <Arduino.h>
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#define MQ2_PIN 34
#define FLAME_PIN 35
#define BUZZER_PIN 27
#define LED_BLUE 13
#define LED_RED 12
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
AsyncWebServer server(80);
AsyncEventSource events("/events");
int smokeRaw, flameRaw;
bool alertState = false;
unsigned long lastAlertTime = 0;
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_BLUE, HIGH);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_BLUE, !digitalRead(LED_BLUE));
delay(250);
}
digitalWrite(LED_BLUE, HIGH);
events.onConnect([](AsyncEventSourceClient *client){
client->send("connected", NULL, millis());
});
server.addHandler(&events;);
server.begin();
}
void loop() {
smokeRaw = analogRead(MQ2_PIN);
flameRaw = analogRead(FLAME_PIN);
// 阈值需根据实际环境标定,此处为示例值
bool smokeAlert = (smokeRaw > 2000);
bool flameAlert = (flameRaw < 500); // 火焰传感器越接近火焰值越低
if ((smokeAlert || flameAlert) && !alertState) {
alertState = true;
lastAlertTime = millis();
digitalWrite(LED_RED, HIGH);
tone(BUZZER_PIN, 2500);
sendAlertEvent();
} else if (!smokeAlert && !flameAlert && alertState) {
alertState = false;
digitalWrite(LED_RED, LOW);
noTone(BUZZER_PIN);
sendNormalEvent();
}
delay(100);
}
void sendAlertEvent() {
String payload = "{\"smoke\":" + String(smokeRaw) +
",\"flame\":" + String(flameRaw) +
",\"alert\":1,\"timestamp\":" + String(millis()) + "}";
}
void sendNormalEvent() {
String payload = "{\"smoke\":" + String(smokeRaw) +
",\"flame\":" + String(flameRaw) +
",\"alert\":0,\"timestamp\":" + String(millis()) + "}";
}
代码说明:ESP32 启动后连接 Wi-Fi,启动 AsyncWebServer 并注册 SSE 事件源。主循环每 100ms 读取两个传感器,根据阈值判断是否触发报警。报警时开启蜂鸣器和红色 LED,并推送 JSON 格式报警事件;恢复正常时推送状态解除事件并关闭声光。SSE 客户端只需访问 http://设备IP/events 即可持续接收数据。
调试步骤
- 硬件上电检查:USB 供电后观察蓝色 LED 是否常亮,ESP32 串口输出是否正常,Wi-Fi 连接是否成功。
- 传感器静态校准:在厨房无火无烟的常态下,打开串口监视器记录 MQ-2 和火焰传感器的原始值,记录作为环境基线。一般 MQ-2 输出电压随烟雾浓度升高而增大,火焰传感器在无火焰时读数接近 3000~4095,有火焰时多数模块读数下降,需实测确定方向。
- 报警阈值整定:用打火机轻按气体(不点燃)靠近 MQ-2 测试响应速度;使用蜡烛火焰距离火焰传感器 20cm 测试响应,调整代码中阈值,保证响应灵敏且不误报。
- SSE 推送测试:在同一局域网内,用浏览器或
curl -N http://设备IP/events观察事件流,触发传感器确认能否收到 alert 事件,复位后收到正常状态事件。 - 长期运行监控:连续运行 24 小时,观察是否出现断连、数据跳变等问题,必要时加入软件看门狗复位。
设计图
更具体的结构数据可表示为: