1. 项目背景与核心需求
这个项目源于工业自动化现场的一个典型需求:如何同时采集多路数字信号并实现远程开关控制。在传统产线改造项目中,我们经常遇到需要监控数十个接近开关、光电传感器的状态,同时还要控制电磁阀、继电器等执行机构的情况。
最原始的解决方案是使用PLC配合扩展模块,但成本高昂且布线复杂。后来尝试过用单片机开发,又面临通信距离和稳定性的问题。直到物联网技术成熟后,我们发现用ESP32这类芯片配合适当的电路设计,能够以1/5的成本实现同等功能,还自带无线控制能力。
核心需求可以拆解为三个层面:
- 采集端:需要支持至少16路数字输入,采样频率不低于100Hz
- 控制端:提供8路继电器输出,单路负载能力10A/250VAC
- 通信层:通过WiFi实现数据上传和指令接收,断网时能缓存100条记录
2. 硬件架构设计
2.1 主控选型对比
我们对比了三款主流方案:
- STM32F407+ESP8266组合
- 优势:STM32的ADC性能优异
- 劣势:双芯片设计增加复杂度
- 树莓派+扩展板
- 优势:开发便捷
- 劣势:工业环境稳定性欠佳
- ESP32单芯片方案
- 内置WiFi/BLE双模
- 双核处理器可分工处理采集和通信
- 最终选择ESP32-WROVER模组,带4MB PSRAM
2.2 输入电路设计
数字输入部分采用光耦隔离设计,关键参数:
- 输入电压范围:5-24VDC自适应
- 响应时间:<1ms
- 保护电路:TVS管防浪涌,自恢复保险丝过流保护
特别在PCB布局时,将光耦的输入输出分置板卡两侧,有效降低干扰。实测在变频器附近安装时,误触发率<0.01%。
2.3 输出电路设计
继电器模块的三大设计要点:
- 驱动电路:用达林顿阵列ULN2803代替三极管,简化布线
- 灭弧设计:继电器触点并联RC吸收回路(100Ω+0.1μF)
- 状态反馈:通过光耦实时回读触点状态
重要提示:继电器线圈必须反向并联续流二极管,我们曾因漏接导致一个月损坏3个继电器。
3. 软件实现方案
3.1 数据采集逻辑
采用FreeRTOS创建两个任务:
- 高优先级任务:定时器触发采集
- 使用GPIO中断+去抖动算法
- 状态变化时打时间戳存入环形缓冲区
- 低优先级任务:数据处理与上传
- 协议转换(原始数据→JSON)
- 断网时写入SPIFFS
关键代码片段:
c复制void IRAM_ATTR gpio_isr_handler(void* arg) {
uint32_t gpio_num = (uint32_t)arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}
3.2 通信协议设计
自定义轻量级协议帧结构:
| 偏移量 | 长度 | 说明 |
|---|---|---|
| 0 | 1 | 帧头0xAA |
| 1 | 2 | 数据长度 |
| 3 | 1 | 命令类型 |
| 4 | N | 数据体 |
| N+4 | 2 | CRC16校验 |
实测在2.4GHz频段拥挤环境下,加入前导码和重传机制后,丢包率从15%降至0.3%。
4. 实际部署经验
4.1 抗干扰措施
在金属加工车间部署时遇到的典型问题:
- 变频器导致WiFi频繁断开
- 电弧干扰造成误触发
解决方案:
- 改用5GHz WiFi(需ESP32-S2)
- 输入线缆改用双绞屏蔽线
- 外壳接大地电阻<4Ω
4.2 电源管理
发现的问题:多个继电器同时动作时MCU重启
根本原因:电源模块动态响应不足
改进方案:
- 主电源改用30W工业级DC-DC
- 增加2200μF电解电容储能
- 继电器分时上电(软件实现)
5. 性能测试数据
连续72小时压力测试结果:
| 指标 | 测试值 | 标准要求 |
|---|---|---|
| 采集响应延迟 | 0.8±0.2ms | ≤2ms |
| 命令执行延迟 | 12ms(WiFi) | ≤50ms |
| 通信丢包率 | 0.2% | ≤1% |
| 温度漂移 | ±1.5%FS | ±3%FS |
6. 应用场景扩展
除工业场景外,我们还成功应用于:
- 农业大棚:配合土壤传感器实现自动灌溉
- 智能家居:改造老旧窗帘电机
- 实验室设备:多台仪器联动控制
一个有趣的改装案例:用这个系统控制乐高机械组,通过MQTT协议接入HomeAssistant,实现了用手机APP控制乐高工厂流水线。这证明该方案的灵活性和可扩展性远超预期。