0

我试图在不使用延迟()的情况下闪烁我的 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我只会看到绿色并且很难看到红色闪烁。例如,我想让它看起来像这样:绿色代表 1s -> 红色代表 1s -> 绿色等。

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

4

2 回答 2

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();
    }
  }
}
于 2019-12-16T18:27:24.190 回答
0

我不是程序员,所以这可能不合适,但应该可以工作并且更短,不一定对编译器更好,绝对不那么聪明。有一种更好的方法可以使用在第一位检查“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();
于 2021-06-15T20:12:56.653 回答