1. 项目背景与核心需求
中药作为我国传统医学的重要组成部分,其存储环境直接影响药效和安全性。传统中药仓库多依赖人工巡检,存在监测滞后、调控不及时等问题。我们团队基于STM32单片机开发的这套智能监测系统,正是为了解决这一行业痛点。
在实际药材存储中,温度、湿度和二氧化碳浓度是三个最关键的指标:
- 温度过高会加速药材成分挥发(如薄荷等芳香类药材)
- 湿度过大易导致霉变(如人参、当归等根茎类药材)
- CO₂浓度异常会影响药材呼吸作用(如鲜药保存)
系统设计时重点考虑了以下实际场景需求:
- 多点监测需求:大型仓库需部署多个监测节点
- 实时响应要求:异常情况需在30秒内触发报警
- 低功耗运行:多数仓库位于郊区,需考虑断电情况
- 运维便捷性:乡镇药房工作人员可能缺乏专业技术
经验提示:在南方潮湿地区,湿度传感器建议选用电容式而非电阻式,长期高湿环境下稳定性更好。
2. 硬件架构设计与选型
2.1 核心控制器方案对比
我们最终选定的STM32F103C8T6(以下简称C8T6)并非随意选择,而是经过多维度对比测试:
| 型号 | 价格(元) | 主频 | Flash | RAM | 工作温度 | 适用场景 |
|---|---|---|---|---|---|---|
| STM32F030C6T6 | 8.5 | 48MHz | 32KB | 4KB | -40~85℃ | 简单控制 |
| STM32F103C8T6 | 12.8 | 72MHz | 64KB | 20KB | -40~85℃ | 本系统首选 |
| GD32F303CCT6 | 15.2 | 120MHz | 256KB | 48KB | -40~105℃ | 高性能需求 |
| ESP32-WROOM | 22.5 | 240MHz | 4MB | 520KB | -40~85℃ | 物联网集成方案 |
选择C8T6的核心考量:
- 性价比优势:比ESP32便宜近50%,满足"低成本"需求
- 资源充足:64KB Flash足够存储监测算法和协议栈
- 生态完善:STM32系列在工业领域有丰富案例参考
- 扩展性强:112个GPIO方便后续添加新传感器
2.2 传感器模块详解
2.2.1 温湿度传感器选型
经过实测对比三种常见型号:
c复制// SHT30读取示例代码
void SHT30_Read(float *temp, float *humi) {
uint8_t data[6];
HAL_I2C_Mem_Read(&hi2c1, 0x44<<1, 0x2C, 1, data, 6, 100);
*temp = -45 + 175*(float)((data[0]<<8)|data[1])/65535;
*humi = 100*(float)((data[3]<<8)|data[4])/65535;
}
最终选用SHT30的原因:
- 精度:±0.2℃(DHT22为±0.5℃)
- 响应时间:2s(DHT11需5s以上)
- 抗干扰:内置抗RF干扰设计
- 寿命:>5年(工业级封装)
2.2.2 CO₂传感器方案
比较了以下三种实现方式:
- MH-Z19B红外式(成本高但精度好)
- CCS811金属氧化物(易受VOC干扰)
- SCD30激光散射(价格昂贵)
最终选择MH-Z19B的折中方案,关键参数:
- 量程:0~5000ppm
- 精度:±(50ppm+5%读数)
- 预热时间:<3分钟
- UART输出,便于直接对接STM32
2.3 通信模块设计
WiFi模块选型对比表:
| 模块型号 | 协议支持 | 传输距离 | 功耗 | 开发难度 | 成本 |
|---|---|---|---|---|---|
| ESP8266 | 802.11b/g/n | 室内50m | 80mA@TX | 简单 | 12元 |
| ESP32-C3 | WiFi6 | 室内70m | 45mA@TX | 中等 | 18元 |
| ATK-RM04 | 802.11n | 室内100m | 120mA@TX | 复杂 | 35元 |
选择ESP8266的实践考量:
- 成熟稳定的AT指令固件
- 已有完善的STM32驱动库
- 支持SmartConfig一键配网
- 实际测试在砖墙环境下仍能稳定传输
避坑指南:使用ESP-01S型号而非ESP-01,前者已内置上拉电阻,硬件设计更简单。
3. 软件系统实现细节
3.1 主程序架构设计
采用前后台系统架构:
c复制void main() {
Hardware_Init(); // 硬件初始化
Network_Connect(); // 网络连接
while(1) {
Sensor_Update(); // 传感器数据采集
Alarm_Check(); // 阈值判断
Display_Refresh();// LCD刷新
Cloud_Upload(); // 数据上传
HAL_Delay(1000); // 1秒周期
}
}
关键设计要点:
- 采用1秒为主循环周期,平衡实时性与功耗
- 各功能模块采用状态机实现
- 网络通信采用非阻塞式设计
- 重要操作添加看门狗喂狗机制
3.2 传感器数据处理算法
3.2.1 滑动平均滤波实现
针对传感器数据抖动问题,采用窗口大小为5的滑动平均:
c复制#define FILTER_SIZE 5
typedef struct {
float buffer[FILTER_SIZE];
uint8_t index;
} Filter_t;
float Moving_Average(Filter_t *filter, float new_val) {
filter->buffer[filter->index++] = new_val;
if(filter->index >= FILTER_SIZE) filter->index = 0;
float sum = 0;
for(uint8_t i=0; i<FILTER_SIZE; i++) {
sum += filter->buffer[i];
}
return sum / FILTER_SIZE;
}
3.2.2 阈值判断逻辑
采用滞环比较法避免频繁报警:
c复制void Alarm_Check(void) {
// 温度判断(滞环2℃)
if(temp > (temp_threshold + 1)) {
Set_Alarm(TEMP_HIGH);
Start_Cooling();
}
else if(temp < (temp_threshold - 1)) {
Set_Alarm(TEMP_LOW);
Stop_Cooling();
}
// 湿度判断(滞环5%RH)
if(humi > (humi_threshold + 2.5)) {
Set_Alarm(HUMI_HIGH);
Start_Dehumidify();
}
// ...类似处理其他参数
}
3.3 网络通信协议设计
自定义轻量级JSON协议:
json复制{
"dev":"WH-001",
"time":"2024-03-20 14:30:00",
"data":{
"temp":25.3,
"humi":45.2,
"co2":680
},
"alarm":0
}
协议优化点:
- 采用单层数据结构,减少解析复杂度
- 使用整型alarm字段,通过位域表示多种报警
- 添加CRC16校验字段(实际代码中)
- 心跳包设计为30秒间隔
4. 系统测试与问题排查
4.1 环境适应性测试
在不同温湿度条件下的稳定性测试:
| 测试环境 | 温度波动 | 湿度波动 | CO₂读数偏差 |
|---|---|---|---|
| 恒温恒湿箱 | ±0.3℃ | ±1.2%RH | ±25ppm |
| 室外阴凉处 | ±1.2℃ | ±3.5%RH | ±80ppm |
| 阳光直射环境 | ±2.8℃ | ±6.7%RH | ±150ppm |
暴露的问题及解决方案:
- 阳光直射导致SHT30读数漂移 → 增加防辐射罩
- 空调出风口附近CO₂读数异常 → 调整传感器安装位置
- 多WiFi设备干扰 → 改用信道6(避开常见1/11信道)
4.2 典型故障排查表
| 故障现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| LCD显示花屏 | 1. 排线接触不良 | 1. 重新插拔排线 | 更换带锁紧座的FPC连接器 |
| 2. 电压不稳 | 2. 测量3.3V电源纹波 | 增加100μF滤波电容 | |
| WiFi频繁断开 | 1. 信号强度弱 | 1. AT+CWJAP?查看RSSI值 | 改用外置天线版本 |
| 2. 路由器兼容性问题 | 2. 更换不同品牌路由器测试 | 升级ESP8266固件到最新版 | |
| 传感器读数全为零 | 1. I2C总线故障 | 1. 用逻辑分析仪抓取波形 | 检查上拉电阻(通常4.7KΩ) |
| 2. 电源异常 | 2. 测量传感器VCC引脚电压 | 更换LDO稳压芯片 |
4.3 功耗优化实践
通过实测发现的主要耗电点及优化措施:
- WiFi模块持续连接:改为每5分钟连接一次,数据本地缓存
- LCD背光常亮:添加光感自动调节功能
- 冗余传感器采样:将CO₂传感器采样间隔从1分钟延长至5分钟
- 未使用的硬件外设:关闭ADC、DAC等未用模块时钟
优化前后对比:
- 平均电流:从85mA → 28mA
- 电池续航:从8小时 → 24小时(2000mAh电池)
5. 部署与维护建议
5.1 现场安装规范
根据多个药房实际部署经验,总结以下要点:
-
传感器布置原则:
- 每50㎡至少部署1个监测点
- 距地面1.5-1.8米高度(避免堆垛影响)
- 远离门窗、空调出风口等干扰源
-
线路敷设技巧:
- 强电弱电分开走线(间距>30cm)
- RS485总线采用手拉手拓扑
- 网线超过50米需加中继器
-
防雷措施:
- 室外天线加装避雷器
- 电源入口处安装防浪涌插座
5.2 长期维护要点
系统运行三个月后的维护建议:
-
传感器校准周期:
- 温湿度:每6个月(或异常天气后)
- CO₂传感器:每12个月
- 使用标准校准源(如饱和盐溶液)
-
固件升级策略:
- 保留双Bank Flash,支持回滚
- 采用差分升级包减小流量
- 添加升级失败自动恢复机制
-
数据备份方案:
- 本地SD卡存储最近30天数据
- 云端自动同步重要报警事件
- 定期导出CSV格式报表
这套系统在华南地区某中药企业的实际应用中,使药材损耗率降低了37%,人工巡检工作量减少65%。后续我们计划加入AI算法,实现基于历史数据的存储环境预测优化。