1. 项目背景与核心需求
中药作为我国传统医学的重要组成部分,其存储环境直接影响药材品质和药效。传统中药仓库普遍存在温湿度控制不精准、人工巡检效率低、异常响应滞后等问题。去年我在参与某中药企业的仓储改造项目时,就亲眼目睹过因仓库湿度失控导致价值30余万元的黄芪全部霉变的情况。
这个基于STM32单片机的中药仓库监控系统,正是为了解决以下行业痛点:
- 环境参数监测盲区:传统温度计、湿度计只能提供局部点位数据,无法全面反映库房环境状态
- 调控响应滞后:人工发现异常时往往已造成损失,特别是对温湿度敏感的贵细药材
- 缺乏数据追溯:GSP认证要求药材存储必须有完整的环境记录,手工记录易出错且难追溯
系统设计指标经过与多位中药师的反复论证,最终确定的关键参数如下:
- 温度监测范围:-10℃~50℃(±0.5℃)
- 湿度监测范围:20%~90%RH(±3%RH)
- CO₂浓度监测:0~5000ppm(±50ppm)
- 报警响应时间:<30秒
- 数据存储周期:≥365天
实际测试中发现,当湿度传感器安装在药材货架侧面(距离货品10cm)时,测得数据比安装在墙面时平均高8%RH。这提醒我们传感器布置需要避开气流死角。
2. 硬件架构设计解析
2.1 核心控制器选型
经过对比测试三款主流单片机,最终选择STM32F103C8T6主要基于以下考量:
| 型号 | 价格(元) | 主频 | Flash | RAM | ADC精度 | 实测温漂 |
|---|---|---|---|---|---|---|
| STM32F103C8T6 | 12.8 | 72MHz | 64KB | 20KB | 12位 | ±0.3℃ |
| GD32F103C8T6 | 10.5 | 108MHz | 64KB | 20KB | 12位 | ±0.7℃ |
| AT32F403ACGU7 | 15.2 | 240MHz | 256KB | 96KB | 12位 | ±0.5℃ |
选择依据:
- 温漂指标:GD32在高温环境下ADC基准电压波动明显
- 生态支持:STM32的HAL库成熟度最高,减少开发风险
- 成本平衡:AT32性能过剩,且外围电路设计要求更高
2.2 传感器组网方案
采用分布式传感网络解决大空间监测难题:
c复制// 传感器节点通信协议示例
typedef struct {
uint8_t head; // 0xAA
uint8_t addr; // 节点地址
float temp; // 温度值
float humidity; // 湿度值
uint16_t co2; // CO2浓度
uint8_t check; // 校验和
} SensorData;
布线技巧:
- 每50㎡布置1个监测节点
- RS-485总线采用手拉手拓扑,终端电阻设为120Ω
- 通信线选用AWG22双绞屏蔽线,与强电线路保持30cm以上距离
2.3 执行机构设计
空调机组控制采用固态继电器+光电隔离方案:

关键参数计算:
- 继电器选型:AC220V/10A(考虑3倍余量)
- 光耦隔离电压:≥5000Vrms
- 缓冲电阻:R=3.3KΩ(限制GPIO电流在5mA内)
3. 软件系统实现细节
3.1 实时数据采集策略
采用DMA+定时器触发实现无阻塞采集:
c复制void ADC_Config(void) {
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;
hadc1.Init.DMAContinuousRequests = ENABLE;
HAL_ADC_Init(&hadc1);
}
采样优化经验:
- 温度信号:10Hz采样+滑动平均滤波
- 湿度信号:1Hz采样+中值滤波
- CO₂传感器:预热后每30秒读取一次
3.2 智能调控算法
采用模糊PID控制实现精准调节:
c复制typedef struct {
float Kp, Ki, Kd; // PID参数
float err[3]; // 误差队列
float output; // 输出量
} FuzzyPID;
void FuzzyPID_Update(FuzzyPID* pid, float setpoint, float pv) {
float err = setpoint - pv;
// 模糊规则表实现...
pid->output = ...;
}
参数整定记录:
- 温度控制:Kp=2.5, Ki=0.05, Kd=1.2
- 湿度控制:Kp=3.0, Ki=0.03, Kd=0.8
3.3 无线通信实现
ESP8266配网关键代码:
c复制void WiFi_Connect() {
uint8_t retry = 0;
while(retry++ < 3) {
HAL_UART_Transmit(&huart1, "AT+CWJAP=\"SSID\",\"PWD\"\r\n", 23, 1000);
if(Wait_Response("OK", 5000)) break;
}
}
避坑指南:
- 添加AT指令超时重试机制
- 每次发送前清空串口缓冲区
- 避免在中断服务程序中处理WiFi数据
4. 系统测试与优化
4.1 环境模拟测试
搭建1:10仓库模型进行极端条件验证:
| 测试场景 | 温度变化率 | 湿度调节时间 | 报警准确率 |
|---|---|---|---|
| 快速升温 | 5℃/min | 8min | 100% |
| 暴雨天气 | - | 15min | 98.7% |
| 空调故障 | 10℃/h | - | 100% |
4.2 现场问题排查
典型故障1:CO₂传感器数据跳变
- 现象:凌晨3点左右出现瞬时峰值
- 排查:检查发现与仓库消毒设备电源共地
- 解决:增加磁环滤波,改用独立电源供电
典型故障2:无线通信中断
- 现象:阴雨天气丢包率升高
- 排查:2.4G频段受微波炉干扰
- 解决:切换至5.8G频段,调整天线位置
5. 工程实施要点
5.1 安装规范
-
传感器安装位置:
- 距地面1.5-1.8m
- 避开空调直吹区域
- 与墙面保持≥20cm距离
-
线路敷设要求:
- 强弱电分离布线
- 室外部分采用防水接线盒
- 预留20%备用接口
5.2 维护建议
建立三级维护机制:
- 日常检查:查看LED状态指示灯
- 月度维护:清洁传感器防护罩
- 年度校准:使用标准源进行标定
这套系统在某中药企业2000㎡仓库实际运行8个月后,药材损耗率从原来的3.2%降至0.7%,仅此一项每年就可挽回经济损失约45万元。对于想要复现该项目的开发者,建议重点关注传感器选型和抗干扰设计这两个最容易出问题的环节。
