Blink a Grove — светодиодная палочка RGB

led

Я пытаюсь мигнуть светодиодной палкой Grove — RGB (10 — WS2813 Mini 3535) с помощью этого кода:

#include "FastLED.h"

int ledState = LOW;       //ledState используется для установки светодиода
long previousMillis = 0;  // сохранит время последнего обновления светодиода
long interval = 1000;     // интервал мигания (миллисекунды)

#define NUM_LEDS 10
CRGB myLeds[NUM_LEDS];

void setup() {
  FastLED.addLeds<NEOPIXEL, 4>(myLeds, NUM_LEDS);
}

void loop() {
  unsigned long currentMillis = millis();
  FastLED.setBrightness(25);
  
  if (currentMillis - previousMillis >= interval) {
    // сохраняем последний раз, когда вы мигали светодиодом
    previousMillis = currentMillis;

    // если светодиод не горит, включаем его и наоборот:
    if (ledState == LOW) {
      for (int i = 0; i < NUM_LEDS; i++) {
        myLeds[i] = CRGB::White;
        FastLED.show();
      }
    } else {
      for (int i = 0; i < NUM_LEDS; i++) {
        myLeds[i] = CRGB::Black;
        FastLED.show();
      }
    }
  }
}

Есть идеи, почему он не мигает?

Спасибо

, 👍0

Обсуждение

Ваш код устанавливает цвет светодиодов в зависимости от значения ledState, но его значение никогда не обновляется после инициализации, поэтому ваши светодиоды остаются белыми., @StarCat

Спасибо. Добавлен светодиодledState = HIGH; и светодиодное состояние = НИЗКИЙ;, @dkin

@dkin, теперь получилось добавить это?, @Dario.Casciato

Да. Любая другая идея/комментарий всегда приветствуется., @dkin

Что ж, если исправление ошибки кодирования, на которое указал @StarCat, решило исходную проблему, то StarCat должен преобразовать комментарий в ответ. В противном случае, после ожидания разумного периода, ОП должен написать ответ., @6v6gt


1 ответ


Лучший ответ:

1

В своем коде вы определяете глобальную переменную ledState и инициализируете ее значением «LOW».

В функции loop() переменная ledState используется для определения (следующего) состояния светодиода каждые 1000 миллисекунд, например:

...
// если светодиод не горит, включаем его и наоборот:
if (ledState == LOW) {
  for (int i = 0; i < NUM_LEDS; i++) {
    myLeds[i] = CRGB::White;
    FastLED.show();
  }
} else {
  for (int i = 0; i < NUM_LEDS; i++) {
    myLeds[i] = CRGB::Black;
    FastLED.show();
  }
}
...

Однако, поскольку ваш код не меняет значение ledState, чтобы отразить новое состояние массива светодиодов, в следующий раз приведенное выше сравнение if (...) запускается, результат тот же, цвет светодиодов не меняется.

Самое простое изменение, позволяющее светодиодам мигать так, как вы задумали, — это изменить приведенный выше фрагмент кода на следующий:

...
// если светодиод не горит, включаем его и наоборот:
if (ledState == LOW) {
  for (int i = 0; i < NUM_LEDS; i++) {
    myLeds[i] = CRGB::White;
    FastLED.show();
    ledState = HIGH;
  }
} else {
  for (int i = 0; i < NUM_LEDS; i++) {
    myLeds[i] = CRGB::Black;
    FastLED.show();
  }
  ledState = LOW;
}
...

Альтернативным (возможно, более элегантным) решением было бы объявить ledState как логическую переменную (true/false), чтобы можно было еще больше упростить код:

#include "FastLED.h"

bool ledState = false;    //ledState используется для установки светодиода
long previousMillis = 0;  // сохранит время последнего обновления светодиода
long interval = 1000;     // интервал мигания (миллисекунды)

#define NUM_LEDS 10
CRGB myLeds[NUM_LEDS];

void setup() {
  FastLED.addLeds<NEOPIXEL, 4>(myLeds, NUM_LEDS);
}

void loop() {
  unsigned long currentMillis = millis();
  FastLED.setBrightness(25);
  
  if (currentMillis - previousMillis >= interval) {
    // сохраняем последний раз, когда вы мигали светодиодом
    previousMillis = currentMillis;

    // если светодиод не горит, включаем его и наоборот:
    if (!ledState) {
      for (int i = 0; i < NUM_LEDS; i++) {
        myLeds[i] = CRGB::White;
        FastLED.show();
      }
    } else {
      for (int i = 0; i < NUM_LEDS; i++) {
        myLeds[i] = CRGB::Black;
        FastLED.show();
      }
    }
    ledState = !ledState;    // заставитьledState отражать новое состояние светодиода

  }
}
,