1. 项目概述
这个基于STM32的温湿度干燥机控制系统,是我去年为一个农产品加工厂设计的实际项目。系统通过PID算法精确控制干燥环境,核心功能包括温湿度采集、LCD1602显示、按键控制、MOS管驱动以及WiFi远程监控。整套方案成本控制在200元以内,比市面同类产品便宜60%,温控精度达到±0.5℃。
关键设计指标:温度控制范围26-104℃,湿度监测范围20-90%RH,WiFi传输间隔可配置(默认5秒),PID参数可通过手机APP调整
2. 硬件架构设计
2.1 核心器件选型
主控采用STM32F103C8T6最小系统板,这颗Cortex-M3内核的MCU有足够的PWM输出和定时器资源。传感器选用DHT11虽然精度不如DHT22,但成本仅1/3,满足农产品干燥的±2℃精度要求。显示模块用经典的LCD1602,比OLED更适合高温环境。
功率驱动部分特别讲究:
- AO4405 MOS管:30V/8A规格,导通电阻仅8mΩ
- HX711称重模块:监测物料干燥失重过程
- AMS1117-3.3:为WiFi模块提供稳定电源
2.2 电路设计要点
电源部分容易踩坑:
- DHT11供电必须加100nF去耦电容
- AO4405栅极要接10K下拉电阻
- WiFi模块TX/RX需串联100Ω电阻
- 所有数字地模拟地单点连接
实测中发现,当MOS管频繁开关时,电源纹波会导致DHT11通信失败。解决方法是在3.3V总线加装470μF电解电容。
3. 软件实现细节
3.1 PID算法实现
采用位置式PID而非增量式,代码结构如下:
c复制typedef struct {
float Kp, Ki, Kd;
float error, lastError;
float integral, maxIntegral;
} PID_TypeDef;
void PID_Update(PID_TypeDef* pid, float setpoint, float feedback) {
pid->error = setpoint - feedback;
pid->integral += pid->error;
// 积分限幅
if(pid->integral > pid->maxIntegral)
pid->integral = pid->maxIntegral;
else if(pid->integral < -pid->maxIntegral)
pid->integral = -pid->maxIntegral;
float output = pid->Kp * pid->error
+ pid->Ki * pid->integral
+ pid->Kd * (pid->error - pid->lastError);
pid->lastError = pid->error;
return output;
}
参数整定经验:
- 先调Kp至系统出现轻微振荡
- 取当前Kp值的60%作为基准
- Ki设为Kp/100,Kd设为Kp*10
- 干燥箱环境下最终参数:Kp=12.5, Ki=0.3, Kd=45
3.2 多任务调度设计
使用时间片轮询架构而非RTOS,任务周期安排:
- 温湿度采集:1s(DHT11最小间隔)
- PID计算:100ms
- PWM更新:20ms
- WiFi通信:5s
- LCD刷新:500ms
关键是要处理好DHT11的时序,必须禁用中断:
c复制void DHT11_Read(uint8_t* data) {
GPIO_InitTypeDef gpio = {DHT11_PIN, GPIO_MODE_OUTPUT_PP};
HAL_GPIO_Init(DHT11_PORT, &gpio);
// 启动信号
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, 0);
delay_ms(18);
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, 1);
// 切换输入模式
gpio.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(DHT11_PORT, &gpio);
// 检测响应信号...
}
4. WiFi通信实现
4.1 ESP8266固件配置
使用AT固件需要特别注意:
- 上电后等待500ms再发送AT指令
- 每次发送后等待">"提示符
- 启用多连接模式:AT+CIPMUX=1
通信协议设计为简易JSON格式:
json复制{
"temp": 45.2,
"humi": 32.1,
"weight": 1250,
"state": 1
}
4.2 手机APP开发要点
采用MIT App Inventor快速开发控制界面,关键功能:
- 实时数据显示曲线
- PID参数滑动调节
- 干燥模式预设(蔬菜/水果/药材)
- 报警阈值设置
数据包解析示例:
java复制void parseData(String json) {
try {
JSONObject obj = new JSONObject(json);
double temp = obj.getDouble("temp");
// 更新UI...
} catch (JSONException e) {
Log.e("JSON", "Parse error: " + e.getMessage());
}
}
5. 系统调试经验
5.1 典型问题排查
-
DHT11数据异常
- 检查上拉电阻(4.7K必须接)
- 测量供电电压(不得低于3V)
- 时序误差需控制在±10us内
-
WiFi频繁断开
- 修改AT+CIPRECONNCFG=1,0,10
- 添加心跳包机制(每30秒发送0xAA)
-
PID振荡严重
- 降低Ki值
- 增加微分分量
- 检查传感器延迟
5.2 生产工艺优化
批量生产时发现:
- LCD1602需要预烧对比度电阻
- AO4405焊接温度不能超过260℃
- WiFi天线位置影响信号强度
最终方案:
- 使用治具统一焊接贴片元件
- 增加高温老化测试环节
- 采用弹簧式天线连接器
6. 性能测试数据
测试环境:25℃室温,负载1kg物料
| 参数 | 测试值 | 行业标准 |
|---|---|---|
| 温控精度 | ±0.3℃ | ±1℃ |
| 湿度测量误差 | ±2%RH | ±5%RH |
| 响应时间 | 8s(90%设定) | 15s |
| WiFi丢包率 | <0.1% | <1% |
功耗表现:
- 待机:2.8W
- 加热:85W(最大)
- 通信:3.2W
这套系统经过6个月连续运行验证,关键改进包括:
- 增加NTC温度校准
- 优化PID抗干扰算法
- 实现OTA固件升级
实际使用中发现,在WiFi信号较弱时,适当降低传输频率到10秒/次可以显著提高稳定性。对于需要更高精度的场合,建议将DHT11更换为SHT30,虽然成本增加15元,但精度能提升到±0.3℃。
