如何加快将数据映射到 LED 以进行反应性照明?

问题描述 投票:0回答:0

我正在编写一个 JavaScript 程序,以根据音频数据将颜色流式传输到 Arduino/LED 灯条。具体来说,我正在创建一个 60 条的频率振幅音频频谱,其中每个条映射到我的条带中的一个 LED。我使用每个条的高度来确定 LED 的亮度。为此,我使用了一个混合了 johnny-5、node-pixel 和 p5 的库,名为 p5j5。我的理由是,这似乎是从音频中收集实时 FFT 数据的最简单方法。我用 60 盏灯每秒更新灯 30 次,因此每秒有 1800 个事件发送到我的 Arduino (Arduino Uno)。我无法通过批处理 LED 颜色变化事件来减少这种情况,因为节点像素似乎不支持这一点。传输速率太慢或处理器太慢,但在任何一种情况下都有严重的滞后。如果我只更新 15 个 LED,延迟将不再存在。

下面的代码包含了发送事件的所有逻辑。 'colorMap' 随歌曲更新,但它由我计算机的 CPU 处理并且在我创建音频频谱图时运行良好,所以我怀疑这是一个瓶颈。

function setup() { 
  p5.j5.events.on('boardReady', () => {
    console.log('setting up', p5.j5.board);
    strip = new p5.j5.nodePixel.Strip({
        board: p5.j5.board,
        controller: "FIRMATA",
        strips: [ {pin: 6, length: numLeds}, ], // this is preferred form for definition
        gamma: 0.9, // set to a gamma that works nicely for WS2812,
    });

    strip.on("ready", function() {
      strip.color('#00ff00');
      strip.show();
      dynamicSet(30);
    });
  });

  cnv = createCanvas(100, 100);
  cnv.mouseClicked(() => {
    toggleSong();
  })
  fft = new p5.FFT(fftSmoothing, fftBands);
}

function dynamicSet( delay ){
  var foo = setInterval(async function(){
      for(var i = 0; i < numLeds; i++) {
          await strip.pixel(i).color(colorMap.get(i));
      }
      await strip.show();
  }, 1000/delay);
}

我想知道有哪些更好的方法。是否有替代库/API 可以轻松地实时流式传输音频的 FFT,也许使用更高效的语言?我假设这最好是在 C++ 中,所以我可以使用这些库来发送事件数据,这可能比它们的 JS 对应物更有效。

javascript arduino fft led
© www.soinside.com 2019 - 2024. All rights reserved.