💡 划重点
- 主控:ESP32,兼顾模拟采集、逻辑判断与联网上报。
- 感知:MQ-2 监测烟雾/可燃气体,火焰传感器监测明火红外。
- 执行:有源蜂鸣器现场报警,状态灯指示正常/预警/报警。
- 联网:ESP32 提供 Server-Sent Events 事件流,浏览器或手机页可实时接收报警。
- 成本:整套物料控制在 55 元内,适合家庭厨房快速部署。
需求洞察
目标用户是普通家庭、独居老人、出租房住户,以及经常做饭但容易忘记关火的人群。厨房安全的核心痛点不是“没有报警器”,而是“单一传感器误报或漏报”:只装烟雾传感器,对明火响应偏慢;只装火焰传感器,对无焰燃气泄漏又不敏感。更麻烦的是,传统报警器只在现场响,人不在厨房或外出时完全不知道。
因此,这个项目值得做:用 MQ-2 和火焰传感器做双重确认,降低单一传感器的误报概率;用 ESP32 把报警事件通过 Server-Sent Events 推到手机或网页,实现远程感知;成本压到 55 元内,不需要复杂布线,USB 供电即可运行。它既是一个硬件编程练手项目,也能作为厨房安全的最小可行产品。
方案设计
感知层:MQ-2 的 A0 输出模拟电压,接 ESP32 的 ADC 引脚,读取烟雾/可燃气体浓度;火焰传感器输出数字或模拟信号,接 GPIO35,检测明火红外。两者采样周期设为 200 毫秒,连续 3 次超阈值才确认报警,避免瞬时干扰。
控制层:ESP32 负责 ADC 采样、阈值比较、状态机管理。状态分为正常、预警、报警。烟雾值超过预警阈值或火焰触发时进入预警;两者同时触发或任一持续超限时进入报警。报警后蜂鸣器鸣响,状态灯快闪。
执行层:有源蜂鸣器接 GPIO27,高电平鸣响;状态灯接 GPIO2,正常慢闪、预警快闪、报警常亮。若后续扩展,可加继电器切断燃气阀,但当前成本内不纳入。
日志/联网层:ESP32 连接 Wi-Fi 后启动 HTTP 服务,提供 /events 端点作为 SSE 流。每次状态变化时推送一条 JSON 事件,包含烟雾值、火焰状态、报警级别、时间戳。浏览器端用 EventSource 订阅,手机可保持页面打开接收通知。SSE 比 WebSocket 更轻量,适合低频报警事件。
物料清单
| 名称 | 数量 | 用途 | 估算单价 | 小计 |
|---|---|---|---|---|
| ESP32 开发板 | 1 | 主控与 Wi-Fi | 25 元 | 25 元 |
| MQ-2 烟雾传感器模块 | 1 | 烟雾/可燃气体检测 | 8 元 | 8 元 |
| 火焰传感器模块 | 1 | 明火红外检测 | 5 元 | 5 元 |
| 有源蜂鸣器 | 1 | 现场声音报警 | 2 元 | 2 元 |
| LED 与电阻 | 1 套 | 状态指示 | 1 元 | 1 元 |
| 面包板与杜邦线 | 1 套 | 临时搭建 | 8 元 | 8 元 |
| USB 数据线 | 1 | 供电与烧录 | 5 元 | 5 元 |
| 合计 | 54 元 |
接线与结构
按给定建议接线:MQ-2 的 A0 接 GPIO34,火焰传感器数字输出接 GPIO35,蜂鸣器接 GPIO27,状态灯接 GPIO2。GPIO34 和 GPIO35 在 ESP32 上仅支持输入,适合接传感器,不会与输出功能冲突。MQ-2 加热丝通常需要 5V,模块 VCC 接 5V,GND 共地;若模块模拟输出高于 3.3V,需在 A0 与 GPIO34 之间加分压电阻,或选用 3.3V 兼容模块。火焰传感器可接 3.3V,数字输出直接进 GPIO35。蜂鸣器正极接 GPIO27,负极接 GND;LED 串 220Ω 电阻接 GPIO2 与 GND。
结构上,ESP32 和传感器固定在面包板或小塑料盒内,MQ-2 靠近灶台上方,火焰传感器朝向灶台区域,避免阳光直射和油烟长期附着。USB 线从侧面引出,保持通风。
核心代码
以下为 Arduino 骨架,使用 ESP32 内置 WebServer 和 Wi-Fi 库,可编译上传。SSE 部分用循环推送事件,实际长连接可换 ESPAsyncWebServer 增强。
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "你的WiFi";
const char* password = "你的密码";
#define MQ2_PIN 34
#define FLAME_PIN 35
#define BUZZER_PIN 27
#define LED_PIN 2
WebServer server(80);
int smokeValue = 0;
bool flameDetected = false;
String alarmLevel = "正常";
void sendEvent() {
String json = "{\"smoke\":" + String(smokeValue) +
",\"flame\":" + String(flameDetected ? "true" : "false") +
",\"level\":\"" + alarmLevel + "\"}";
server.send(200, "text/event-stream", "data: " + json + "\n\n");
}
void handleEvents() {
server.send(200, "text/event-stream", "");
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(FLAME_PIN, INPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
server.on("/events", HTTP_GET, handleEvents);
server.begin();
}
void loop() {
server.handleClient();
smokeValue = analogRead(MQ2_PIN);
flameDetected = digitalRead(FLAME_PIN) == LOW;
if (flameDetected || smokeValue > 2500) {
alarmLevel = "报警";
digitalWrite(LED_PIN, HIGH);
} else if (smokeValue > 1800) {
alarmLevel = "预警";
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
} else {
alarmLevel = "正常";
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
}
sendEvent();
delay(1000);
}
调试步骤
- 先只接 ESP32 与串口,确认开发板可烧录、Wi-Fi 可连接。
- 接 MQ-2,预热 3 分钟,打开串口监视器观察 A0 数值,记录洁净空气基线。
- 用打火机气体靠近 MQ-2,观察数值上升,设定预警阈值和报警阈值。
- 接火焰传感器,用打火机明火靠近,确认数字输出翻转,串口打印火焰状态。
- 接蜂鸣器和 LED,手动触发条件,检查声音与灯光是否正常。
- 联调:浏览器访问
http://设备IP/events,用 EventSource 或简单页面查看 SSE 数据。 - 模拟烟雾和火焰,观察报警级别、蜂鸣器、LED 与 SSE 推送是否一致。若误报多,提高阈值或增加连续确认次数。