Как погасить светодиод за определенное время с помощью FastLED

Я использую библиотеку FastLED, Arduino Nano и 5 адресных светодиодов (WS2812B). Я хотел бы создать последовательность на прикрепленном изображении. (все в белом цвете, например)

Я знаю, как включать каждый светодиод каждые 0,2 секунды, и я знаю, как исчезать. Я не знаю, как убедиться, что каждый светодиод переходит от 0% яркости к 100% за 0,4 секунды + начинает исчезать в следующем светодиоде через 0,2 секунды.

Вот гаснущий светодиод:

void loop() {
  uint32_t cur_ms = millis();
    if (cur_ms - fade_ms > 200) {
        fade_ms = cur_ms;
        brightness += 5;
        leds[0] = CHSV(255, 0, brightness);
    }

FastLED.show();
// delay(10);

}

Кто-нибудь может помочь мне разобраться в этом?

, 👍1

Обсуждение

Привет, добро пожаловать в ASE. Просто Идея. Вы можете использовать оставшийся millis () и текущее значение яркости для вычисления следующего необходимого скачка или уменьшения яркости, @ArduinoFan

Я был бы признателен, если бы вы могли предоставить фрагмент, @yuvix_man

можете ли вы поделиться полным фрагментом кода того, над чем вы работали? Кроме того, приведенный ниже ответ действительно очень хорош. Возможно, сейчас вы торопитесь, но добавьте его в закладки и возвращайтесь, когда у вас будет время., @ArduinoFan


1 ответ


1

Одна из библиотек SimpleTimer, таких как эта, написанная Марчелло Романи (которую я упоминаю, потому что использовал ее; есть и другие). Он создает объект таймеров, содержащий 10 (в данном случае) программных таймеров с различными режимами работы (запуск один раз, запуск x раз, запуск навсегда, например).

Основная идея (для примера с 1 светодиодом) заключается в том, что вы пишете функцию (известную как "обратный вызов") для увеличения яркости светодиода на один шаг. Давайте назовем это StepUp().

Вы пишете другую функцию обратного вызова, чтобы выключить индикатор и запустить таймер, который будет вызывать StepUp() с любым интервалом, который вы выберете, столько раз, сколько потребуется для достижения 100%. Давайте назовем это циклическим().

В вашей настройке ()вы запустите другой таймер, который будет вызывать Cycled() так часто, как вы хотите, чтобы этот процесс выполнялся - в данном случае каждые 1200 мс - и столько раз (или навсегда), сколько вы выберете.

В вашей функции loop() вам потребуется как можно чаще вызывать функцию .run() вашего объекта таймера - это то, что заставляет таймеры работать, и именно таймеры будут вызывать ваши функции обратного вызова, чтобы ваши светодиоды вели себя так, как вы хотите.

До сих пор у нас был один исчезающий светодиод, и я бы рекомендовал вам сначала реализовать это.

Отсюда есть два пути. Вы можете написать вышеуказанную пару обратных вызовов для каждого светодиода, но они будут почти идентичны, и зачем писать один и тот же код несколько раз подряд? Или вы можете использовать другую функцию библиотеки - аргумент указателя на пустоту для функции обратного вызова, в которой вы можете передать любое значение, например номер или адрес светодиода, чтобы один обратный вызов мог работать с указанным светодиодом.

Если вы выберете первый вариант, вашей функции setup() потребуется запустить 5 таймеров, по одному для каждой циклической функции () (которые, конечно, должны иметь разные имена), и время запуска этих таймеров должно быть в шахматном порядке.

Со вторым вариантом вы бы написали третий обратный вызов, allCycles (), который последовательно запускает каждый loop() по очереди. В этом случае вашей функции setup() потребуется только запустить таймер для повторного вызова allCycles().

Там много чего есть, если это новые концепции. Если это так, то будет намного проще поэкспериментировать с библиотекой SimpleTimer, сначала делая что-то тривиальное, например, мигая (не исчезая) одним светодиодом, затем несколькими светодиодами, пока этот способ кодирования временных событий не станет менее чуждым.

,

Спасибо, но это не поможет. Это должен быть очень простой и чистый код. Я должен использовать это: "если (cur_ms - x_ms > y_ms)" дважды. Один для увеличения яркости и один для увеличения индекса до следующего светодиода. Мне также нужна структура/массив, чтобы создать различное значение яркости для каждого светодиода., @yuvix_man

На самом деле чище этого не становится. Вы, конечно, можете писать слои "если (cur_ms - x_ms > y_ms)" и постоянно видеть весь код, но модульный код, как правило, легче понять, правильно писать, отлаживать и поддерживать. Пожалуйста., @JRobert

@yuvix_man как ответ Jroberts не помогает? Жробер все четко изложил. Написание фактического (чистого) кода зависит от вас, что должно быть легко после этого объяснения., @StarCat