FastLED 闪烁 - 使用 millis() 立即改变颜色

FastLED blinking - chaning color using millis() without delay

我试图在不使用延迟的情况下闪烁我的 LED 灯带()

到目前为止我有这样的东西:

#include <FastLED.h>

#define NUM_LEDS 60
#define BRIGHTNESS  32
#define LED_TYPE    WS2811
#define DATA_PIN 6

CRGB leds[NUM_LEDS];
unsigned long actTime = 0;
unsigned long remTime = 0;
const unsigned long period = 1000;


void setup() { 
      FastLED.setMaxPowerInVoltsAndMilliamps(5,1000);
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  actTime = millis();
  if (actTime - remTime >= period){
    remTime = actTime;
    fill_solid(leds, NUM_LEDS, CRGB::Red);
    FastLED.show();
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.show();
  }
}

但它没有像我想要的那样工作。例如,如果我将 fill_solid(leds, NUM_LEDS, CRGB::Black); 更改为 CRGB::Green,我将只能看到绿色,很难看到红色闪烁。 例如,我想让它看起来像这样:1 秒为绿色 -> 1 秒为红色 -> 绿色等

我的循环应该是什么样子?

您的计时代码是正确的,但它每秒都在做错误的事情——将颜色设置为红色,显示它,然后立即将颜色设置为黑色并显示。添加一个额外的状态变量来跟踪当前颜色:

bool is_red = false;

void loop() {
  actTime = millis();
  if (actTime - remTime >= period){
    remTime = actTime;
    if(!is_red) {
        is_red = true;
        fill_solid(leds, NUM_LEDS, CRGB::Red);
        FastLED.show();
    } else {
        is_red = false;
        fill_solid(leds, NUM_LEDS, CRGB::Black);
        FastLED.show();
    }
  }
}

我不是程序员,所以这可能不合适,但应该可以工作,而且更短,不一定对编译器更好,绝对没有那么聪明。有一个更好的方法来执行 even/odd,使用一个表达式来检查第一位是否为“1”。如果不按位思考,这与 &0x00 表达式的工作原理相同并且更容易理解。

unsigned long tymNow = millis();
int num2nds = (tymNow/1000);
if(num2nds % 2 == 0)fill_solid(leds, NUM_LEDS, CRGB::Red);
if(num2nds % 2 > 0)fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();