ws2812b 模块的缓冲区是如何工作的?

这是从 ws2812 文档 中摘取的一个例子:

ws2812.init()
local i, buffer = 0, ws2812.newBuffer(300, 4); buffer:fill(0, 0, 0, 0); tmr.create():alarm(50, 1, function()
  i = i + 1
  buffer:fade(2)
  buffer:set(i % buffer:size() + 1, 0, 0, 0, 255)
  ws2812.write(buffer)
end)

首先,我尝试将其翻译为更易读的内容,由于我使用的是 RGB 而不是 RGBW LED,我还去除了 W 组件:

local numberOfLeds = 300
local bytesPerLed = 3 -- (R、G 和 B)

ws2812.init()

local i
local buffer = 0

ws2812.newBuffer(numberOfLeds, bytesPerLed)
buffer:fill(255, 255, 255)

tmr.create():alarm(50, 1, function() -- 每 50 毫秒重复一次
    i = i + 1
    buffer:fade(2)
    buffer:set(i % buffer:size() + 1, 255, 255, 255)
    ws2812.write(buffer)
end)

但我真的不理解,为什么 buffer 有一个 fill 方法?我的意思是,我们不是把它简单地设置为 0 吗? buffer = 0 我翻译有误吗?

原始代码说 local i, buffer = 0, ws2812.newBuffer(...); ...

点赞
用户107090
用户107090

原始代码等效于

local i = 0
local buffer = ws2812.newBuffer(300, 4); buffer:fill(0, 0, 0, 0); tmr.create():alarm(50, 1, function()

一般而言,

local x,y,z = a,b,c

等效于

local x = a
local y = b
local z = c

请参阅手册

2017-04-07 13:15:57