4. 执行器控制与逻辑判断
在农业自动化系统中,传感器负责“感知”,而执行器负责“动作”。本节要解决的核心问题是:如何把土壤湿度传感器读到的数值,转化为对水泵启停的可靠控制。Node-RED 中承担这一职责的两个关键节点是 switch 与 change:前者做逻辑判断,决定“该不该灌溉”;后者做数据构造,把判断结果翻译成继电器能识别的控制指令。理解这两类节点的分工与配合,是搭建任何闭环灌溉控制流程的基础。
一、控制链路的整体结构
一条典型的灌溉控制链路包含四个环节:湿度数据输入、阈值判断、指令构造、继电器输出。传感器节点(如 MQTT 订阅或 Modbus 读取)周期性输出一个湿度值,通常以 msg.payload 承载,单位为百分比(%)。switch 节点接收该值后,按预设阈值把消息分流到不同输出端口;change 节点再把分流后的消息改写成明确的控制指令,例如把 msg.payload 设为 true 或 false,或写入 msg.command = "pump_on";最后由继电器节点(如 Modbus 写线圈、GPIO 输出或 MQTT 发布)驱动水泵接触器。
二、switch 节点的判断规则设计
switch 节点的本质是一个多路分支器。在节点属性中,需要先指定判断属性(Property),通常保持默认的 msg.payload;再添加一条或多条规则(Rule)。每条规则由比较运算符和比较值组成,例如 < 35、>= 35。节点会按规则顺序逐条匹配,消息从第一个匹配成功的输出端口发出。因此规则顺序直接影响结果,必须把更严格的条件放在前面。
以灌溉场景为例,一个更贴近实际的配置是三条规则:< 30 输出到端口 1(启动灌溉),>= 30 且 <= 40 输出到端口 2(保持现状),> 40 输出到端口 3(停止灌溉)。这种“双阈值 + 中间保持区”的结构就是回差控制,它能避免湿度在 35% 附近抖动时水泵频繁启停。若只用一个阈值,传感器噪声或蒸发波动就可能让继电器每秒动作多次,显著缩短接触器寿命。
还需注意数据类型。若传感器上报的是字符串(如 "32"),而规则按数字比较,Node-RED 可能给出意外结果。稳妥做法是在 switch 之前用 change 或 function 节点把 msg.payload 转为数字,或在 switch 规则中显式选择“数字”类型。此外,应设置“否则”(otherwise)输出端口,用于捕获异常值(如 null、-1 表示传感器故障),将其导向报警分支而非直接驱动水泵。
三、change 节点构造控制指令
switch 只负责分流,它输出的消息仍带着原始湿度值。继电器节点通常期望一个明确的布尔量或特定字符串,因此需要 change 节点做“翻译”。在 change 节点中可设置多条规则:将 msg.payload 设为布尔 true,同时新增 msg.command 设为 "pump_on",还可写入 msg.reason 记录触发原因。这样下游无论接 Modbus 写线圈、MQTT 发布还是 HTTP 请求,都能取到所需字段。
// change 节点“设置”规则示例(开泵分支)
规则1: 设置 msg.payload → 布尔 true
规则2: 设置 msg.command → 字符串 "pump_on"
规则3: 设置 msg.source → 字符串 "soil_moisture_auto"
// 停泵分支
规则1: 设置 msg.payload → 布尔 false
规则2: 设置 msg.command → 字符串 "pump_off"
如果继电器通过 Modbus 控制,常见做法是把线圈地址与写入值组织成对象,例如 msg.payload = { address: 1, value: true },再由 Modbus Write 节点消费。若通过 MQTT 控制,则可把主题固定为 farm/pump/cmd,载荷设为 ON 或 OFF。change 节点的价值在于把“业务判断”和“设备协议”解耦:判断逻辑不变,换一种执行器只需改 change 的构造规则。
四、联调与结果判断
搭建完成后,应先用 inject 节点手动注入测试值验证逻辑,而不是直接接真实传感器。依次注入 25、35、45 三个值,观察 debug 面板:25 应触发开泵分支并输出 payload: true;35 落在保持区,不应产生动作;45 应触发停泵分支。确认分支正确后,再接入真实传感器并观察继电器指示灯与水泵接触器动作是否一致。
实际运行中还要关注两个现象:一是水泵启动后湿度上升存在滞后(土壤吸水需要时间),若判断周期过短,可能在湿度尚未回升时重复下发开泵指令,此时可在开泵分支后加 delay 节点做最小运行时间保护;二是传感器断线时读数可能变为 0 或异常值,若不加甄别会被误判为“极度干旱”而持续灌溉,因此务必在 switch 前增加有效性校验,把超范围值导向报警而非执行分支。只有把判断、指令构造与异常处理三者结合,灌溉控制才算真正可靠。