💡 划重点

  • 本方案基于 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

接线与结构

说明: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();
  }
}

调试步骤

  1. 先只烧录代码,不接传感器,打开串口监视器,确认 ESP32 能正常启动并连接 Wi-Fi。
  2. 分别接入 MQ-2 和火焰传感器。对着 MQ-2 哈气或靠近烟雾,串口打印 smokeValue 应明显上升并超过 2000,触发蜂鸣器和 LED 快闪。
  3. 用打火机打火但不点燃物品,靠近火焰传感器,串口打印 flame 变为 true,报警立即触发。
  4. 调整 MQ-2 的电位器或修改代码中的阈值,降低油烟误报率,目标为正常炒菜不报警、油锅剧烈冒烟时报警。
  5. 浏览器访问 http://<ESP32_IP>/events,确认能收到 SSE 数据流,数据格式为 JSON 且每秒更新一次。
  6. 用手遮挡火焰传感器,模拟断电失效场景,确认烟雾报警仍能独立工作,验证双重备份逻辑。

设计图

厨房烟雾+火焰双重报警结构flow
1
感知输入
2
控制处理
3
执行反馈
4
数据上报

说明:感知输入对应 MQ-2 与火焰传感器,控制处理对应 ESP32 阈值判断与状态决策,执行反馈对应蜂鸣器和状态灯,数据上报对应通过 SSE 将现场数据推送到浏览器端。四层形成完整闭环:感知-判断-动作-通知,即使本地报警被忽略,远程也能收到实时状态变化,适合厨房无人或人不在厨房时使用。