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

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);
}
关键修改说明
  1. 添加initialSequenceDone标志位:确保绿色、橙色LED的点亮流程仅执行一次,不会在每次loop循环时重复触发
  2. 优化LED刷新逻辑:每组LED先完成所有颜色设置,再统一调用FastLED.show(),避免逐个点亮的闪烁感
  3. 修正橙色颜色值:原代码的CRGB(0,128,255)对应GBR格式是蓝紫色,替换为适配GBR的橙色值(165,255,0),可根据需求改回原颜色
  4. 统一全局亮度:将FastLED.setBrightness()移到每组LED设置前,统一控制亮度,避免反复修改全局参数

内容的提问来源于stack exchange,提问作者Richard Lucht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:00:19