💡 划重点
- 本方案基于 ESP32 主控,配合 MQ-2 烟雾传感器、火焰传感器、有源蜂鸣器与状态灯,实现厨房烟雾+火焰双重报警。系统支持本地声光报警,同时通过 Server-Sent Events(SSE)将现场状态实时推送到手机或电脑浏览器。整体物料成本控制在 55 元以内,适合家庭厨房、出租屋、小型餐饮后厨等场景。核心价值在于“看得见烟气,也看得见明火”——既响应
需求洞察
目标用户:独自下厨的年轻人、家中老人、小型餐饮店经营者。真实痛点:做饭时油温过高导致锅底冒烟,人却因为炒菜噪音或离开接电话而未能及时察觉;等到发现时往往已经出现明火,厨房又是家庭中最容易引发火灾的区域。传统烟感报警器往往只报警不联网,人不在现场就收不到消息,也无法判断报警是真火情还是油烟干扰。为什么值得做:成本低、安装快、可复现,尤其“双重检测”能明显降低误报漏报——烟雾和火焰互为备份,哪怕一种传感器被油烟污染或失灵,另一种仍可能触发报警。
方案设计
感知层:MQ-2 模拟信号接 GPIO34 读取烟雾浓度,输出范围随气体浓度升高而升高;火焰传感器数字输出接 GPIO35,检测红外光谱判断是否出现明火。控制层:ESP32 负责持续采样、滤波、阈值判断和状态机切换。执行层:GPIO27 驱动有源蜂鸣器,报警时发出高分贝断续鸣叫;GPIO2 驱动状态灯,正常呼吸、预警告警快闪。日志/联网层:ESP32 连接家庭 Wi-Fi,通过内嵌 Web 服务器提供 SSE 接口,浏览器打开页面即可看到烟雾浓度数值、火焰触发状态和设备心跳,无需安装 App。SSE 相比 WebSocket 实现更简单、代码量更少,适合单向推送现场数据。
物料清单
| 物料 | 数量 | 用途 | 估算单价(元) |
|---|---|---|---|
| ESP32 DevKitC | 1 | 主控芯片 | 22.0 |
| MQ-2 烟雾传感器 | 1 | 检测烟雾/可燃气体 | 8.5 |
| 火焰传感器模块 | 1 | 检测明火红外信号 | 4.5 |
| 有源蜂鸣器 5V | 1 | 声光报警 | 2.0 |
| LED 状态灯 5mm | 1 | 正常/报警指示 | 0.3 |
| 面包板 + 杜邦线 | 1 套 | 快速搭建电路 | 6.5 |
| 220Ω 电阻 | 1 | LED 限流 | 0.2 |
| 外壳/固定盒(可选) | 1 | 保护电路 | 8.0 |
| 合计 | 52.0 |
接线与结构
- MQ-2:A0 接 GPIO34,VCC 接 3.3V,GND 接 GND。
- 火焰传感器:D0 接 GPIO35,VCC 接 3.3V,GND 接 GND。
- 有源蜂鸣器:正极接 GPIO27,负极接 GND。
- 状态灯:LED 阳极串联 220Ω 电阻后接 GPIO2,阴极接 GND。
说明:GPIO35 是输入专用引脚,适合读取数字传感器;GPIO34 是 ADC 输入通道,适合采集 MQ-2 的模拟信号。若将 MQ-2 接在 GPIO36 或 GPIO39 也能工作,但 34 的编号更直观,且连续 ADC 采样在 ESP32 内部具备独立采样保持电路,读取更稳定。接线无需微调。
核心代码
使用 PlatformIO + Arduino 框架,提供可编译骨架:
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "your_ssid";
const char* password = "your_password";
const int mqPin = 34;
const int flamePin = 35;
const int buzzerPin = 27;
const int ledPin = 2;
WebServer server(80);
int smokeValue = 0;
bool flameDetected = false;
bool alarmActive = false;
unsigned long lastSseTime = 0;
String sseClients = "";
void handleSse() {
server.sendContent("HTTP/1.1 200 OK\r\n");
server.sendContent("Content-Type: text/event-stream\r\n");
server.sendContent("Cache-Control: no-cache\r\n");
server.sendContent("Connection: keep-alive\r\n\r\n");
}
void sendSseEvent() {
String data = "data: {\"smoke\":" + String(smokeValue) +
",\"flame\":" + String(flameDetected) +
",\"alarm\":" + String(alarmActive) + "}\n\n";
server.sendContent(data);
}
void setup() {
Serial.begin(115200);
pinMode(mqPin, INPUT);
pinMode(flamePin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
server.on("/events", handleSse);
server.begin();
}
void loop() {
server.handleClient();
smokeValue = analogRead(mqPin);
flameDetected = (digitalRead(flamePin) == LOW);
// 烟雾或火焰任一触发即报警
alarmActive = (smokeValue > 2000) || flameDetected;
if (alarmActive) {
for (int i = 0; i < 5; i++) {
digitalWrite(buzzerPin, HIGH);
digitalWrite(ledPin, HIGH);
delay(150);
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, LOW);
delay(150);
}
} else {
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, (millis() / 500) % 2); // 呼吸闪烁
}
if (millis() - lastSseTime > 1000) {
sendSseEvent();
lastSseTime = millis();
}
}
调试步骤
- 先只烧录代码,不接传感器,打开串口监视器,确认 ESP32 能正常启动并连接 Wi-Fi。
- 分别接入 MQ-2 和火焰传感器。对着 MQ-2 哈气或靠近烟雾,串口打印 smokeValue 应明显上升并超过 2000,触发蜂鸣器和 LED 快闪。
- 用打火机打火但不点燃物品,靠近火焰传感器,串口打印 flame 变为 true,报警立即触发。
- 调整 MQ-2 的电位器或修改代码中的阈值,降低油烟误报率,目标为正常炒菜不报警、油锅剧烈冒烟时报警。
- 浏览器访问
http://<ESP32_IP>/events,确认能收到 SSE 数据流,数据格式为 JSON 且每秒更新一次。 - 用手遮挡火焰传感器,模拟断电失效场景,确认烟雾报警仍能独立工作,验证双重备份逻辑。
设计图
说明:感知输入对应 MQ-2 与火焰传感器,控制处理对应 ESP32 阈值判断与状态决策,执行反馈对应蜂鸣器和状态灯,数据上报对应通过 SSE 将现场数据推送到浏览器端。四层形成完整闭环:感知-判断-动作-通知,即使本地报警被忽略,远程也能收到实时状态变化,适合厨房无人或人不在厨房时使用。