Arduino FastLED灯带控制代码疑问:LED未立即熄灭原因求解
FastLED 库的核心运行逻辑是双缓冲机制:你代码中操作的
leds数组只是内存中的颜色缓冲区,所有对leds数组的修改都只会停留在内存层面,只有调用FastLED.show()方法时,才会把当前缓冲区的全部数据一次性写入物理灯带,更新实际显示效果。
疑问1解答
你在本次循环中把leds[dot]设为黑色后没有调用show(),所以这个修改不会立刻同步到物理灯带,当前位置的LED仍然会保持之前show()写入的蓝色状态。
这个黑色修改实际生效的时机是下一轮for循环的FastLED.show()执行时:
- 进入下一轮循环后,dot值自增为新的位置,你首先将新位置的LED设为蓝色,此时内存缓冲区里,上一轮的dot位置已经是黑色、新dot位置是蓝色
- 调用
show()后,缓冲区的全部数据刷到灯带,就会出现「上一颗灯熄灭、下一颗灯点亮」的效果,看起来就像光点移动了一格。
疑问2解答
你的预期和实际运行不符的核心原因是搞错了状态更新和delay的时序,实际运行的时序是这样的:
- 执行
leds[dot] = CRGB::Blue:修改内存缓冲区 - 执行
FastLED.show():缓冲区数据刷到灯带,当前位置LED亮蓝色,这个状态会一直保持到下一次show()调用前 - 执行
leds[dot] = CRGB::Black:仅修改内存缓冲区,物理灯带没有任何变化,灯还是蓝色 - 执行
delay(xxx):整个延时期间,没有调用show(),所以物理灯带一直保持蓝色点亮的状态 - delay结束后进入下一轮循环,调用下一次
show(),才会把当前位置的灯刷成黑色,同时点亮下一颗。
如果要实现你预期的「亮蓝→立刻变黑→延时→切下一颗」的效果,只需要在设置黑色之后加一行FastLED.show()即可,修改后的循环代码如下:
void loop() { for(int dot = 0; dot < NUM_LEDS; dot++) { leds[dot] = CRGB::Blue; FastLED.show(); leds[dot] = CRGB::Black; FastLED.show(); // 新增这行,把黑色状态立刻刷到灯带 delay(30); } }
内容的提问来源于stack exchange,提问作者dosebot
相关产品推荐
相关产品推荐

