DIY智能门磁报警器:ESP8266+微信通知


头像
shi到临头想搅便
原创
发布时间: 2026-06-13 14:21:29 | 阅读数 0收藏数 0评论数 0
封面
本文教你制作一款智能门磁警报器,用于外出时监测家门开关状态。为避免日常进出误触发警报,设备设计了两种模式:在家模式下开门静默无提醒;离家模式下,一旦开门便会通过手机app实时推送通知。

准备工作:

材料:

材料名称
数量
备注
LED草帽
1
ESP8266
1
杜邦线(母对母)
10根
霍尔传感器(A3144)
1

工具:

工具名称
数量
备注
热胶枪
1
用于固定
1

准备模块


2

电路图

霍尔传感器->esp8266

  1. VCC->3V
  2. GND->G
  3. DO->D5

按钮开关->esp8266

  1. VCC->3V
  2. GND->G
  3. OUT->D6

LED灯->ESP8266

  1. 正极->D2
  2. 负极->G

按照上边的对应关系进行接线。

3

WxPusher注册

点击进入WxPusher主页微信扫码登录后,找到右上角的创建新的应用输入*号必填项并点击确定。确定后会有弹窗提示TOKEN信息,复制保存好TOKEN后续的Arduino编写需要。

4

获取UID

在首页左侧边栏找到应用管理->关注应用,扫描二维码可以收到UID,用于后续的消息推送。

5

代码实现

