Arduino Uno 门磁报警器:通过 Gmail 发送开门提醒邮件
零部件清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Uno R3 | 1 | 主控板 |
| PHPoC Shield for Arduino | 1 | 内置 TCP/IP 协议栈,支持 HTTPS 邮件发送 |
| 磁簧门磁传感器 (常开型) | 1 | 含磁铁与传感器本体,门关合时触点闭合 |
| 面包板、杜邦线、USB 线 | 若干 | 连接用 |
项目简介
本教程面向 Arduino 初学者,演示如何利用 PHPoC Shield 实现联网功能,结合门磁传感器检测开门事件,通过 Gmail SMTP 服务器发送报警邮件。无需复杂的 AT 指令或 WiFi 模块调试,PHPoC Shield 内置完整网络协议栈,代码极其简洁,适合快速原型验证。
工作原理
门磁传感器检测原理
磁簧开关由磁铁和带触点的玻璃管组成。安装时,磁铁固定在门扇,传感器本体固定在门框,两者对齐距离 < 2cm。门关闭时磁场使触点吸合 (输出 HIGH);门打开时磁场消失,触点断开 (输出 LOW)。Arduino 读取数字引脚状态即可判断门状态。
邮件发送流程
- PHPoC Shield 通过以太网线或 USB WiFi 适配器接入互联网
- Arduino 调用 PHPoC 库的
PhpocEmail类配置 SMTP 参数 - 检测到门磁状态变化 (下降沿) 时,构造邮件主题、正文
- 调用
email.send()发送,返回 >0 表示成功
硬件接线
| PHPoC Shield / Arduino | 门磁传感器 | 说明 |
|---|---|---|
| 5V | 红线 (VCC) | 传感器供电 (若为无源磁簧管可不接) |
| GND | 黑线 (GND) | 共地 |
| A0 (数字输入) | 信号线 | 门关=HIGH,门开=LOW,启用内部上拉 |
网络连接:PHPoC Shield 堆叠在 Arduino Uno 上,通过网线接路由器 LAN 口,或插入兼容的 USB WiFi 适配器 (如 RT5370 芯片)。
软件准备
- 安装 PHPoC 库:Arduino IDE → 菜单「草图」→「包含库」→「管理库」→ 搜索 "PHPoC" 安装
- 安装 ezButton 库:同理搜索 "ezButton" 安装,用于按钮/传感器去抖动
- 准备 Gmail 账号:需开启「双重验证」并生成「应用专用密码」 (安全性要求),或允许「不够安全的应用」(旧版设置)
核心代码解析
#include <Phpoc.h>
#include <ezButton.h>
PhpocEmail email;
ezButton button(A0); // 门磁信号接 A0,内部上拉
void setup() {
Serial.begin(9600);
Phpoc.begin(PF_LOG_SPI | PF_LOG_NET | PF_LOG_APP); // 初始化 PHPoC Shield
button.setDebounceTime(100); // 100ms 去抖动
}
void loop() {
button.loop(); // 必须循环调用以更新状态
if (button.isPressed()) { // 检测到下降沿:门打开
// 配置 Gmail SMTP
email.setOutgoingServer("smtp.gmail.com", 587); // TLS 端口
email.setOutgoingLogin("your_email@gmail.com", "your_app_password"); // 应用专用密码
email.setFrom("your_email@gmail.com", "Arduino Alert");
email.setTo("receiver@example.com", "User");
email.setSubject("Door Opened Alert [#905]");
email.beginMessage();
email.println("#905");
email.println("");
email.println("Door is opened.");
email.endMessage();
if (email.send() > 0) {
Serial.println("Email sent successfully");
} else {
Serial.println("Email failed");
}
}
else if (button.isReleased()) { // 检测到上升沿:门关闭
// 可在此添加关门通知逻辑
}
}
关键点详解
1. Gmail SMTP 配置
- 服务器:
smtp.gmail.com - 端口:
587(STARTTLS) 或465(SSL) - 用户名:完整 Gmail 地址
- 密码:应用专用密码 (16 位字符),非账号登录密码。获取路径:Google 账号 → 安全性 → 双重验证 → 应用专用密码
2. ezButton 去抖动
机械触点开合瞬间会产生抖动,ezButton 库内部实现状态机去抖,setDebounceTime(100) 设置 100ms 稳定时间。isPressed() 仅在确认下降沿后返回一次 true,避免重复触发邮件。
3. PHPoC Shield 优势
- 硬件级 TCP/IP 协议栈,不占用 Arduino Flash/RAM
- 内置 TLS/SSL 支持,可直接连 HTTPS、SMTPS
- 提供高级 API (Email, HTTP, WebSocket, MQTT 等)
- 支持 IPv6 (调用
Phpoc.beginIP6())
常见问题排查
| 现象 | 原因 | 解决 |
|---|---|---|
| 串口显示 "Failed to connect to client" | 网络不通 / Shield 未获取 IP | 检查网线/路由器 DHCP;串口监视器观察 Phpoc.begin() 日志 |
| 邮件发送失败 (send() 返回 0) | SMTP 认证失败 / 端口被封 / 密码错误 | 确认应用专用密码正确;尝试端口 465;检查网络防火墙 |
| 门磁状态不触发 | 引脚模式错误 / 磁铁距离过远 | 确认 A0 设为 INPUT_PULLUP;调整磁铁安装位置,间距 < 1.5cm |
| 重复收到多封邮件 | 去抖动时间太短 / 磁铁震动 | 增大 setDebounceTime(200);机械加固磁铁 |
扩展建议
- 添加蜂鸣器本地报警:门开时
tone(8, 1000, 500) - 接入 OLED 显示门状态、网络 IP、邮件发送状态
- 使用
millis()实现「门开超时未关」提醒 (如超过 30 秒再发邮件) - 结合 ThingSpeak 记录开关门时间戳,生成统计图表
- 替换为 ESP32 + 门磁,成本更低、功耗更小、支持深度睡眠
完整代码下载
Door_Alert_Gmail.ino (含详细注释)
这是一个极简的物联网入门项目,掌握后可快速扩展为窗户监测、抽屉防盗、冰箱门未关提醒等场景。PHPoC Shield 让 Arduino 联网变得像串口打印一样简单,非常适合教学与快速原型。
制造工艺
- K30 CO₂ 传感器:室内空气质量实时监测
- DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- Arduino Cloud 传感器塔:温度、动作与气体监测
- 基于 Arduino Nano 的智能运动感应水枪
- 非接触体温筛查闸机:Arduino MKR1000 + 红外测温 + 舵机控制
- Arduino UNO + WiFi 盾板:串口实时推送温度到网页绘图
- 校园智能体温监测系统 - 精准、实时、安全的学生健康守护方案
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY
- 智能健康监测站:Arduino、蓝牙与传感器实现远程生理指标监测
- Arduino 门磁传感器:PHPoC WiFi Shield 经 IFTTT 推送 Messenger 实时告警