Blink a Grove — светодиодная палочка RGB
Я пытаюсь мигнуть светодиодной палкой 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();
}
}
}
}
Есть идеи, почему он не мигает?
Спасибо
@dkin, 👍0
Обсуждение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 отражать новое состояние светодиода
}
}
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Светодиод L продолжает гореть
- Улучшенное циклическое переключение цветов RGB.
- Плавное мигание светодиодов
- Остановить мигание светодиодов
- FastLED - Как управлять определенными светодиодами
Ваш код устанавливает цвет светодиодов в зависимости от значения
ledState
, но его значение никогда не обновляется после инициализации, поэтому ваши светодиоды остаются белыми., @StarCatСпасибо. Добавлен светодиодledState = HIGH; и светодиодное состояние = НИЗКИЙ;, @dkin
@dkin, теперь получилось добавить это?, @Dario.Casciato
Да. Любая другая идея/комментарий всегда приветствуется., @dkin
Что ж, если исправление ошибки кодирования, на которое указал @StarCat, решило исходную проблему, то StarCat должен преобразовать комментарий в ответ. В противном случае, после ожидания разумного периода, ОП должен написать ответ., @6v6gt