1. 项目概述
这个基于NB-IoT的智能井盖安防与在线监测系统,是我去年参与的一个城市基础设施智能化改造项目。当时市政部门找到我们团队,希望能解决传统井盖管理中的几个痛点:无法实时监测状态、异常情况难以及时发现、人工巡检成本高等问题。
系统以STM32F103C8T6为主控,集成了温湿度、倾斜角度、水位和甲烷浓度等多种传感器,通过NB-IoT实现远程数据传输,并具备北斗定位功能。当检测到井盖倾斜超过15度、温度高于50℃或水位超过阈值时,会立即触发声光报警并通过网络上报异常。
提示:在实际部署中发现,井盖倾斜15度的阈值在坡道区域容易误报,建议根据地形特点动态调整该参数。
2. 系统架构设计
2.1 硬件组成框图
整个系统采用模块化设计,主要包含以下核心部件:
[传感器层] → [主控层] → [通信层] → [云端平台] ↑ ↑ [供电系统] [本地报警]具体硬件选型:
- 主控芯片:STM32F103C8T6(性价比高,外设丰富)
- 通信模块:移远BC26(支持NB-IoT和GNSS)
- 倾角检测:MPU6050(集成加速度计+陀螺仪)
- 气体检测:MQ-4甲烷传感器(量程300-10000ppm)
- 显示模块:0.96寸OLED(低功耗,可视角度大)
2.2 关键电路设计要点
电源管理电路: 采用TP4056锂电池充电管理芯片+AMS1117-3.3V LDO的组合方案。实测中,当系统处于深度休眠模式时,整机电流可控制在0.5mA以下,配合6000mAh锂电池可实现至少3个月的续航。
传感器接口设计:
- DHT11温湿度传感器接PA0(需10K上拉电阻)
- MPU6050通过I2C连接(PB6/PB7)
- MQ-4甲烷传感器接PA1(需分压电路)
- 水位传感器接PA2(注意防水处理)
注意:MQ-4传感器需要预热3-5分钟才能稳定工作,在程序初始化时要加入预热等待。
3. 核心功能实现
3.1 多传感器数据融合算法
为了解决单一传感器误报问题,我们采用了加权投票算法:
#define TEMP_WEIGHT 0.3 #define TILT_WEIGHT 0.4 #define WATER_WEIGHT 0.2 #define GAS_WEIGHT 0.1 uint8_t is_emergency(void) { float score = 0; if(temp > 50) score += TEMP_WEIGHT; if(tilt > 15) score += TILT_WEIGHT; if(water > 70) score += WATER_WEIGHT; if(gas > 1000) score += GAS_WEIGHT; return (score >= 0.6) ? 1 : 0; }3.2 NB-IoT通信实现
使用BC26模块的AT指令进行数据传输,关键流程:
- 初始化模块:
AT+CFUN=1 AT+CGDCONT=1,"IP","CMNBOT" AT+CGATT=1- 发送数据到云平台:
AT+QIOPEN=1,0,"UDP","106.14.82.92",5683,0,1 AT+QISEND=0,24,"0102030405060708090A0B0C"实测发现:在城市环境下,NB-IoT信号穿透力强但带宽有限,建议将数据包压缩在50字节以内,发送间隔不小于5分钟。
3.3 低功耗设计技巧
通过以下措施优化功耗:
- 使用STM32的Stop模式(RTC唤醒)
- 传感器分时供电(MOS管控制)
- 关闭未用外设时钟
- OLED仅在有报警时点亮
休眠模式配置代码:
void enter_stop_mode(void) { HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新初始化时钟 SystemClock_Config(); }4. 实际部署经验
4.1 安装注意事项
- 防水处理:所有接缝处使用704硅橡胶密封
- 防震设计:PCB板加装橡胶减震垫
- 天线布置:NB-IoT天线应竖直向上安装
- 传感器定位:
- 水位传感器距井底10cm
- 气体传感器靠近井壁
- 倾角传感器平行于井盖平面
4.2 常见问题排查
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 数据上传失败 | SIM卡欠费 | 检查物联网卡状态 |
| 定位偏差大 | 天线被金属遮挡 | 调整天线位置 |
| 误报频繁 | 阈值设置不当 | 现场校准参数 |
| 续航时间短 | 休眠未生效 | 检查唤醒源配置 |
4.3 成本控制方案
经过多次迭代,我们最终将单点硬件成本控制在300元以内:
- 主控改用STM32F103C8T6(替代原计划的F4系列)
- 自制传感器支架(替代成品外壳)
- 批量采购国产传感器
- 使用公共物联网平台(避免自建服务器)
5. 软件设计要点
5.1 主程序流程图
开始 ↓ 硬件初始化 ↓ 传感器校准 ↓ 进入主循环: 读取传感器数据 → 数据处理 → 异常判断 ↓ [异常] → 本地报警 → 数据上传 ↓ 进入低功耗模式(5分钟)5.2 关键驱动程序
MPU6050倾角计算:
float get_tilt_angle(void) { int16_t acc_x, acc_y, acc_z; MPU6050_ReadAccel(&acc_x, &acc_y, &acc_z); float angle = atan2(acc_y, acc_z) * 180/M_PI; return fabs(angle); // 取绝对值 }OLED菜单界面: 采用状态机设计,通过按键切换显示页面:
typedef enum { PAGE_MAIN, PAGE_TEMP, PAGE_TILT, PAGE_SETTING } PageType; PageType current_page = PAGE_MAIN; void key_handler(uint8_t key) { switch(key) { case KEY1: current_page = (current_page + 1) % 4; break; case KEY2: adjust_threshold(1); break; // 阈值+ case KEY3: adjust_threshold(-1); break; // 阈值- } }6. 项目优化方向
根据半年来的实际运行数据,下一步计划进行以下改进:
- 预测性维护:基于历史数据建立趋势模型,预测可能发生的故障
- 边缘计算:在设备端增加简单AI模型,过滤误报数据
- 太阳能供电:试点安装太阳能板+超级电容的方案
- 多协议支持:增加LoRa作为NB-IoT的备份通信通道
这个项目让我深刻体会到,物联网系统落地不仅需要考虑技术实现,更要关注部署环境、运维成本和长期可靠性。特别是在市政工程中,设备的抗干扰性和稳定性往往比 fancy 的功能更重要