Новогодняя гирлянда своими руками. Часть 4

Управляемые светодиоды

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

Успехов!

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован.