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();
我试图在不使用延迟的情况下闪烁我的 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();