Поскольку до Нового года осталось всего 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 килобайт в контроллере). Если у вас ограниченная память, за этим нужно следить, чтобы прошивка поместилась в памяти.
Успехов!
Комментарии: