Arduino FastLED分段点亮LED并实现最后一段均匀闪烁问题
问题分析
你的代码核心问题在于loop()函数会反复执行完整流程:红色LED熄灭后,程序会回到loop开头,重新执行绿色LED点亮、橙色LED点亮的步骤,导致红色LED要等待4000ms(绿色延迟)+4000ms(橙色延迟)才会再次点亮,无法实现400ms间隔的均匀闪烁。
另外代码还有几个可优化的细节:
FastLED.setBrightness()是全局亮度控制,不需要在逐个LED的循环里重复设置,统一设置一次即可- 逐个设置LED后立刻调用
show()会产生LED逐个点亮的效果,若需要一次性点亮一组LED,应先完成所有目标LED的颜色设置,再统一调用一次show()
修改后的代码
#include <FastLED.h> #define LED_PIN 2 #define NUM_LEDS 15 CRGB leds[NUM_LEDS]; // 标记初始的绿色、橙色LED流程是否已执行完毕 bool initialSequenceDone = false; void setup() { FastLED.addLeds<WS2812, LED_PIN, GBR>(leds, NUM_LEDS); FastLED.setMaxPowerInVoltsAndMilliamps(5, 500); FastLED.clear(); FastLED.show(); } void loop() { if (!initialSequenceDone) { // 点亮前4个绿色LED FastLED.setBrightness(90); for (int i=0; i<4; i++){ leds[i] = CRGB(0, 255, 0); } FastLED.show(); delay(4000); // 点亮接下来4个橙色LED(适配GBR格式的橙色值,若你需要原颜色可改回(0,128,255)) for (int i=4; i<8; i++){ leds[i] = CRGB(165, 255, 0); } FastLED.show(); delay(4000); // 标记初始流程完成,后续不再重复执行 initialSequenceDone = true; } // 循环闪烁最后4个红色LED // 点亮红色LED for (int i=8; i<12; i++){ leds[i] = CRGB(0, 0, 255); } FastLED.show(); delay(400); // 熄灭红色LED for (int i=8; i<12; i++){ leds[i] = CRGB::Black; } FastLED.show(); delay(400); }
关键修改说明
- 添加
initialSequenceDone标志位:确保绿色、橙色LED的点亮流程仅执行一次,不会在每次loop循环时重复触发 - 优化LED刷新逻辑:每组LED先完成所有颜色设置,再统一调用
FastLED.show(),避免逐个点亮的闪烁感 - 修正橙色颜色值:原代码的
CRGB(0,128,255)对应GBR格式是蓝紫色,替换为适配GBR的橙色值(165,255,0),可根据需求改回原颜色 - 统一全局亮度:将
FastLED.setBrightness()移到每组LED设置前,统一控制亮度,避免反复修改全局参数
内容的提问来源于stack exchange,提问作者Richard Lucht
相关产品推荐
相关产品推荐

