💡 划重点

  • 主控选型 ESP32,Wi-Fi 原生支持,成本极低,适合持续联网的厨房安全场景。
  • 双传感器融合:MQ-2 负责检测可燃烟雾与液化气泄漏,火焰传感器捕捉明火,避免单一传感器漏报。
  • 本地声光报警+远程推送:通过 Server-Sent Events(SSE)将报警事件从设备单向推送到手机或后台看板,免除 App 轮询,保持低功耗和低延迟。
  • BOM 总成本控制在 55 元以内,所有模块采购容易,焊接门槛低,适合学生、创客和个人家庭使用。

需求洞察

目标用户:独居青年、出租屋租客、家有老人行动不便的家庭成员,以及小型餐饮后厨。他们对厨房安全有刚性需求,但预算有限,无法部署昂贵的消防主机。

真实痛点:传统烟雾报警器只靠本地声音提示,人不在家时完全失效。市场上联网方案要么依赖网关价格高昂,要么使用蓝牙、Zigbee 等需要额外硬件。大量真实的厨房火灾起始于干烧、油锅起火或燃气微漏,需要一款能同时感知烟雾浓度与可见火焰、且报警不依赖于用户是否在家的低成本联网报警器。

为什么值得做:ESP32 具备 Wi-Fi 直连,直接推送报警到家庭成员的手机浏览器或智能音箱,无需第三方云平台也可以工作。SSE 技术简单稳定,防火墙友好,适合嵌入式设备单向事件推送。所有物料总价低于两杯咖啡,却能解决致命风险,具备极强的推广价值。

方案设计

感知层

控制层

执行层

日志/联网层

物料清单

序号 物料名称 数量 用途 单价(元) 小计(元)
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 即可持续接收数据。

调试步骤

  1. 硬件上电检查:USB 供电后观察蓝色 LED 是否常亮,ESP32 串口输出是否正常,Wi-Fi 连接是否成功。
  2. 传感器静态校准:在厨房无火无烟的常态下,打开串口监视器记录 MQ-2 和火焰传感器的原始值,记录作为环境基线。一般 MQ-2 输出电压随烟雾浓度升高而增大,火焰传感器在无火焰时读数接近 3000~4095,有火焰时多数模块读数下降,需实测确定方向。
  3. 报警阈值整定:用打火机轻按气体(不点燃)靠近 MQ-2 测试响应速度;使用蜡烛火焰距离火焰传感器 20cm 测试响应,调整代码中阈值,保证响应灵敏且不误报。
  4. SSE 推送测试:在同一局域网内,用浏览器或 curl -N http://设备IP/events 观察事件流,触发传感器确认能否收到 alert 事件,复位后收到正常状态事件。
  5. 长期运行监控:连续运行 24 小时,观察是否出现断连、数据跳变等问题,必要时加入软件看门狗复位。

设计图

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

更具体的结构数据可表示为:

系统工作流flow
1
MQ-2 烟雾 / 火焰传感器 → ADC 采样
2
滑动窗口滤波与阈值判断
3
本地声光报警(蜂鸣器+LED)
4
Wi-Fi SSE 推送报警事件
5
手机 / 电脑浏览器实时接收