💡 划重点

  • 主控: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);
}

调试步骤

  1. 先只接 ESP32 与串口,确认开发板可烧录、Wi-Fi 可连接。
  2. 接 MQ-2,预热 3 分钟,打开串口监视器观察 A0 数值,记录洁净空气基线。
  3. 用打火机气体靠近 MQ-2,观察数值上升,设定预警阈值和报警阈值。
  4. 接火焰传感器,用打火机明火靠近,确认数字输出翻转,串口打印火焰状态。
  5. 接蜂鸣器和 LED,手动触发条件,检查声音与灯光是否正常。
  6. 联调:浏览器访问 http://设备IP/events,用 EventSource 或简单页面查看 SSE 数据。
  7. 模拟烟雾和火焰,观察报警级别、蜂鸣器、LED 与 SSE 推送是否一致。若误报多,提高阈值或增加连续确认次数。

设计图

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