1. 项目背景与核心需求
作为一名在嵌入式领域摸爬滚打多年的工程师,我最近完成了一个很有意思的项目——为本地一家中药连锁企业设计智能仓库监控系统。中药饮片对存储环境极为敏感,温度、湿度和空气质量稍有偏差就会导致药材变质。传统的人工巡检方式不仅效率低下,还容易遗漏异常情况。这个项目让我深刻体会到,嵌入式系统在传统行业的智能化改造中大有可为。
系统需要实现三个核心功能:
- 环境参数实时监测(温度、湿度、CO₂浓度)
- 超阈值自动报警与调控
- 远程数据查看与控制
在方案选型时,我们重点考虑了以下因素:
- 成本控制:商业项目必须考虑硬件BOM成本,STM32系列MCU在性能和价格间取得了很好平衡
- 可靠性:药材存储环境可能比较恶劣(高湿、粉尘),硬件需要具备工业级稳定性
- 易用性:药店工作人员并非技术专家,系统需要做到"开箱即用"
2. 硬件架构设计
2.1 核心控制器选型
经过多款MCU对比测试,最终选定STM32F103C8T6作为主控芯片,这个选择基于以下几点考量:
-
性能参数:
- 72MHz主频的Cortex-M3内核,足够处理多传感器数据融合
- 64KB Flash + 20KB RAM,满足复杂逻辑判断需求
- 112个GPIO口,轻松扩展外围设备
-
实际测试表现:
- 在-20℃~60℃环境温度下运行稳定(超出规格书-40℃~85℃的实验室数据)
- 连续72小时压力测试无死机现象
- 市场价格稳定在15-20元区间,供货渠道可靠
经验提示:采购STM32时要注意区分正品(丝印清晰、边角无毛刺),市场上存在不少翻新芯片
2.2 传感器模块配置
传感器选型直接决定系统监测精度,我们采用了以下方案:
| 传感器类型 | 型号 | 测量范围 | 精度 | 采样周期 | 接口方式 |
|---|---|---|---|---|---|
| 温度 | DS18B20 | -55℃~+125℃ | ±0.5℃ | 1s | 1-Wire |
| 湿度 | SHT30 | 0~100%RH | ±2%RH | 2s | I2C |
| CO₂ | MH-Z19C | 0~5000ppm | ±50ppm | 10s | UART |
选择这些传感器的关键考虑:
- DS18B20:虽然精度不如I2C传感器,但单总线设计节省IO口,且具备防水封装
- SHT30:瑞士进口传感器,长期稳定性好,自带温度补偿
- MH-Z19C:NDIR原理检测,比电化学传感器寿命更长(约5年)
2.3 外围电路设计
最小系统电路设计有几个关键点需要注意:
- 电源部分:采用AMS1117-3.3V稳压芯片,输入端加装TVS二极管防浪涌
- 复位电路:10kΩ上拉电阻+0.1μF电容组合,确保可靠复位
- 晶振电路:8MHz主晶振+32.768kHz RTC晶振,布局时远离高频信号线
调试中发现一个典型问题:当WiFi模块工作时,会导致CO₂传感器数据异常。解决方案是:
- 给传感器电源增加LC滤波电路
- 软件上错开WiFi通信和传感器采样时序
- 在PCB布局时将模拟和数字部分分区
3. 软件实现细节
3.1 开发环境搭建
使用Keil MDK-ARM 5.25版本开发,有几个配置技巧值得分享:
- 在Options→Target中勾选"Use MicroLIB",可以节省约3KB Flash空间
- 调试时启用Event Recorder,可以实时查看任务执行情况
- 建议安装STM32CubeMX生成初始化代码,但关键外设驱动建议手写
3.2 主程序流程图
系统软件采用前后台架构:
code复制初始化 → 传感器采样 → 数据处理 →
├─ 超限判断 → 报警/控制
├─ 数据显示更新
└─ 网络数据上传
关键代码片段(数据滤波算法):
c复制#define FILTER_LEN 5
float temp_filter_buf[FILTER_LEN];
float median_filter(float new_val) {
// 滑动窗口更新
for(int i=0; i<FILTER_LEN-1; i++){
temp_filter_buf[i] = temp_filter_buf[i+1];
}
temp_filter_buf[FILTER_LEN-1] = new_val;
// 冒泡排序
for(int i=0; i<FILTER_LEN-1; i++){
for(int j=i+1; j<FILTER_LEN; j++){
if(temp_filter_buf[i] > temp_filter_buf[j]){
float temp = temp_filter_buf[i];
temp_filter_buf[i] = temp_filter_buf[j];
temp_filter_buf[j] = temp;
}
}
}
return temp_filter_buf[FILTER_LEN/2]; // 取中值
}
3.3 通信协议设计
WiFi模块(ESP8266)采用自定义的轻量级协议:
code复制[HEAD][LEN][CMD][DATA][CRC]
0x55 1Byte 1Byte NByte 2Byte
典型数据包示例:
- 环境数据上报:55 07 01 14 32 04 57 00 00
- 温度20℃(0x14),湿度50%(0x32),CO₂1111ppm(0x0457)
- 阈值设置命令:55 05 02 19 23 00 00
- 设置温度上限25℃(0x19),湿度上限35%(0x23)
4. 系统调试与优化
4.1 测试方法论
采用分级测试策略:
- 单元测试:每个传感器单独验证,使用标准源校准
- 集成测试:模块联调,重点观察信号干扰问题
- 场景测试:模拟仓库环境变化(如开门导致的温湿度突变)
4.2 典型问题排查
问题现象:湿度传感器在高温环境下读数漂移
排查过程:
- 检查电源电压——正常(3.3V±0.05V)
- 更换传感器模块——问题依旧
- 检查I2C上拉电阻——发现设计为10kΩ,在长距离传输时不足
解决方案:将上拉电阻改为4.7kΩ,并缩短走线距离
问题现象:WiFi频繁断连
根本原因:电源模块带载能力不足,当继电器动作时电压跌落
解决方案:
- 更换为2A输出的DC-DC模块
- 在WiFi模块电源端增加1000μF储能电容
5. 实际部署经验
在三个不同规模仓库的部署中,我们总结出以下经验:
-
传感器布置原则:
- 每50㎡布置1个监测点
- 避开空调直吹和门窗位置
- 离地高度1.5-2米(与药材存储高度一致)
-
系统维护要点:
- 每月用酒精棉清洁传感器表面
- 每季度校准一次CO₂传感器(使用标准气体)
- 定期检查继电器触点氧化情况
-
异常处理流程:
- 初级报警:本地声光报警+APP通知
- 持续超标:自动启动通风设备
- 严重异常:电话短信通知负责人
这个项目最让我自豪的是,系统投入使用后帮助客户减少了约30%的药材损耗。在硬件设计上,有几个决策被证明非常关键:选用工业级元器件、预留足够的IO扩展口、采用模块化设计方便后期升级。对于类似的环境监控项目,我的建议是:不要过分追求传感器精度,系统的可靠性和易维护性往往更重要。