旧门铃按下时,手机如何多收到一条提醒?
本文为教学接线与设计预期,尚无实物测量记录;使用 ESP32-DevKitC V4、独立低压触点与本地 Home Assistant。
问题
旧门铃响了,手机为什么不知道?它的按钮只控制原来的门铃回路,没有联网。另加独立开关,不碰旧电源线。ESP32 只读新开关的低压状态,随后才尝试通过无线网络送提醒。
物件动作
小熊拿包裹按按钮板。板子同时碰到两扇门:旧门照常响,新门交给门卫一面红旗。门卫拿秒表等触点稳定,才把纸条送往手机。回到电路,新门是独立低压触点,红旗是 IO27 从高变低。
真实连接
开发板用自己的 USB 供电。三点三伏经一万欧电阻接 IO27,松开时为高。新增小开关一端接 IO27,另一端接板卡地;按下才拉低。只机械同动,不与旧铃接线。原门铃电压未知,绝不能送进 IO27。
原因与结果
程序连续读到稳定的低电平,才记一次按铃;必须等松开再允许下一次,避免触点弹跳连发。接着 ESP32 通过家中无线网络,向本地 Home Assistant 的专用 webhook 发请求,由自动化转给手机通知服务。网络箭头不是铜线,服务器收到也不等于手机已经弹窗。
验证
先单按新开关:万用表预期看到 IO27 在三点三伏和接近零伏之间切换。再查日志、webhook 和手机通知,定位故障。电阻按三点三伏除一万欧算,按下约零点三三毫安;这是设计计算,非实测。
边界
如果旧按钮没有安全的并列安装位置,就不做这个改造;绝不拆开不明电压的门铃线路。停电、断网、服务器停机或手机禁用通知都会漏提醒,旧门铃仍应独立工作。没有实物或送达记录,画面是设计预期。
先确定边界:不给旧门铃的电源线加任何电子负载
旧门铃可能使用直流、交流、变压器,也可能采用没有公开接口的电子按钮。仅凭‘看上去是两个按钮脚’不能推断它们是安全的 3.3 V 干接点。本例只讨论一种受条件约束的机械改造:在能够安全接触、且有足够空间的旧按钮压杆旁,另装一只完全独立的 Panasonic EVQ11D07K 小开关,使同一次手指按压分别推动旧按钮和新增开关。旧门铃的供电、负载和导线保持原状;新增开关的任何端子都不连接旧门铃导体。若机械结构不允许、外壳带有不明电压,或必须拆开带电部分才能加装,就停止这个方案,转而选择厂家提供的认证接口或请有资质人员处理。不要为了演示把旧铃线直接接 ESP32 输入。
把它画成小熊的动作:小熊拿按铃包裹走到门口,压下一块按钮板,板的左边让原铃响,右边碰到独立小开关。门卫看到右边红旗,拿秒表等到触点稳定,再送一张纸条到家里的服务器。回到电路,右边红旗是 IO27 从高变低,秒表是软件里的消抖等待,纸条是局域网 webhook 请求;它们都不是旧门铃电源线的一部分。只有机械动作共用,电路不共地、不并线。
把新增小开关接到真实引脚
Espressif 的 ESP32-DevKitC V4 官方手册明确列出 J2-1 是 3V3、J2-11 是 IO27、J2-14 是 GND,并说明 Micro-USB、5V/GND 针脚和 3V3/GND 针脚三种供电方式只能选一种。本例仅通过 Micro-USB 给开发板上电,不从旧门铃取电,也不同时给 5V 或 3V3 针脚另加电源。将 J2-1 3V3 经 R1=10 kΩ 电阻接到 IO27 节点;Panasonic EVQ11D07K 的一组常开触点一端接此节点,另一端接 J2-14 GND。开关松开时,R1 把 IO27 拉高;按下闭合时,节点被触点接地而变低。该型号官方资料把它列为顶按 SPST 轻触开关,微小信号负载范围覆盖本例量级。按产品外形图选正确的一对触点;焊前断电用通断档确认哪两端真的是‘松开断、按下通’,不可凭四个外观焊盘猜同侧或对侧。
按下时 R1 两端理想电压约 3.3 V,欧姆定律给出 3.3 V÷10000 Ω=0.00033 A,即约 0.33 mA。这是器件和供电条件下的设计计算,真实电流受稳压、电阻及接触电阻公差影响;没有实测记录不能写成‘测得 0.33 mA’。IO27 只读取低压输入,不直接驱动门铃线圈,不承受旧铃电流。若用户另选了不同触点、电阻、板卡或接线座,要重新核对额定负载和针脚,不把这里的示意自动推广。
为什么按一次不能直接发一次消息
轻触开关在机械闭合和松开时会短暂弹跳。ESP32 若把每个电平跳变都当成一次访客,手机可能连收几条消息。本例设定连续稳定低电平约 30 ms 后才记一次‘按下’事件,然后保持不再计数;等到稳定松开后才重新武装。30 ms 是教学参数,不是 Panasonic 对该开关的统一保证。软件还需在网络断开时保存可识别的失败状态或有界队列;如果没有可靠存储和重试,断网期间的事件就可能丢失。反过来若请求超时,服务器可能其实已经收到,盲目重发会造成重复提醒,工程版应让事件携带唯一编号并由接收侧去重。本文的 C11 小程序只复算消抖序列和电阻电流,不实现 ESP-IDF GPIO、Wi-Fi 或持久队列。
从开发板到手机,中间还需要一台真正的服务端
ESP32 把确认后的按钮事件交给 Wi-Fi 协议栈,再由局域网向用户自己部署的 Home Assistant 专用 webhook 发 POST。Home Assistant 官方文档说明/api/webhook/<webhook_id>可以触发自动化;其 Companion App 文档说明手机授权后可出现notify.mobile_app_...通知目标。自动化收到请求以后,需要明确调用那部手机对应的通知目标,不能靠 ESP32 一句‘发给手机’就自动生成推送。webhook 标识和家庭网络地址属于用户私有配置,本文不提供真实密钥或服务器地址,也不把本地 HTTP 示例暴露到公网。先在可信局域网完成基础验证;若需要跨网访问,应另行配置合适的 HTTPS、访问控制、网络隔离和凭据轮换。
四个状态要分开:IO27 稳定变低,只能证明本地检测;ESP32 请求发出,只能证明它尝试联机;Home Assistant 自动化运行,只能证明服务端处理;只有手机端实际弹窗或有对应确认记录,才可说手机收到。Wi-Fi 断开、Home Assistant 离线、手机权限关闭或手机系统延迟,都会使最后一步失败。无线箭头是软件/网络消息,不是从开发板直接接向手机的铜线。本例没有用户家里的 Home Assistant、手机账户、实际门铃外壳或按压测试,画面和读数均标为设计预期。
先在桌面分步验证,再判断能否安装
第一步只把 ESP32、R1 和新增小开关放在桌上,断电核对 J2-1、J2-11、J2-14 的线序与触点开闭,不接任何旧门铃线。第二步只用 USB 上电,万用表黑表笔接 J2-14 GND,红表笔接 IO27,分别记录松开和按下的真实电压;预期前者接近 3.3 V、后者接近 0 V,但本文没有这两笔测量。第三步看日志是否一按只记一次,再单独触发 Home Assistant webhook 检查自动化,再核对手机是否授权并收到。第四步在完全断开旧门铃电源后检查机械安装空间和触点行程;确认旧按钮仍能正常弹回,才由合适人员评估是否可装。任何一步涉及未知或危险电压就停止,不为了得到一条通知牺牲原门铃的独立可靠性。
逐线接线清单
- 独立 USB 电源 → ESP32-DevKitC V4 Micro-USB 插座:只用一种供电方式;不从旧门铃取电
- ESP32-DevKitC V4 J2-1 3V3 → R1 10 kΩ 一端:低压上拉,不接旧门铃电源
- R1 10 kΩ 另一端 → ESP32-DevKitC V4 J2-11 IO27 与 EVQ11D07K 一侧触点:同一输入节点,松开高、按下低
- EVQ11D07K 对侧触点 → ESP32-DevKitC V4 J2-14 GND:仅新增触点闭合时导通,须断电核实所选触点对
- 旧门铃按钮压杆 → 新增 EVQ11D07K 按帽:仅机械同动;两条电气回路完全不相连,安装空间须实物确认
- ESP32 Wi-Fi 协议栈 → 局域网 Home Assistant 专用 webhook,再到手机 Companion App:无线/软件事件链,不画成电气导线;通知送达需独立核验
计算与实施边界
- Espressif ESP32-DevKitC V4 官方用户指南:J2-1 是 3V3,J2-11 是 IO27,J2-14 是 GND;Micro-USB 是默认电源,三种供电方式只能选其一
- Panasonic EVQ11D07K 官方产品页:顶按型常开 SPST 轻触开关,额定接触负载范围从 10 µA/2 V DC 到 20 mA/15 V DC;本例 3.3 V/10 kΩ≈0.33 mA 落在教学低压范围内
- Home Assistant 官方 webhook 文档:本地 POST /api/webhook/ 可触发自动化;手机 Companion App 官方文档提供 notify.mobile_app_ 目标,实际目标名称必须按用户设备配置
- ESP-IDF 官方 esp_http_client 文档支持 POST;本文不存真实 webhook 密钥、不宣称请求发出或手机收到
- 机械同动是本例设计前提,不声称任意旧门铃都能加装;旧门铃原电路电压及安全认证未知,绝不并接 IO27 或从原电路取电
- 本例低电平消抖取连续 30 ms 为教学参数,不是开关厂商保证;按下电阻电流 3.3 V/10000 Ω=0.00033 A,未计算实际触点和板卡误差
这些参数和数值是本例选择或可复算计算;实际测量前,应先检查电源极性、公共地、元件额定值、仪器探头连接。
完整可运行的核心算例与验收
以下 C11 程序可在电脑上用 C 编译器单独编译运行,用来复算状态或数值;它不是已配置 GPIO、ADC、定时器和驱动的开发板固件。移植到实板时应按前述接线配置外设、检查读取错误,并另做实测。
#include<stdio.h>/* 输入 1=松开、0=按下;只复算 30ms 消抖与一次触发逻辑。 */intmain(void){constintsample_ms=10,stable_ms=30;constintsamples[]={1,0,1,0,0,0,0,0,1,1,1};intlow_ms=0,high_ms=0,armed=1,events=0;for(unsignedi=0;i<sizeof(samples)/sizeof(samples[0]);++i){if(samples[i]==0){low_ms+=sample_ms;high_ms=0;if(armed&&low_ms>=stable_ms){++events;armed=0;}}else{high_ms+=sample_ms;low_ms=0;if(!armed&&high_ms>=stable_ms)armed=1;}}printf("press events=%d; pullup current=%.2f mA\n",events,3.3/10000.0*1000.0);returnevents==1?0:1;}验收时同时记录输入、关键节点电压或波形、程序输出;若发现传感器通信失败、输入超出允许范围或波形明显异常,应停止并排查。
官方资料
- https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32/esp32-devkitc/user_guide.html
- https://na.industrial.panasonic.com/products/switches-encoders-interface-devices/switches/lineup/light-touch-tactile-switches/series/79310
- https://www.home-assistant.io/docs/automation/trigger
- https://companion.home-assistant.io/docs/notifications/notifications-basic/
- https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/protocols/esp_http_client.html