零知派ESP32—— 基于ESP32 + ISD1820 远程监控PIR安防告警系统 项目概述本项目加入了Wi-Fi与MQTT协议实现了远程状态监控与告警推送。系统以ESP32为主控通过SR505人体红外传感器PIR检测入侵ISD1820语音模块播放自定义告警语音,ST7789彩色屏幕实时显示本地状态同时通过MQTT将系统状态、PIR信号、告警事件等实时上报至云端如EMQX公共代理用户可使用手机或电脑上的MQTT客户端订阅主题随时随地掌握现场动态。核心功能本地功能PIR入侵检测、语音告警播放、屏幕状态显示、LED指示、手动录音/测试。新增远程功能Wi-Fi自动连接MQTT发布系统状态online/arming/armed/alarm、PIR电平变化、告警触发、录音开始/结束、系统启动信息等实现远程监控与数据收集。项目亮点本地远程双模监控既保留本地实时响应又支持远程查看状态适合无人值守场景。全流程MQTT上报从启动预热、布防完成、入侵告警到录音操作每个关键事件都会发布主题便于集成到Home Assistant等智能家居平台。自动重连与离线容错WiFi连接超时后自动进入离线模式MQTT断线后定时重试不影响本地告警功能。低代码扩展性通过PubSubClient库轻松更换MQTT Broker或增加自定义主题。实时PIR状态推送PIR电平变化时即时发布主题可用于远程查看环境活动情况。项目难点及解决方案难点解决方案WiFi连接阻塞主循环在setup()中使用10秒超时机制连接失败则跳过后续不再重试保证系统快速启动。MQTT发布不阻塞告警所有MQTT发布均为非阻塞调用mqtt.publish立即返回且mqtt.loop()仅在mqtt.connected()时执行不影响主循环实时性。MQTT重连频率控制使用静态变量lastTry限制重连间隔不低于10秒避免频繁重连消耗资源。状态同步一致性每次屏幕状态变化时同步调用mqttPub()发布对应状态主题确保远程与本地一致。网络状态变化时界面不卡顿将MQTT维护放在独立计时分支每200ms执行一次不影响屏幕刷新200ms限频和按键扫描。目录一、硬件系统部分1.1 硬件清单1.2 接线方案1.3 硬件连接图1.4 实物连接图二、软件架构设计2.1 系统初始化流程2.2 主循环逻辑三、代码拆分讲解3.1 WiFi与MQTT配置3.2 主循环中的MQTT维护3.3 各事件点的MQTT发布3.4 屏幕显示与MQTT解耦四、操作过程及数据展示4.1 操作步骤4.2 数据展示4.3 视频演示五、技术原理5.1 工作原理5.2 工作模式配置含网络状态六、常见问题指引Q1MQTT连接失败怎么办Q2如何更换MQTT Broker或添加认证Q3MQTT订阅后收不到消息Q4如何关掉MQTT功能纯本地模式一、硬件系统部分1.1 硬件清单组件型号/规格数量作用开发板零知派ESP321主控包含Wi-Fi/BLE扩展板零知派ESP32扩展板1方便接线红外传感器SR5051探测人体移动语音模块ISD18201录音/放音显示屏ST7789240×2401本地状态显示1.2 接线方案ESP32 GPIO连接组件功能说明GPIO 19ISD1820REC录音触发GPIO 14ISD1820PLAYE手动放音触发GPIO 27ISD1820PLAYE告警触发输出低电平脉冲GPIO 34SR505OUTPIR数字信号输入1.3 硬件连接图1.4 实物连接图二、软件架构设计2.1 系统初始化流程串口115200 bps调试输出。Wi-Fi连接尝试连接指定SSID超时10秒无论成功与否都继续执行不影响本地功能。MQTT客户端设置Broker地址和端口连接成功后立即发布status/online。GPIO与屏幕初始化配置引脚、启动TFT。PIR预热记录warmMs进入60秒倒计时。LED闪烁提示启动完成。发布启动信息status/arming和info含预热时长。2.2 主循环逻辑loop(): 1. 读取所有输入电平 2. 每200ms执行MQTT维护 - 尝试重连若断开且距上次尝试超过10秒 - 若已连接调用 mqtt.loop() 处理网络事件 3. 录音处理边沿检测—— 增加MQTT发布 record/start 和 record/end 4. 手动放音处理 —— 触发告警并发布 alarm 主题 5. PIR入侵检测预热完成后 - 上升沿触发告警同时发布 status/alarm 和 alarm/1 - 每次PIR电平变化时发布 pir/HIGH 或 pir/LOW供远程监控 6. 告警结束处理 —— 恢复状态并发布 status/armed 7. 布防完成 —— 发布 status/armed 和 info/armed 8. 布防倒计时显示与MQTT无关 9. 更新按键历史电平延迟10ms三、代码拆分讲解3.1 WiFi与MQTT配置const char* WIFI_SSID zaixinjian; const char* WIFI_PASS 2020zaixinjian; const char* MQTT_BROKER broker.emqx.io; const int MQTT_PORT 1883; const char* MQTT_ID PIR_Alarm; const char* MQTT_PREFIX pir_alarm;MQTT_PREFIX作为所有主题的前缀方便统一管理。使用公共Brokerbroker.emqx.io无需注册即可测试。发布函数void mqttPub(const char* subtopic, const char* payload) { if (!mqtt.connected()) return; char topic[64]; snprintf(topic, 64, %s/%s, MQTT_PREFIX, subtopic); mqtt.publish(topic, payload); }自动拼接前缀调用时只需指定子主题和负载。若MQTT未连接静默跳过不影响本地操作。重连函数void mqttReconnect() { if (mqtt.connected()) return; static unsigned long lastTry 0; if (millis() - lastTry 10000) return; lastTry millis(); if (mqtt.connect(MQTT_ID)) { mqttPub(status, online); } }限制重连频率为10秒避免Broker拒绝频繁连接。连接成功后立即发布在线状态。3.2 主循环中的MQTT维护if (n - lastMqtt 200) { lastMqtt n; mqttReconnect(); if (mqtt.connected()) mqtt.loop(); }每200ms执行一次确保及时处理网络事件同时不影响主循环响应速度。3.3 各事件点的MQTT发布录音按下mqttPub(record, start);松开mqttPub(record, end);告警触发alarm()函数内mqttPub(status, alarm); mqttPub(alarm, 1);PIR电平变化在调试打印处if (ir ! pirDbg) { mqttPub(pir, ir HIGH ? HIGH : LOW); }每次电平变化时推送便于远程了解环境活动。布防完成mqttPub(status, armed); mqttPub(info, armed);告警结束if (warmMs 0) { scrNow(Armed, System OK, ...); mqttPub(status, armed); }启动信息在setup()中发布status/arming和info含预热时长。3.4 屏幕显示与MQTT解耦屏幕刷新逻辑与之前完全一致MQTT发布是“附加动作”不改变原状态机。这样做的好处是即使网络故障本地功能依旧完好。四、操作过程及数据展示4.1 操作步骤连接硬件按接线图连接所有模块确保ESP32供电USB线或电池。配置WiFi在代码开头修改WIFI_SSID和WIFI_PASS为你自己的热点若使用公共EMQX则无需改Broker。上传程序使用零知派编译上传。观察启动串口打印WiFi连接过程成功后显示IP。屏幕显示“Security Arming...”然后60秒倒计时。MQTT连接成功后串口输出“MQTT OK”。订阅MQTT主题使用任意MQTT客户端如MQTTX、mosquitto_sub订阅pir_alarm/#即可收到所有主题。启动后你会看到status/online随后status/arming以及info包含预热秒数。录制语音按住REC键说话松开后屏幕显示保存MQTT会收到record/start和record/end。等待布防倒计时归零屏幕显示“Armed System Armed”同时MQTT收到status/armed。触发入侵在PIR前移动系统立即告警语音屏幕LEDMQTT会收到status/alarm、alarm/1以及PIR电平变化pir/HIGH若之前为LOW。手动测试按下PLAY键同样触发告警MQTT也会发布相同告警主题。远程监控在任何地方打开MQTT客户端即可实时看到系统状态如是否布防、是否告警、当前PIR高低电平。4.2 数据展示主题负载示例触发时机pir_alarm/statusonline,arming,armed,alarm系统启动、预热开始、布防完成、告警触发pir_alarm/pirHIGH/LOWPIR输出电平每次变化时pir_alarm/alarm1告警触发时仅触发时发布一次pir_alarm/recordstart/end录音按键按下/松开pir_alarm/infoboot warmup60s,armed等启动和布防完成时你可以利用这些数据在Node-RED、Home Assistant中建立自动化例如当status/alarm时发送手机通知。4.3 视频演示零知派ESP32—— 远程监控PIR安防告警系统五、技术原理5.1 工作原理MQTT协议轻量级发布/订阅消息协议适用于低带宽、高延迟或不可靠网络环境。ESP32作为客户端连接到Broker如EMQX发布主题任何订阅该主题的客户端都能实时收到消息。系统状态机结合MQTT系统状态预热、布防、告警通过status主题对外广播。PIR信号实时转发可用于远程查看是否有活动。告警事件单独使用alarm主题便于下游过滤和处理。5.2 工作模式配置含网络状态模式本地表现MQTT行为启动/离线屏幕显示但WiFi未连接不发布但定时重试预热中倒计时显示发布status/arming和info布防完成显示“Armed”发布status/armed和info/armed告警中显示“INTRUSION!”发布status/alarm和alarm/1录音中显示“RECORD”发布record/start和record/end网络容错若WiFi连接超时系统仍然可以独立工作MQTT发布会被跳过但不会影响本地告警和屏幕显示适合无网络环境使用。六、常见问题指引Q1MQTT连接失败怎么办检查WiFi是否正常串口会提示IP。确认MQTT Broker地址和端口正确本例使用公共Brokerbroker.emqx.io无需账户。若连接失败系统会每隔10秒重试不影响本地功能。可在mqttReconnect()中添加更多调试信息如打印mqtt.state()。Q2如何更换MQTT Broker或添加认证修改MQTT_BROKER和MQTT_PORT。若需要用户名密码使用mqtt.connect(MQTT_ID, user, pass)重载函数并在代码中定义相应常量。Q3MQTT订阅后收不到消息确认订阅主题前缀完全匹配注意大小写。检查MQTT客户端是否成功连接Broker。可开启EMQX Web管理界面查看实时消息流或使用mosquitto_sub -h broker.emqx.io -t pir_alarm/# -v测试。Q4如何关掉MQTT功能纯本地模式注释掉所有mqttPub调用和#include WiFi.h、#include PubSubClient.h以及setup()中的WiFi/MQTT初始化代码即可回归纯本地版本。