
1. 项目背景与核心价值去年参与某湖泊水质监测项目时我们团队遇到了一个棘手问题如何在不破坏生态环境的前提下实现大面积水域的实时水质监测传统有线方案布线成本高WiFi覆盖范围有限最终我们选择了4GLora的组合方案。这个开源项目就是在此基础上提炼出来的实战成果特别适合需要远程、低功耗、广覆盖的水质监测场景。COD化学需氧量作为水质关键指标其监测设备通常需要部署在野外、河道等环境恶劣区域。4G模块负责将数据上传至云端Lora则用于设备间的短距离通信两者结合既保证了数据传输可靠性又降低了整体功耗。我曾实测过在相同采样频率下纯4G方案的设备续航只有Lora4G组合方案的1/3。2. 硬件选型与核心组件2.1 主控模块选择对比过ESP32、STM32和树莓派Pico后我们最终选择了STM32F103C8T6作为主控。这个蓝色小强虽然资源有限64KB SRAM/128KB Flash但胜在三点实时性直接寄存器操作响应速度1μs低功耗运行模式下仅36mA待机模式可降至2μA丰富接口自带3个USART正好满足4G、Lora和调试口需求注意如果监测参数超过5个如CODpH浊度溶解氧等建议升级到STM32F407系列否则内存容易溢出。2.2 4G模块选型对比实测过移远EC20、广和通L610和SIMCOM SIM7600后推荐使用EC20-CE功耗数据传输时峰值电流500mA网络支持全网通4G向下兼容2G稳定性-30℃~75℃宽温工作价格某宝均价约120元// 典型AT指令配置示例 ATQICSGP1,1,CMNET,,,1 // 设置APN ATQIACT1 // 激活PDP上下文 ATQMTOPEN1,mqtt.服务器地址,1883 // 连接MQTT服务器2.3 COD传感器选型市面上COD传感器主要分两类紫外吸收法如HACH DR3900优点无需试剂维护简单缺点精度±5%单价3000元重铬酸钾法如力合科技LST-200优点精度±2%缺点需定期更换试剂对于预算有限的项目推荐使用深圳某厂的JXBS-3001-CODCr虽然需要每3个月更换试剂但单价仅800元左右且提供Modbus RTU接口。3. 4G接入MQTT全流程实现3.1 云端服务搭建以阿里云IoT平台为例关键配置步骤创建产品节点类型直连设备联网方式蜂窝4G/5G数据格式透传/自定义添加物模型{ properties: [ { identifier: CODValue, dataType: double, unit: mg/L, accessMode: r } ] }获取三元组ProductKeyDeviceNameDeviceSecret3.2 设备端MQTT连接实现使用Paho MQTT嵌入式客户端库关键代码逻辑void MQTT_Connect() { MQTTClient client; Network network; NetworkInit(network, 4G_Send, 4G_Recv); MQTTClientInit(client, network, 30000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf)); MQTTPacket_connectData data MQTTPacket_connectData_initializer; data.MQTTVersion 3; data.clientID.cstring device01; data.username.cstring token; data.password.cstring 加密后的DeviceSecret; if(MQTTConnect(client, data) ! SUCCESS) { printf(连接失败错误码%d, client.error); } }踩坑记录阿里云要求TLS加密连接但STM32F103的RAM不足以加载完整SSL库解决方案是使用平台提供的单向认证简化方案。3.3 数据上传协议设计采用精简JSON格式减少流量消耗{ t: 1672531200, v: 12.5, bat: 3.7, sig: 23 }时间戳Unix时间戳4字节数值保留1位小数4字节电池电压1位小数2字节信号强度整数1字节经测试单条数据仅11字节按每小时上传1次计算每月流量消耗约8KB。4. 低功耗优化实战4.1 电源管理策略采用分时供电方案COD传感器仅在采样时供电每次通电预热3分钟4G模块数据上传后立即断电Lora模块持续低功耗监听仅唤醒主控实测功耗对比工作模式电流消耗持续时间备注深度睡眠15μA55分钟RTC保持传感器加热120mA3分钟COD预热4G传输450mA12秒包含TCP建连4.2 数据缓存机制在信号不佳区域实现三级缓存内存缓存最新5条数据STM32内部RAMFlash缓存循环存储100条数据W25Q16芯片云端补传网络恢复后按时间戳顺序重传void SaveToFlash(uint8_t *data) { static uint32_t writeAddr 0; W25Q_Write(writeAddr, data, 11); writeAddr (writeAddr 11) % (100*11); }5. 常见问题排查手册5.1 4G模块无法注册网络排查步骤检查SIM卡状态ATCPIN? CPIN: READY检查信号强度ATCSQ CSQ: 18,99 // 18表示RSSI18dBm检查APN设置ATQICSGP? QICSGP: CMNET5.2 MQTT频繁断连优化方案增加心跳间隔默认60秒改为300秒data.keepAliveInterval 300;启用自动重连client.automaticReconnect 1;添加网络质量检测基于信号强度if(CSQ_Value 10) delay(5000); // 弱信号时延迟发送5.3 COD数据异常波动可能原因及处理试剂失效更换试剂后需重新校准执行ATCalibrate0探头污染用软毛刷清洁光学窗口温度影响添加温度补偿算法float TempCompensate(float raw, float temp) { return raw * (1 0.02*(temp-25)); }6. 项目优化方向多参数扩展通过RS485接口接入pH、溶解氧等传感器边缘计算在设备端实现COD超标预警节省流量if(COD_Value 50.0) { SendAlert(COD超标当前值%.1f, COD_Value); }太阳能供电搭配6W光伏板18650电池实现永久续航这个项目最让我惊喜的是Lora的穿透能力——在植被茂密的湖区4G信号强度只有-105dBm时Lora仍能维持1km范围内的可靠通信。建议部署时采用4G主节点Lora子节点的组网方式既能扩大覆盖又降低整体成本。