/*
* ESP8266 门窗报警器
* - 模式切换(按键):在家模式(LED亮,报警关闭),离家模式(LED灭,报警开启)
* - 离家模式开门:微信推送
* - 状态断电保存
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <EEPROM.h>

// ========== 用户配置(请修改) ==========
const char* ssid = "WiFi名称";
const char* password = "WIFI密码";
const char* appToken = "TOKEN"; // WxPusher App Token
const char* uid = "UID"; // 你的 UID

// ========== 引脚定义 ==========
const int hallPin = 14; // 霍尔传感器 OUT (GPIO14)
const int btnPin = 12; // 按键模块 OUT (GPIO12)
const int ledPin = 4; // 草帽LED (GPIO4)

// ========== 模式定义 ==========
#define MODE_HOME 0 // 在家模式(LED亮,不报警)
#define MODE_AWAY 1 // 离家模式(LED灭,报警推送)
int currentMode = MODE_AWAY; // 默认离家模式

// ========== 状态变量 ==========
int lastHallState = HIGH; // 上次霍尔状态(假设门关闭时为 HIGH)
bool lastBtnState = HIGH; // 上次按键状态(高电平表示未按下)
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;

// ========== 函数声明 ==========
void sendWechatMessage(String title, String content);
void handleButton();
void handleHallSensor();
void saveModeToEEPROM();
void readModeFromEEPROM();
void updateLed();

void setup() {
Serial.begin(115200);
pinMode(hallPin, INPUT_PULLUP); // 霍尔传感器,内部上拉
pinMode(btnPin, INPUT_PULLUP); // 按键内部上拉(按下为 LOW)
pinMode(ledPin, OUTPUT);
EEPROM.begin(512);
readModeFromEEPROM();
updateLed(); // 根据模式设置 LED 亮灭
// 连接 WiFi
WiFi.begin(ssid, password);
Serial.print("正在连接 WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 已连接!");
// 读取霍尔初始状态
delay(100);
lastHallState = digitalRead(hallPin);
}

void loop() {
handleButton();
handleHallSensor();
delay(10);
}

// ========== 按键处理(模式切换) ==========
void handleButton() {
bool reading = digitalRead(btnPin);
if (reading != lastBtnState) {
delay(debounceDelay);
reading = digitalRead(btnPin);
if (reading != lastBtnState) {
if (reading == LOW) { // 按键按下(低电平有效)
// 切换模式
currentMode = (currentMode == MODE_HOME) ? MODE_AWAY : MODE_HOME;
saveModeToEEPROM();
updateLed();
Serial.printf("模式已切换为:%s\n", currentMode == MODE_AWAY ? "离家模式" : "在家模式");
// 仅在切换到离家模式时推送一次提醒(可选)
if (currentMode == MODE_AWAY && WiFi.status() == WL_CONNECTED) {
sendWechatMessage("模式切换", "报警器已切换为【离家模式】");
}
}
}
}
lastBtnState = reading;
}

// LED 指示灯:在家模式亮,离家模式灭
void updateLed() {
if (currentMode == MODE_HOME) {
digitalWrite(ledPin, HIGH); // 在家模式 LED 亮
} else {
digitalWrite(ledPin, LOW); // 离家模式 LED 灭
}
}

// ========== 霍尔传感器(门磁检测) ==========
void handleHallSensor() {
int reading = digitalRead(hallPin);
if (reading != lastHallState) {
delay(debounceDelay);
reading = digitalRead(hallPin);
if (reading != lastHallState) {
// 判断门状态:假设门关闭时磁铁靠近,输出 LOW;门打开时磁铁远离,输出 HIGH
if (reading == HIGH) {
// 门被打开
Serial.println("门被打开!");
if (currentMode == MODE_AWAY) {
if (WiFi.status() == WL_CONNECTED) {
sendWechatMessage("门窗报警", "门被打开了!请立即检查。");
}
} else {
Serial.println(" 在家模式,不推送。");
}
} else {
// 门被关闭
Serial.println("门已关闭");
if (currentMode == MODE_AWAY && WiFi.status() == WL_CONNECTED) {
sendWechatMessage("门窗状态", "门已关闭");
}
}
lastHallState = reading;
}
}
}

// ========== WxPusher 微信推送 ==========
void sendWechatMessage(String title, String content) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi未连接,无法发送消息");
return;
}
WiFiClientSecure client;
client.setInsecure();
HTTPClient http;
http.begin(client, "https://wxpusher.zjiecode.com/api/send/message");
http.addHeader("Content-Type", "application/json");
// 转义 JSON 特殊字符
content.replace("\\", "\\\\");
content.replace("\"", "\\\"");
title.replace("\\", "\\\\");
title.replace("\"", "\\\"");
String postData = "{"
"\"appToken\":\"" + String(appToken) + "\","
"\"content\":\"" + content + "\","
"\"summary\":\"" + title + "\","
"\"contentType\":1,"
"\"uids\":[\"" + String(uid) + "\"]"
"}";
int httpCode = http.POST(postData);
if (httpCode == 200) {
Serial.println("微信消息发送成功");
} else {
Serial.printf("微信消息发送失败,HTTP状态码:%d\n", httpCode);
}
http.end();
}

// ========== EEPROM 存储模式 ==========
void saveModeToEEPROM() {
EEPROM.write(0, currentMode);
EEPROM.commit();
Serial.println("模式已保存");
}

void readModeFromEEPROM() {
int val = EEPROM.read(0);
if (val == MODE_HOME || val == MODE_AWAY) {
currentMode = val;
} else {
currentMode = MODE_AWAY; // 首次运行默认离家模式
saveModeToEEPROM();
}
}
6

3D打印

3D打印这些文件,用于下一个步骤使用。

STL
shapr3d_export_2026-06-13_10h09m.stl
1.45KB
STL
盒子.stl
2.43KB
STL
盖.stl
27.33KB
7

组装

先用热熔胶将霍尔传感器固定在ESP8266中间,再将按钮穿过盖板孔位并粘牢,注意确保按键上下活动自如,最后把ESP8266装入盒体并盖上盖板即可。

8

测试

准备4颗5×5mm的磁铁用于触发霍尔。安装时请先贴近传感器确认磁极方向,保证能正常触发后再用热熔胶固定。

9

功能演示

下载WxPusher App并用微信登录。设备通电后测试两种模式:在家模式下开门静默无通知;离家模式下开门即推送App告警。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
头像
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报