1. 项目背景与核心需求
在现代农业生产中,温室大棚作为重要的设施农业形式,其内部环境的精确控制直接影响作物生长品质和产量。传统人工调控方式存在响应滞后、精度不足等问题,而基于单片机控制的自动化系统正逐步成为主流解决方案。
这个项目要解决的核心痛点很明确:如何用最低的成本实现大棚温湿度的精准自动控制。我去年在山东某蔬菜基地实测发现,人工调控的大棚内昼夜温差经常超过5℃,而多数叶菜类作物最适生长温差应控制在3℃以内。湿度波动更是能达到±15%,这对育苗期的作物简直是灾难。
2. 系统整体设计框架
2.1 硬件架构选型
经过对比测试,最终确定的硬件方案如下:
- 主控芯片:STM32F103C8T6(性价比之王,72MHz主频足够处理传感器数据)
- 温湿度传感器:DHT22(±0.5℃精度,±2%RH精度,实测比DHT11稳定得多)
- 执行机构:
- 加热:固态继电器控制电热丝
- 降温:12V直流风扇+电磁阀控制喷雾系统
- 除湿:同样使用风扇加强通风
- 显示模块:0.96寸OLED(比LCD更省电,阳光下可视性好)
关键经验:一定要给DHT22加装防辐射罩,我在夏季实测发现阳光直射会导致传感器读数比实际高3-5℃。
2.2 软件控制逻辑
采用分层PID控制算法,具体实现逻辑:
c复制// 伪代码示例
void control_loop() {
float temp_error = target_temp - current_temp;
float humi_error = target_humi - current_humi;
// 温度PID计算
temp_pid = kp_temp * temp_error + ki_temp * integral(temp_error) + kd_temp * derivative(temp_error);
// 湿度PID计算
humi_pid = kp_humi * humi_error + ki_humi * integral(humi_error) + kd_humi * derivative(humi_error);
// 执行器控制
if(temp_pid > 0) {
heating_pwm = map(temp_pid, 0, 100, 0, 255);
set_fan_speed(0);
} else {
cooling_fan_speed = map(abs(temp_pid), 0, 100, 0, 255);
set_fan_speed(cooling_fan_speed);
}
// 湿度控制优先级低于温度
if(humi_pid > 0 && temp_pid < 50) {
spray_interval = map(humi_pid, 0, 100, 0, 60);
}
}
3. 关键实现细节
3.1 传感器校准与滤波
DHT22虽然标称精度高,但实际使用必须做现场校准。我的校准方法:
- 准备标准干湿球温度计作为基准
- 在大棚内选取5个典型位置点
- 记录传感器读数与基准值的差值
- 在代码中加入补偿系数:
c复制// 温度补偿公式
real_temp = raw_temp * 0.98 + 0.5;
// 湿度补偿公式
real_humi = raw_humi * 1.02 - 1.8;
针对传感器噪声,采用移动平均滤波+中值滤波的组合算法:
c复制#define FILTER_SIZE 5
float temp_filter[FILTER_SIZE];
float get_filtered_temp() {
// 采集新数据
float new_temp = DHT22.readTemperature();
// 更新滤波数组
for(int i=FILTER_SIZE-1; i>0; i--){
temp_filter[i] = temp_filter[i-1];
}
temp_filter[0] = new_temp;
// 中值滤波
sort_array(temp_filter);
return temp_filter[FILTER_SIZE/2];
}
3.2 执行机构驱动设计
加热控制电路特别注意:
- 使用光耦隔离(PC817)保护单片机
- 固态继电器(SSR-40DA)要加散热片
- 电热丝功率建议≤800W/m²大棚面积
喷雾系统防堵设计:
- 每周自动执行冲洗程序
- 喷头选用防滴漏型号
- 水路安装Y型过滤器
4. 系统部署与调试
4.1 现场安装要点
传感器布置的黄金法则:
- 离作物冠层高度保持一致(建议距植株顶部20cm)
- 避开直射阳光和通风死角
- 每100㎡至少布置2个监测点
- 传感器线缆要走桥架,防止被农具刮断
4.2 PID参数整定
通过Ziegler-Nichols方法现场调试:
- 先将Ki、Kd设为0,逐步增大Kp直到系统开始振荡
- 记录临界增益Ku和振荡周期Tu
- 根据下表设置参数:
| 控制类型 | Kp | Ki | Kd |
|---|---|---|---|
| P | 0.5Ku | 0 | 0 |
| PI | 0.45Ku | 0.54Ku/Tu | 0 |
| PID | 0.6Ku | 1.2Ku/Tu | 0.075Ku*Tu |
实测经验:大棚系统的积分时间要设长些,我一般用Tu的1.5-2倍,避免过度调节。
5. 常见问题解决方案
5.1 传感器读数异常
典型故障现象及排查:
- 读数固定为-999:
- 检查接线(DHT22的DATA引脚要接上拉电阻)
- 测量供电电压(不得低于3V)
- 数据偶尔跳变:
- 增加软件滤波强度
- 检查电源稳定性(建议加100μF电容)
5.2 执行机构误动作
电磁阀常见问题处理:
- 阀体发热:线圈电压可能过高(测量实际供电)
- 无法关闭:检查是否水垢卡滞(拆洗阀芯)
- 漏气:更换密封圈(建议备件型号:NBR-8×1.5)
6. 系统优化方向
6.1 节能改进方案
- 分时分区控制:
- 将大棚划分为多个温区
- 根据作物生长阶段设置不同参数
- 太阳能辅助供电:
- 加装100W光伏板
- 使用TP5100充电管理模块
- 余热回收利用:
- 在加热系统加装热交换器
- 储存白天多余热量用于夜间供暖
6.2 智能功能扩展
- 手机远程监控:
- 通过ESP8266接入云平台
- 开发微信小程序控制界面
- 生长模型预测:
- 采集历史环境数据
- 训练LSTM神经网络预测最佳参数
- 病害预警系统:
- 结合温湿度变化趋势
- 当出现持续高湿时触发警报
在大棚实际部署时,建议先用模拟负载测试所有执行机构,我在初期就遇到过继电器触点粘连导致持续加热的事故。现在我的标准操作流程是:上电前万用表测通断,程序里加互锁逻辑,关键节点设置硬件看门狗。