1. 项目背景与需求分析
中药作为我国传统医学的重要组成部分,其存储质量直接关系到药效发挥和用药安全。在实际工作中,我发现许多中小型中药仓库仍采用传统的人工管理方式,存在诸多痛点:
- 环境监测滞后:温湿度数据通常每天仅记录1-2次,无法捕捉突发性环境变化
- 药材状态难把控:霉变、虫蛀等问题往往发现时为时已晚
- 管理效率低下:出入库记录依赖纸质台账,查询统计困难
- 人力成本高企:需要专人定期巡检,且对工作人员专业要求较高
针对这些问题,我设计了一套基于STM32单片机的智能管理系统。经过三个月的实地测试,系统将药材损耗率从原来的15-20%降至5%以下,管理效率提升约60%。下面我将详细介绍这个系统的设计思路和实现细节。
2. 硬件系统设计与选型
2.1 核心控制器选型
经过对比市面上常见的几款单片机,最终选择了STM32F103C8T6作为主控芯片,主要基于以下考虑:
-
性能参数:
- ARM Cortex-M3内核,72MHz主频
- 64KB Flash + 20KB SRAM
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
-
实际使用体验:
- 开发工具链成熟(Keil MDK+ST-Link)
- 社区资源丰富,遇到问题容易找到解决方案
- 性价比高(单价约15-20元)
注意:在采购芯片时要注意区分正品和翻新货,建议通过正规代理商购买。我曾遇到过低价芯片无法正常烧录程序的问题。
2.2 传感器模块设计
2.2.1 环境监测传感器
温湿度传感器选用SHT30,相比常见的DHT22有以下优势:
- 精度更高(±0.3℃ vs ±0.5℃)
- 响应速度更快(2秒 vs 5秒)
- I2C数字接口,抗干扰能力强
接线示意图:
c复制// SHT30与STM32连接方式
SDA -- PB7
SCL -- PB6
VCC -- 3.3V
GND -- GND
气体传感器选用MQ-135,可检测:
- 氨气(药材腐败产生)
- 甲醛(包装材料释放)
- 苯类化合物
实测中发现传感器需要预热5分钟后数据才稳定,在程序中加入了预热等待逻辑。
2.2.2 状态监测传感器
红外对射传感器E18-D80NK用于检测药材存取:
- 检测距离3-80cm可调
- 抗环境光干扰能力强
- 安装时要注意对准发射和接收端
称重模块采用HX711+应变片方案:
- 24位ADC,分辨率高
- 支持差分输入,抗干扰
- 最大称重50kg(满足大多数药材存储需求)
2.3 执行机构设计
执行模块采用继电器控制方案,主要控制两类设备:
-
通风设备:
- 轴流风机(AC220V/50W)
- 安装位置要保证空气循环均匀
-
除湿设备:
- 半导体除湿机(DC12V/60W)
- 需要定期清理冷凝水
继电器选用宏发HF32F系列,触点容量10A,带光耦隔离,确保安全可靠。
3. 软件系统实现
3.1 系统架构设计
软件采用分层架构:
code复制应用层
├─ 人机交互
├─ 业务逻辑
驱动层
├─ 传感器驱动
├─ 执行器驱动
硬件抽象层
├─ GPIO
├─ 定时器
├─ 通信接口
3.2 关键算法实现
3.2.1 环境数据滤波
采用滑动平均滤波结合阈值判断:
c复制#define FILTER_SIZE 5
float temp_filter(float new_val) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
static float sum = 0;
sum -= buffer[index];
buffer[index] = new_val;
sum += new_val;
index = (index + 1) % FILTER_SIZE;
// 异常值判断
if(fabs(new_val - sum/FILTER_SIZE) > 2.0) {
return sum/FILTER_SIZE; // 返回平均值
}
return new_val;
}
3.2.2 药材有效期管理
使用时间戳比对算法:
c复制typedef struct {
char name[20];
uint32_t storage_date; // Unix时间戳
uint32_t expiry_days;
} MedicineInfo;
void check_expiry(MedicineInfo *med, uint32_t current_time) {
uint32_t remaining_days = (med->storage_date + med->expiry_days*86400 - current_time)/86400;
if(remaining_days < 30) {
alert_expiring(med->name, remaining_days);
}
}
3.3 人机交互实现
采用TFT触摸屏+GUIX图形库,主要界面包括:
-
主监控界面:
- 实时温湿度曲线
- 环境状态指示灯
- 异常报警提示区
-
药材管理界面:
- 入库登记
- 出库记录
- 库存查询
-
系统设置界面:
- 报警阈值设置
- 设备测试
- 数据导出
4. 系统测试与优化
4.1 功能测试方案
设计了三阶段测试计划:
-
单元测试:
- 各传感器单独验证
- 执行机构动作测试
- 通信接口稳定性测试
-
集成测试:
- 环境联动控制测试
- 长时间运行稳定性测试
- 断电恢复测试
-
现场测试:
- 在实际仓库环境运行
- 模拟各种异常情况
- 收集用户反馈改进
4.2 性能优化记录
在测试中发现并解决了以下问题:
-
称重数据波动大:
- 问题现象:空载时重量值有±5g波动
- 解决方案:
- 增加硬件滤波电路
- 软件端采用动态阈值滤波
- 改善传感器供电稳定性
-
触摸屏响应慢:
- 问题现象:快速操作时出现卡顿
- 解决方案:
- 优化GUIX刷新机制
- 提高触摸扫描频率
- 减少不必要的全局刷新
-
系统功耗高:
- 问题现象:备用电池续航不足
- 解决方案:
- 增加低功耗模式
- 优化外设电源管理
- 关闭闲置模块时钟
5. 实际应用效果
系统在某中药房仓库运行三个月后,取得了显著效果:
-
环境控制精度:
参数 控制范围 波动幅度 温度 22±2℃ ±0.5℃ 湿度 55±5%RH ±3%RH -
管理效率提升:
- 出入库记录时间从3分钟/次缩短至30秒/次
- 库存盘点时间从2小时缩短至15分钟
-
经济效益:
- 人力成本降低约40%
- 药材损耗减少带来的年节约约2.5万元
6. 经验分享与注意事项
在实际部署过程中,我总结了以下几点重要经验:
-
传感器安装要点:
- 温湿度传感器应避开空调直吹和阳光直射
- 气体传感器要远离通风口
- 称重传感器安装要保证水平
-
系统维护建议:
- 每月清洁一次传感器
- 每季度校准一次称重模块
- 定期检查备用电池状态
-
常见问题排查:
- 如果温湿度读数异常,首先检查传感器供电
- 触摸屏无响应时,尝试重新校准
- 数据丢失可能是SD卡接触不良导致
这个项目从设计到落地共耗时6个月,期间遇到了各种预料之外的问题,但最终都通过系统的方法解决了。对于想要复现这个系统的开发者,我的建议是:先做好充分的需求分析,硬件选型要留有余量,软件设计要模块化,这样后期调试和维护都会轻松很多。