1. 项目概述
这个基于STM32的智能仓储监控系统是我去年参与的一个实际项目,当时客户是一家食品仓储企业,他们对仓库环境监控有着严格要求。系统以STM32F103C8T6为主控芯片,搭配DHT11温湿度传感器、MQ-2烟雾传感器和人体红外模块,实现了环境参数的全方位监测。最让我印象深刻的是,在系统调试阶段发现DHT11在高温高湿环境下会出现数据漂移,后来通过软件滤波算法解决了这个问题。
1.1 系统核心功能
系统主要实现三大核心功能:
- 环境参数实时监测:温度测量范围0-50℃,精度±0.5℃;湿度测量范围20-90%RH,精度±5%RH
- 异常情况报警:当温度超过35℃或湿度超过80%时触发声光报警
- 远程监控功能:通过ESP8266 WiFi模块将数据上传至云平台
实际部署中发现,将温湿度传感器安装在离地面1.5米高度,距离墙壁至少30cm的位置,测量结果最接近真实环境值。
2. 硬件设计详解
2.1 主控芯片选型
我们选择STM32F103C8T6主要基于以下考虑:
- 72MHz主频足够处理多路传感器数据
- 内置12位ADC可满足模拟信号采集需求
- 多达37个GPIO方便外设扩展
- 成本仅15元左右,性价比极高
芯片资源分配如下:
- PA0-PA7:传感器数据接口
- PB0-PB1:I2C通信接口
- PC13:报警指示灯控制
- USART1:WiFi模块通信
2.2 传感器电路设计
2.2.1 温湿度传感器接口
DHT11采用单总线协议,电路设计要点:
c复制// 典型接线方式
VCC ---- 3.3V
DATA -- PA1 (需接4.7K上拉电阻)
GND ---- GND
数据采集关键代码:
c复制void DHT11_Start(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
delay_ms(18);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
delay_us(30);
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
2.2.2 烟雾传感器电路
MQ-2需要设计分压电路:
code复制MQ-2 ---- 10KΩ ---- GND
|
ADC_IN
在软件中需要做温度补偿:
c复制float MQ2_GetGasPercentage(float rs_ro_ratio, float temperature)
{
float ppm = 0;
// 温度补偿算法
if(temperature > 30) {
ppm = rs_ro_ratio * 0.8;
} else {
ppm = rs_ro_ratio * 1.2;
}
return ppm;
}
3. 软件系统实现
3.1 系统软件架构
采用前后台系统架构:
- 前台:中断服务程序
- 定时器中断(1s周期)
- USART接收中断
- 后台:主循环任务
- 传感器数据采集
- 报警判断
- 数据上传
任务调度时序:
| 任务 | 周期 | 优先级 |
|---|---|---|
| 温湿度采集 | 2s | 高 |
| 烟雾检测 | 5s | 中 |
| 人体检测 | 1s | 高 |
| 数据上传 | 10s | 低 |
3.2 关键算法实现
3.2.1 滑动平均滤波
针对传感器数据波动问题,采用8点滑动平均:
c复制#define FILTER_N 8
float temp_filter_buf[FILTER_N];
float Moving_Average_Filter(float new_value)
{
static int index = 0;
static float sum = 0;
sum -= temp_filter_buf[index];
temp_filter_buf[index] = new_value;
sum += new_value;
index = (index + 1) % FILTER_N;
return sum / FILTER_N;
}
3.2.2 报警判断逻辑
采用状态机实现多级报警:
c复制typedef enum {
NORMAL,
WARNING,
DANGER
} AlarmState;
AlarmState CheckTemperature(float temp)
{
if(temp > 35.0f) return DANGER;
else if(temp > 30.0f) return WARNING;
else return NORMAL;
}
4. 通信协议设计
4.1 数据上传格式
采用JSON格式上传至云平台:
json复制{
"device_id": "WH001",
"timestamp": 1625097600,
"data": {
"temp": 25.3,
"humi": 65.2,
"smoke": 120,
"human": 0
}
}
4.2 通信异常处理
设计三级重传机制:
- 首次发送失败:等待1s后重试
- 第二次失败:等待5s后重试
- 第三次失败:存入SD卡等待网络恢复
关键实现代码:
c复制void WiFi_SendData(char *data)
{
int retry = 0;
while(retry < 3) {
if(ESP8266_Send(data) == SUCCESS) {
break;
}
delay_ms(1000 * (retry + 1));
retry++;
}
if(retry == 3) {
SD_Write(data);
}
}
5. 系统优化经验
5.1 低功耗设计
通过以下措施降低功耗:
- 传感器轮询间隔优化
- 工作时间:温湿度2s,烟雾5s
- 非工作时间:温湿度30s,烟雾60s
- 采用STM32的Stop模式
- 关闭未使用的外设时钟
实测功耗对比:
| 模式 | 电流 |
|---|---|
| 全速运行 | 45mA |
| 优化后 | 18mA |
| 深度睡眠 | 2.5mA |
5.2 抗干扰措施
在实际部署中遇到的干扰问题及解决方案:
- WiFi信号不稳定
- 改用PCB天线替代陶瓷天线
- 增加信号强度检测,自动切换AP
- 传感器信号受干扰
- 所有信号线加磁珠滤波
- 模拟信号走线避开高频线路
- 电源噪声
- 每路电源增加100μF+0.1μF去耦电容
- 采用LC滤波电路
6. 常见问题排查
6.1 传感器数据异常
可能原因及解决方法:
-
DHT11无响应
- 检查接线是否正确(特别注意上拉电阻)
- 测量供电电压是否稳定(要求3.3V±5%)
- 更换传感器测试
-
MQ-2数值漂移
- 预热时间不足(至少24小时老化)
- 环境中有酒精等干扰气体
- 定期校准基准值
6.2 WiFi连接问题
典型故障处理流程:
-
检查模块供电
- ESP8266需要3.3V/500mA电源
- 测量开机瞬间电流是否达标
-
AT指令测试
- 发送"AT"应返回"OK"
- 发送"AT+GMR"查看固件版本
-
网络配置
- 确认SSID/密码正确
- 检查路由器是否开启MAC过滤
7. 项目扩展建议
根据实际项目经验,系统还可以进一步优化:
- 增加LoRa无线传输作为备用通道
- 采用STM32的硬件CRC校验提升通信可靠性
- 添加本地显示屏实现现场监控
- 集成RFID实现货物追踪
硬件扩展接口预留:
- 预留2个UART接口
- 预留1个SPI接口
- 保留4个GPIO用于功能扩展
在最近一次系统升级中,我们增加了电池供电和太阳能充电功能,使系统可以在断电情况下持续工作72小时以上。这个改进特别受到冷链仓储客户的欢迎。