💡 划重点

  • 本方案基于 ESP8266 主控,配合磁簧开关、LED 与 MQTT 协议,实现车库门开合状态的远程监测与本地指示。核心做法是:磁簧开关接 GPIO2 作为状态输入,LED 接 GPIO0 作为状态反馈;ESP8266 定时从深度休眠中唤醒,读取门磁状态,连接 Wi-Fi 后通过 MQTT 发布“开门”或“关门”消息,随后再次进入深度休眠,以降低功耗。整机物

需求洞察

目标用户是有独立车库的家庭成员,尤其是每天开车上下班、经常离家的上班族,以及需要低成本安防补充的业主。

真实痛点非常具体:很多人出门后会反复回想“车库门到底关没关”,甚至需要中途折返确认;夜间或者外出时,如果车库门意外被打开,自己却无法第一时间知道。传统车库遥控器不具备联网能力,市面上的智能安防套装价格普遍偏高,且安装复杂。

这个项目值得做,原因在于它用不到 25 元的成本,把“门磁状态”转化为一条可远程查看的 MQTT 消息。用户可以通过手机上的 MQTT 客户端,或者接入 Home Assistant 等智能家居平台,随时查看车库门是否关好。配合定时休眠与电池供电,它可以贴在门框侧面长期运行,不需要布设电源线,安装门槛很低。

方案设计

方案按感知层、控制层、执行层、日志/联网层四层展开。

感知层:使用常开型磁簧开关,将其安装在车库门关闭时磁铁靠近的位置。门关闭时,磁簧开关闭合,GPIO2 被拉低;门打开时,磁簧开关断开,GPIO2 被上拉电阻拉高。GPIO2 配置为输入模式,用于读取门的当前状态。

控制层:ESP8266 作为主控芯片,负责状态读取、Wi-Fi 连接、MQTT 发布流程控制。为了降低功耗,ESP8266 每次上电完成任务后调用深度休眠函数,定时唤醒,例如每 30 秒唤醒一次。唤醒后先读取 GPIO2 电平,再联网上报,然后继续休眠。这样虽然不能做到开门瞬间实时上报,但在低功耗和响应速度之间取得了适合家庭安防的平衡。

执行层:GPIO0 接 LED,通过 330Ω 电阻限流。LED 在设备唤醒、读取状态或上报成功时短闪一次,用于本地调试和安装确认。当门关闭时,LED 可以保持熄灭;当门打开时,如果用户在现场,可以通过快速闪烁提示状态异常。

日志/联网层:ESP8266 连接到家庭 Wi-Fi,通过 MQTT 协议向本地 MQTT 服务器发布主题为 home/garage/door 的消息,消息内容为 openclosed。用户可在手机端订阅该主题,也可以让智能家居平台记录历史日志。

物料清单

名称 数量 用途 估算单价(元)
ESP8266 ESP-01S 模块 1 主控与 Wi-Fi 联网 8.0
常开型磁簧开关 1 检测车库门开合状态 1.5
HT7333 3.3V 稳压芯片 1 将锂电池电压稳压到 3.3V 0.5
TP4056 充电模块 1 为锂电池充电 1.2
18650 锂电池 1 供电 6.0
18650 电池盒 1 固定电池 1.0
红色 LED 5mm 1 本地状态指示 0.3
330Ω 电阻 1 LED 限流 0.1
10kΩ 电阻 1 GPIO2 上拉,保证悬空电平确定 0.1
洞洞板、排针、导线 1 安装与连接 1.0
合计 19.7

总成本约 19.7 元,低于 25 元目标,且已经包含电池和充电模块。

接线与结构

接线基本沿用给定方案,仅增加一个 10kΩ 上拉电阻。

微调理由:GPIO2 默认在 ESP8266 启动时需要合适的电平,接入 10kΩ 上拉电阻能够避免悬空导致误触发;同时 GPIO2 用作普通数字输入完全可行。 GPIO0 本身的复位状态下可能影响启动模式,但本项目不使用 GPIO0 做启动配置,仅在运行期间作为输出控制 LED,因此安全可靠。

结构安装时,将磁簧开关固定在门框侧面,磁铁固定在门体上。门关闭时磁铁靠近磁簧开关,开关闭合;门打开时磁铁远离,开关断开。设备主体安装在门框附近,避免阳光直射和雨淋。

核心代码

以下为 Arduino IDE 下可编译的 ESP8266 代码骨架,需要安装 ESP8266 开发板支持以及 PubSubClient 库。


#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char* mqtt_server = "你的MQTT服务器IP";

const int doorPin = 2;  // GPIO2 磁簧开关输入
const int ledPin = 0;   // GPIO0 LED 输出

WiFiClient espClient;

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);        // LED 熄灭

  int doorState = digitalRead(doorPin); // LOW=关闭, HIGH=打开

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  int tryCount = 0;
  while (WiFi.status() != WL_CONNECTED && tryCount < 20) {
    delay(300);
    tryCount++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (client.connect("garage_door_card")) {
      String payload = (doorState == LOW) ? "closed" : "open";
      client.publish("home/garage/door", payload.c_str());
      client.loop();
      delay(100);
    }
  }

  // 本地 LED 闪一下,便于确认工作状态
  digitalWrite(ledPin, LOW);
  delay(50);
  digitalWrite(ledPin, HIGH);

  // 深度休眠 30 秒后再次唤醒
  ESP.deepSleep(30e6);
}

void loop() {
  // 深度休眠唤醒后会重新执行 setup,loop 通常不运行
}

调试步骤

  1. 烧录代码前,先连接 USB 转串口模块到 ESP-01S,确认模块能够正常进入下载模式。
  2. 用杜邦线临时连接磁簧开关和 LED,打开串口监视器,手动靠近和移开磁铁,观察 GPIO2 读到的电平变化。
  3. 将 MQTT 服务器地址改为本机或局域网内可达的地址,使用 MQTT 客户端订阅 home/garage/door,确认能收到消息。
  4. 检查 LED 是否在每次唤醒后短闪一次,如果 LED 不亮,检查 GPIO0 输出电平和限流电阻焊点。
  5. 用万用表测量电池电压和 HT7333 输出电压,确认 3.3V 稳定。
  6. 最后将设备装入电池盒,贴到门框附近,进行 24 小时状态测试,观察 MQTT 消息是否稳定。

设计图

车库门远程状态卡片结构flow
1
感知输入
2
控制处理
3
执行反馈
4
数据上报