Поскольку до Нового года осталось всего 4 дня, даю последнюю часть описания своей гирлянды. Напомню, что ранее мы разобрались с оборудованием, попробовали помигать светодиодами и освоили простые переключения.
Итак, начнём с плавного включения. В случае всей ленты это делается несложно – просто увеличиваем яркость, используя параметр в функции LEDS.show(), например, LEDS.show(192) – включаем на 75% от максимума. Пример кода:
void smooth_lighting(CRGB color, int count) { fill_solid(&(leds[0]), NUM_LEDS, color); for (int k = 0; k < count; k++) { for (int i = 0; i < 256; i++) { LEDS.show(i); delay(25); } for (int i = 255; i >=0; i--) { LEDS.show(i); delay(25); } } }
fill_solid – функция из библиотеки, поэтому подробно расписывать её не будем, кому интересно, может посмотреть исходник. Задержки в 25 миллисекунд более чем достаточно, поскольку таких задержек у нас будет 256, а общее время включения составит соответственно 6,4 секунды. Угасание займёт ещё сколько же времени, так что полный цикл составит чуть менее 13 секунд.
И попробуем реализовать плавную смену цвета ленты. Это можно сделать как с использованием цветовой модели RGB, так и с HSV. Предпочтительнее использовать второй вариант, так как код в этом случае будет компактнее, а переходы цвета красивее, без изменения яркости. При использовании модели RGB можно избежать перепадов яркости, но код получится значительно больше по размеру, а ресурсы контроллера (Arduino) не безграничны.
Также в этом примере сделаем плавное включение ленты а после отработки заданного количества раз – плавное выключение.
void smooth_color_HSV(byte count) { memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); for (int i = 0; i <= 255; i++) { fill_solid(&leds[0], NUM_LEDS, CHSV(0, 255, i)); LEDS.show(); delay(20); } for (int k = 0; k < count; k++){ for (int i = 0; i <= 255; i++) { fill_solid(&leds[0], NUM_LEDS, CHSV(i, 255, 255)); LEDS.show(); delay(120); } } for (int i = 255; i >= 0; i--) { fill_solid(&leds[0], NUM_LEDS, CHSV(0, 255, i)); LEDS.show(); delay(20); } }
Важное замечание – переменная i в циклах должна быть именно типа int – двухбайтовая. Если попытаться использовать однобайтовую переменную (типа byte), цикл никогда не завершится.
После того, как эти функции были добавлены в код, необходимо добавить их вызов в функцию loop, после чего скомпилировать код и загрузить прошивку в контроллер.
Все примеры кода рабочие и взяты из моей прошивки.
Замечание. Даже при использовании десятка разных эффектов скомпилированный код не занимал более 8 килобайт (при наличии 32 килобайт в контроллере). Если у вас ограниченная память, за этим нужно следить, чтобы прошивка поместилась в памяти.
Успехов!
Комментарии: