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

NodeJS实现函数节流:Arduino串口信号5秒触发一次sound函数

解决NodeJS监听Arduino串口按钮重复触发的问题

这问题我太熟了!Arduino的按钮如果没做消抖处理,按下时会因为机械触点的抖动产生一堆电平变化,串口自然就会收到连续的信号。咱们可以在NodeJS代码里加个节流控制,让sound()函数每5秒最多执行一次,不管中间收到多少串口信号。

修改后的代码示例

// 定义变量记录上次执行sound()的时间,初始值设为0确保第一次能触发
let lastSoundTime = 0;

serialport.on("open", function() {
  console.log("Serial Port Opened");
  
  serialport.on("data", function(data) {
    const currentTime = Date.now();
    // 两个判断条件:1. 按钮信号触发(data[0]为真);2. 距离上次执行已过至少5秒
    if (data[0] && (currentTime - lastSoundTime >= 5000)) {
      sound();
      // 更新上次执行时间为当前时间,开启冷却
      lastSoundTime = currentTime;
    }
  });
});

function sound() {
  // 你的播放声音逻辑...
}

代码逻辑解释

  • lastSoundTime:用来追踪上一次调用sound()的时间戳,初始值0保证第一次收到按钮信号时能直接触发函数。
  • 每次收到串口数据时,先获取当前时间,然后检查两个条件:
    1. 确认是按钮触发的有效信号(data[0]为真);
    2. 距离上次执行sound()已经过去了5000毫秒(5秒)。
  • 只有同时满足两个条件时,才会执行sound(),并更新lastSoundTime的时间戳,这样接下来5秒内的所有串口信号都会被过滤掉。

额外建议

如果条件允许,最好在Arduino端也做硬件消抖(加个100nF的电容并联在按钮两端)或者软件消抖(比如用delay()或者判断电平稳定时间),从源头减少重复信号的发送,这样NodeJS这边的处理压力也会更小~

内容的提问来源于stack exchange,提问作者Santiago D'Antuoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:09:08