Arduino 快速闪烁-毫不延迟地使用millis()更改颜色

Arduino 快速闪烁-毫不延迟地使用millis()更改颜色,arduino,led,arduino-c++,fastled,Arduino,Led,Arduino C++,Fastled,我试图在不使用延迟的情况下闪烁我的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 l

我试图在不使用延迟的情况下闪烁我的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();
  }
}
#包括
#定义数量为60
#定义亮度32
#定义LED_类型WS2811
#定义数据_引脚6
CRGB发光二极管[NUM_发光二极管];
无符号长actTime=0;
无符号长remTime=0;
常量无符号长周期=1000;
无效设置(){
快速。设置最大功率输入和毫安(51000);
快速发光。添加发光二极管(发光二极管,数量发光二极管);
快速。正确性(亮度);
}
void循环(){
actTime=millis();
如果(actTime-remTime>=时段){
remTime=actTime;
实心填充(LED、数字LED、CRGB::红色);
fasted.show();
实心填充(LED、数字LED、CRGB::黑色);
fasted.show();
}
}
但它没有像我希望的那样工作。例如,如果我更改
fill_solid(LED、NUM_LED、CRGB::Black)
CRGB::绿色
我只看到绿色,很难看到红色闪烁。 我想让它看起来像这样,例如:绿色代表1s->红色代表1s->绿色等等


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

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

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();
    }
  }
}

我不是一个程序员,所以这可能是不合适的,但应该可以工作,而且要短得多,不一定对编译器更好,肯定没有那么聪明。有一种更好的方法可以使用检查第一位中的“1”的表达式执行偶数/奇数运算。如果不考虑位的话,这与&0x00表达式的工作原理相同,并且比&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();