💡 划重点
- 本方案基于 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 的消息,消息内容为 open 或 closed。用户可在手机端订阅该主题,也可以让智能家居平台记录历史日志。
物料清单
| 名称 | 数量 | 用途 | 估算单价(元) |
|---|---|---|---|
| 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Ω 上拉电阻。
- 磁簧开关一端接 GND,另一端接 GPIO2。
- GPIO2 同时通过 10kΩ 电阻上拉到 3.3V,保证磁簧断开时 GPIO2 电平确定。
- LED 正极接 3.3V,负极通过 330Ω 电阻接 GPIO0。GPIO0 输出低电平时 LED 点亮,输出高电平时熄灭。
- 18650 锂电池输出经过 HT7333 稳压到 3.3V,为 ESP-01S、上拉电阻和 LED 供电。
- TP4056 充电模块接在电池两端,充电时可通过 USB 供电。
微调理由: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 通常不运行
}
调试步骤
- 烧录代码前,先连接 USB 转串口模块到 ESP-01S,确认模块能够正常进入下载模式。
- 用杜邦线临时连接磁簧开关和 LED,打开串口监视器,手动靠近和移开磁铁,观察 GPIO2 读到的电平变化。
- 将 MQTT 服务器地址改为本机或局域网内可达的地址,使用 MQTT 客户端订阅
home/garage/door,确认能收到消息。 - 检查 LED 是否在每次唤醒后短闪一次,如果 LED 不亮,检查 GPIO0 输出电平和限流电阻焊点。
- 用万用表测量电池电压和 HT7333 输出电压,确认 3.3V 稳定。
- 最后将设备装入电池盒,贴到门框附近,进行 24 小时状态测试,观察 MQTT 消息是否稳定。