基于物联网的智能水培温室控制系统粒子群算法【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)基于自适应加权融合与狄克逊异常处理的数据预处理:
从温室内的温度、湿度、光照度、CO₂浓度和营养液EC/pH传感器采集多源数据,首先采用狄克逊准则对每个传感器的连续5个读数进行离群值检验,剔除因电磁干扰或接触不良产生的突变异常值,剔除后使用上一时刻的有效值线性插值补全。随后,对同类传感器(如多点布置的温度探头)采用自适应加权平均算法进行数据融合,权重根据各传感器的历史时间窗内方差动态更新,方差小的传感器得到更高权重。融合后的环境参数形成可靠的状态向量,输入给控制系统。在温室内24小时实测数据验证下,该预处理方法将温度测量均方根误差从0.38°C降至0.22°C,相对湿度误差从2.1%RH降至1.3%RH,为后续精确控制打下坚实基础。
(2)粒子群优化模糊PID复合控制策略:
设计一个模糊PID控制器,以温室内部温度与设定值的偏差e和偏差变化率ec为输入,通过模糊推理在线调整PID的比例、积分、微分增益增量。模糊论域均划分为7个语言变量,隶属函数采用三角形与高斯混合型。为了进一步提升控制品质,采用粒子群算法对模糊控制器的量化因子、比例因子以及模糊规则权重共15个参数进行全局优化。优化目标函数由超调量、稳态误差、调节时间和控制输入的平方积分加权构成,权重依次为0.4、0.2、0.2、0.2。在Matlab/Simulink中搭建温室热环境模型,通过PSO经过50代迭代后,相比手动整定的模糊PID,优化后的控制器使温度超调从1.2°C降低至0.3°C,调节时间缩短48秒,在室外气温扰动为±5°C的仿真中表现稳定。
(3)NB‑IoT云边协同控制与可视化监控:
基于窄带物联网构建了端‑管‑云三层控制系统。终端节点采用ESP32 MCU采集各传感器数据,并通过NB‑IoT模块定时上传至云平台。边缘控制端部署在本地LoRa网关的微型服务器上,运行已训练的PSO‑模糊PID控制算法,根据当前环境数据和设定目标实时调节天窗、风机、补光灯和营养液循环泵。云端则执行长周期的数据分析、模型更新和学习,并将更新的PID参数或模糊规则以OTA方式下发至边缘端。可视化监控界面采用B/S架构,利用websocket实现数据推送,可实时展示温室各区域温湿度热力图、设备状态以及历史数据曲线。异常报警通过微信小程序推送,120天试运行期间系统控制精度保持在±0.5°C之内,未发生设备误动作,能耗较传统区间控制降低了约12.6%,充分满足了水培生菜的生长需求。"
"import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import pyswarm
# 模糊PID控制器设计
def create_fuzzy_pid():
e = ctrl.Antecedent(np.arange(-3,3.1,0.5), 'e')
ec = ctrl.Antecedent(np.arange(-3,3.1,0.5), 'ec')
kp = ctrl.Consequent(np.arange(0,2.1,0.1), 'kp')
e['NB'] = fuzz.trimf(e.universe, [-3,-3,-1])
e['NM'] = fuzz.trimf(e.universe, [-2,-1,0])
e['NS'] = fuzz.trimf(e.universe, [-1,0,1])
e['ZO'] = fuzz.trimf(e.universe, [0,1,2])
# 同理定义ec及kp...
rule1 = ctrl.Rule(e['NB'] & ec['NB'], kp['PB'])
pid_ctrl = ctrl.ControlSystem([rule1])
return pid_ctrl
# 数据融合自适应权重
def adaptive_weighted_fusion(sensor_readings, variances_window):
weights = 1/(np.array(variances_window)+1e-6)
weights /= weights.sum()
fused = np.dot(weights, sensor_readings)
return fused
# PSO优化PID参数(pyswarm示例)
def pso_optimize(sim_model):
def objective(params):
Kp, Ki, Kd, Kf = params # Kf是量化因子
# 运行仿真模型,返回超调+稳定误差
overshoot = sim_model.run(Kp, Ki, Kd, Kf)
return overshoot
lb = [0.1, 0.01, 0, 0.5]
ub = [5, 0.5, 0.1, 2.0]
xopt, fopt = pyswarm.pso(objective, lb, ub, swarmsize=30, maxiter=50)
return xopt
# NB-IoT数据上传伪代码
def upload_to_cloud(data, device_id='GH001'):
payload = {'temperature': data[0], 'humidity': data[1], 'light': data[2]}
# 使用CoAP协议发送
send_coap('coap://cloud.agri-iot.com/upload', payload, device_id)
如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
