1. 项目背景与核心思路
去年给健身房做智能储物柜时,发现传统投币式控制存在找零麻烦、维护成本高等问题。正好手头有个闲置的ESP32开发板,于是琢磨着用扫码支付+物联网的方案改造家用电器控制。这个方案的特别之处在于实现了"预通电"机制——用户扫码后设备先进入低功耗准备状态,支付成功瞬间完成高压电路接通。
核心控制逻辑分三个层面:
- 硬件层:ESP32通过GPIO控制继电器模块,采用光耦隔离确保强电安全
- 通信层:小程序与服务器HTTP通信,服务器通过MQTT协议控制设备端
- 业务层:支付成功后生成带时效的电子令牌,设备端验证通过后执行通电
关键设计原则:强电控制必须与弱电系统物理隔离,所有支付相关操作要求HTTPS加密传输,设备端关键操作必须进行本地持久化记录。
2. 硬件搭建与电路设计
2.1 元器件选型要点
- 主控芯片:ESP32-WROOM-32D(兼具WiFi/蓝牙,内置双核处理器)
- 继电器模块:选用JQC-3FF-S-Z带光耦隔离的5V继电器
- 电源方案:采用双路供电设计(3.3V给MCU,独立12V给继电器)
电路连接特别注意:
plaintext复制ESP32 GPIO15 → 继电器IN+
继电器COM端 → 220V火线输入
继电器NO端 → 用电器火线
继电器NC端悬空(避免意外短路)
2.2 安全防护措施
- 强电走线全部使用1.5mm²阻燃线
- 继电器输出端并联压敏电阻(型号MYG07D471K)防浪涌
- 控制板加装透明亚克力防护罩
- 所有裸露接头用热缩管包裹
实测中发现的问题:当继电器频繁切换时,ESP32会出现电压波动导致重启。解决方案是在3.3V电源处并联470μF电解电容。
3. 软件系统架构
3.1 设备端固件开发
核心控制逻辑采用有限状态机设计:
cpp复制enum DeviceState {
STANDBY, // 待机状态
SCAN_RECEIVED, // 扫码已接收
PAY_VERIFYING, // 支付验证中
POWER_ON, // 通电状态
FAULT // 故障状态
};
// 状态转移条件
if(currentState == STANDBY && scanReceived){
startPaymentVerification();
currentState = SCAN_RECEIVED;
}
时间同步方案对比:
- 方案1:每次上电同步NTP(网络延迟影响精度)
- 方案2:RTC模块DS3231(成本增加)
- 最终选择:NTP校时+本地软件时钟补偿
3.2 服务端关键逻辑
支付验证流程:
- 小程序生成包含设备ID、时间戳的签名
- 服务端校验签名时效性(5分钟内有效)
- 查询支付平台订单状态
- 通过MQTT下发控制指令
消息队列设计:
python复制# 使用RabbitMQ实现优先级队列
channel.queue_declare(queue='device_control', arguments={
'x-max-priority': 3 # 0-普通 1-重要 2-紧急
})
# 支付消息设为最高优先级
channel.basic_publish(
exchange='',
routing_key='device_control',
body=json.dumps(payload),
properties=pika.BasicProperties(priority=2)
)
4. 核心问题解决方案
4.1 支付到通电延迟优化
原始方案问题点:
- MQTT消息传输平均耗时800ms
- 继电器机械动作需要120ms
- WiFi重连可能造成2-3秒延迟
优化措施:
- 预加载机制:扫码时先发送"PRE_LOAD"指令,继电器线圈预通电
- 本地缓存最近5分钟支付记录
- 采用QoS1级别的MQTT消息
实测数据对比:
| 方案 | 平均延迟 | 成功率 |
|---|---|---|
| 原始方案 | 2.1s | 92% |
| 优化方案 | 0.4s | 99.7% |
4.2 防逃单设计
多重保障机制:
- 硬件看门狗:STM32独立监控ESP32运行状态
- 用电计量:通过HLW8032芯片实时监测功率
- 软件心跳:每10秒上报设备状态到服务器
逃单处理流程:
mermaid复制graph TD
A[检测断电事件] --> B{是否正常结束}
B -->|是| C[记录正常日志]
B -->|否| D[触发逃单标记]
D --> E[小程序推送补缴通知]
E --> F{2小时内未处理}
F -->|是| G[加入设备黑名单]
5. 实际应用中的经验总结
5.1 继电器选型教训
初期使用普通继电器遇到的问题:
- 触点粘连(连续开关1000次后出现)
- 线圈发热严重(温度可达70℃)
- 动作噪音明显
改进方案:
- 换用磁保持继电器(如TQ2-L2-5V)
- 增加继电器散热片
- 触点两端并联RC缓冲电路(100Ω+0.1μF)
5.2 安全防护升级
遭遇过的攻击方式:
- MQTT协议爆破攻击
- 伪造支付回调
- 重放攻击
应对措施:
- 启用MQTT TLS加密
- 支付签名增加设备特征码
- 实现一次性令牌机制
6. 系统性能优化记录
6.1 内存管理技巧
ESP32内存分配策略:
cpp复制// 使用PSRAM扩展内存
#if CONFIG_SPIRAM_SUPPORT
heap_caps_malloc_extmem_enable(512); // 限制PSRAM使用量
#endif
// 关键任务使用内部RAM
void* critical_mem = heap_caps_malloc(1024, MALLOC_CAP_INTERNAL);
6.2 网络通信优化
WiFi连接参数调整:
cpp复制WiFi.setSleep(false); // 禁用睡眠模式
WiFi.setTxPower(WIFI_POWER_19_5dBm); // 适当降低发射功率
esp_wifi_set_ps(WIFI_PS_NONE); // 关闭省电模式
实测效果:
- 连接稳定性提升40%
- 功耗增加约15mA(可接受范围)
7. 扩展应用场景
这套系统经过改造可用于:
- 共享洗衣机控制(增加水位传感器接口)
- 商用咖啡机(配合流量计实现按量收费)
- 电动车充电桩(扩展CAN总线通信)
在电动车充电场景下的特殊处理:
- 增加CP信号检测(GB/T 18487.1标准)
- 实现PWM占空比控制充电电流
- 接地故障检测(GFCI保护)