Как погасить светодиод за определенное время с помощью 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);
}
Кто-нибудь может помочь мне разобраться в этом?
@yuvix_man, 👍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
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Использовать светодиод или подтягивающий резистор для предотвращения «плавания» или «фантомного изображения» матричной клавиатуры?
- Вызов функции работает только при однократном вызове
- Питание светодиодной ленты - Сколько ампер?
- Светодиоды: разница между общим анодом и общим катодом
- Как запрограммировать ардуино на чистом C/C++?
- Улучшенное циклическое переключение цветов RGB.
- как быстро loop() работает в Arduino
Привет, добро пожаловать в ASE. Просто Идея. Вы можете использовать оставшийся
millis ()
и текущее значение яркости для вычисления следующего необходимого скачка или уменьшения яркости, @ArduinoFanЯ был бы признателен, если бы вы могли предоставить фрагмент, @yuvix_man
можете ли вы поделиться полным фрагментом кода того, над чем вы работали? Кроме того, приведенный ниже ответ действительно очень хорош. Возможно, сейчас вы торопитесь, но добавьте его в закладки и возвращайтесь, когда у вас будет время., @ArduinoFan