You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node-RED部署/重启后继电器持续开启的问题求助

问题分析与解决方案

一、为啥重启/部署后继电器全开启?

咱们先拆解几个关键细节,就能明白原因:

  1. 你的继电器逻辑是对的:Sansmart这类16路继电器板大多是低电平触发——Arduino引脚输出LOW(对应你设置的false payload)时继电器吸合开启,输出HIGH(true payload)时断开关闭。你把dashboard开关的On设为false、Off设为true,这个逻辑完全没问题。
  2. 问题出在初始化阶段:
    • 当Node-RED重启或部署时,arduino out节点会把对应的Arduino引脚设置为OUTPUT模式,但不会自动发送任何payload值。
    • 而Arduino的引脚在刚设置为OUTPUT时,默认输出电平是LOW(结合你的现象可以确定是这个情况),这就直接触发了继电器开启。
    • 另外你的ui_switch节点没配置“发送初始值”,启动时不会主动发送true(关闭继电器的指令),所以引脚一直保持默认的LOW状态,继电器就全亮了。

二、怎么让启动时继电器保持关闭?

这里有两个简单的解决办法,选哪个都可以:

办法1:给开关节点加初始发送值

直接在Node-RED里修改每个ui_switch的配置:

  • 双击打开开关节点的设置面板
  • 找到Send initial value选项(一般在高级设置里),把它勾选上
  • 确保你编辑开关时,它的默认状态是“Off”(因为Off对应的payload是true,也就是关闭继电器的指令)
    这样每次Node-RED启动或部署,开关都会自动给对应的arduino out节点发true,引脚输出HIGH,继电器就保持关闭了。

办法2:给Arduino烧录初始化代码

如果不想动Node-RED的配置,直接给Arduino写一段启动初始化代码,让引脚默认输出HIGH:

void setup() {
  // 把你用到的引脚都列出来,比如你现在用的2、3、4、5、6
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  
  // 启动时直接把引脚设为高电平,关闭继电器
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
}

void loop() {
  // 留空就行,Node-RED会通过串口控制引脚
}

烧录完这段代码,Arduino一上电就会自动把这些引脚拉到高电平,哪怕Node-RED还没连接,继电器也是关闭的。

三、怎么实现启动时的继电器开关循环?

如果你需要启动时让所有继电器先开一次再关上,可以用inject+delay节点组合实现,或者用function节点一次性搞定:

简单版:用inject和delay节点

  1. 加一个inject节点,设置Payload为false,勾选Inject once at start(启动时触发),然后把这个节点连接到所有arduino out节点——这一步是启动时打开所有继电器。
  2. 再加一个delay节点,设置延迟时间(比如1000毫秒,也就是1秒),把刚才的inject节点连接到这个delay节点。
  3. 再加一个inject节点,设置Payload为true,把delay节点连接到这个inject,然后把这个inject也连接到所有arduino out节点——延迟1秒后发送关闭指令。

进阶版:用function节点统一控制

如果继电器多,不想拉一堆线,可以用一个function节点来处理:

  1. 加一个inject节点,类型选timestamp,勾选Inject once at start,连接到function节点。
  2. 把function节点的代码改成下面这样:
// 先发送开启所有继电器的指令
var openCmds = [
    {payload: false, topic: "relay2"},
    {payload: false, topic: "relay3"},
    {payload: false, topic: "relay4"},
    {payload: false, topic: "relay5"},
    {payload: false, topic: "relay6"}
];
node.send(openCmds);

// 延迟1秒后发送关闭指令
setTimeout(() => {
    var closeCmds = [
        {payload: true, topic: "relay2"},
        {payload: true, topic: "relay3"},
        {payload: true, topic: "relay4"},
        {payload: true, topic: "relay5"},
        {payload: true, topic: "relay6"}
    ];
    node.send(closeCmds);
}, 1000);

return null;
  1. 给每个arduino out节点设置对应的topic(比如引脚2的节点topic设为relay2),这样就能接收function节点的指令了。

内容的提问来源于stack exchange,提问作者Don Beasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:30:53