Гирлянда на адресной ленте и Ардуино

Елочная новогодняя гирлянда ws2812b Arduino

Елочная гирлянда из ws2812b своими руками ► интересный проект на Arduino Nano, который сможет порадовать вас большим количеством крутых световых эффектов

Новогодняя гирлянда из адресных светодиодов ws2812b своими руками — интересный проект на Ардуино Нано, который сможет порадовать вас и удивить ваших гостей. Мы разместили на этой странице подробную схему сборки устройства, а также два варианта прошивки микроконтроллера с возможностью управлять световыми эффектами на адресной светодиодной ленте ws2812b Arduino от тактовой кнопки.

Новогодняя гирлянда своими руками

Гирлянда на WS2812B и Ардуино своими руками

Гирлянда из ws2812b потребляет довольно много тока. Если выбор блока питания для адресной LED ленты зависит от напряжения питания ws2812b (5 или 12 Вольт). То на силу тока блока питания (Амперы) влияет длина ленты, а также плотность светодиодов, например, 60 штук на метр. Исходите из того, что один светодиод потребляет 60 mA, соответственно 60 светодиодов (один метр ленты) требуют ток 3,6 Ампера.

Сборка гирлянды на адресных светодиодах WS2812B и Arduino




Для этого проекта нам потребуется:

  • плата Arduino Nano;
  • адресная лента WS2812B;
  • блок питания на 5V или 12V;
  • резистор 100 — 500 Ом;
  • тактовые кнопки;
  • припой, провода, изолента.

На следующей картинке изображена сборка электрической схемы новогодней гирлянды на ws2812b. Тактовые кнопки служат для настройки световых эффектов — изменение яркости, шага и скорости движения радуги в первом скетче. Во втором скетче предусмотрен вариант переключения различных световых эффектов на ws2812b, а также изменения яркости светодиодов и скорости переливания цветов.

Схема подключения ёлочной гирлянды
Схема подключения ёлочной гирлянды на адресной ленте

После сборки схемы, вам потребуется установить библиотеку FastLED для управления адресной ленты. Эту библиотеку, как и много других пользовательских библиотек можно скачать на нашем сайте здесь. Следующая прошивка заставляет ленту переливаться всеми цветами радуги. С помощью тактовых кнопок можно добиться нужного светового эффекта для елочной гирлянды на ws2812b светодиодах.

Скетч. Адресная гирлянда WS2812B на Ардуино

#include <FastLED.h> // подключаем библиотеку

#define NUM_LEDS 100 // указываем количество светодиодов на ленте
#define PIN 4                    // указываем пин для подключения ленты

byte bright = 50;  // яркость светодиодов
byte steps = 1;     // шаг радуги из светодиодов
byte rate = 0;        // скорость движения радуги

boolean button1WasUp = true;   // переменные для считывания нажатия на кнопки
boolean button2WasUp = true;
boolean button3WasUp = true;

CRGB leds[NUM_LEDS];
byte counter;

void setup() {
   pinMode(8, INPUT_PULLUP);   // подключаем тактовые кнопки
   pinMode(10, INPUT_PULLUP);
   pinMode(12, INPUT_PULLUP);
   // настройки для гирлянды из адресной ленты
   FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
   FastLED.setBrightness(bright);
}
 
void loop() {
   boolean button1IsUp = digitalRead(8);   // узнаем текущее состояние кнопок
   boolean button2IsUp = digitalRead(10);
   boolean button3IsUp = digitalRead(12);

   // если кнопка 1 была нажата, добавляем яркость (не больше 250)
   if (button1WasUp && !button1IsUp) {
     delay(10);
     button1IsUp = digitalRead(8);
     if (!button1IsUp) { bright = bright + 50; if (bright > 250) { bright = 50; } }
   }
   button1WasUp = button1IsUp; // запоминаем состояние кнопки 1

   // если кнопка 2 была нажата, увеличиваем задержку (не больше 50)
   if (button2WasUp && !button2IsUp) {
     delay(10);
     button2IsUp = digitalRead(10);
     if (!button2IsUp) { rate = rate + 10; if (rate > 50) { rate = 0; } }
   }
   button2WasUp = button2IsUp; // запоминаем состояние кнопки 2

   // если кнопка 3 была нажата, уменьшаем шаг радуги (не больше 51)
   if (button3WasUp && !button3IsUp) {
     delay(10);
     button3IsUp = digitalRead(12);
     if (!button3IsUp) { steps = steps + 10; if (steps > 51) { steps = 1; } }
   }
   button3WasUp = button3IsUp; // запоминаем состояние кнопки 3

   for (int i = 0; i < NUM_LEDS; i++ ) {
     leds[i] = CHSV(counter + i * steps, 255, 255);
   }
   counter++;

   FastLED.setBrightness(bright);
   FastLED.show();
   delay(rate);
}

Пояснения к коду:

  1. кнопки подключены к пинам, которые сконфигурированы с помощью функции INPUT_PULLUP, позволяющей считывать количество нажатий на кнопку;
  2. нажатие кнопок увеличивает переменные bright, steps и rate, а при достижении заданного порога переменные возвращаются к начальным значениям.
Схема сборки электрической гирлянды на Arduino Nano
Схема сборки электрической гирлянды на Arduino Nano

В следующей прошивке есть несколько режимов работы гирлянды, как и в случае сборки светильника на ws2812b для переключения служат кнопки. Для удобства мы использовали только одну библиотеку FastLED в скетче. Между тем, скетч от светильника тоже подойдет для управления эффектами на гирлянде, единственное, что вам потребуется дополнительно скачать и установить библиотеку Adafruit NeoPixel.

Скетч. Адресная гирлянда WS2812B с кнопкой

#include <FastLED.h> // подключаем библиотеку

#define NUM_LEDS 100
#define PIN 4

byte bright = 50; // яркость светодиодов
byte rate = 0;       // скорость эффектов
byte w = 1;          // переключение режимов
byte baza = 0;     // изменение оттенка

boolean button1WasUp = true;   // переменные для считывания нажатия на кнопки
boolean button2WasUp = true;
boolean button3WasUp = true;

CRGB leds[NUM_LEDS];

void setup() {
  pinMode(8, INPUT_PULLUP);   // подключаем тактовые кнопки
  pinMode(10, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(bright);
}

void knopka () {
  boolean button1IsUp = digitalRead(8);   // узнаем текущее состояние кнопок
  boolean button2IsUp = digitalRead(10);
  boolean button3IsUp = digitalRead(12);

  // если кнопка 1 была нажата, добавляем яркость (не больше 250)
  if (button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(8);
    if (!button1IsUp) { bright = bright + 50; if (bright > 250) { bright = 50; }
    }
  }
  button1WasUp = button1IsUp; // запоминаем состояние кнопки 1

  // если кнопка 2 была нажата, увеличиваем задержку (не больше 50)
  if (button2WasUp && !button2IsUp) {
    delay(10);
    button2IsUp = digitalRead(10);
    if (!button2IsUp) { rate = rate + 10; if (rate > 50) { rate = 0; }
    }
  }
  button2WasUp = button2IsUp; // запоминаем состояние кнопки 2

  // если кнопка 3 была нажата, переходим в новый режим
  if (button3WasUp && !button3IsUp) {
    delay(10);
    button3IsUp = digitalRead(12);
    if (!button3IsUp) { w++; if (w > 7) { w = 1; }
    }
  }
  button3WasUp = button3IsUp; // запоминаем состояние кнопки 3
}

void loop() {
  // первый режим (радуга)
  while (w == 1) {
    knopka(); // узнаем состояние кнопок
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CHSV(baza+ i * 5, 255, 255);
    }
    baza++;
    FastLED.setBrightness(bright);
    FastLED.show();
    delay(50 - rate);
  }

  // второй режим (палитра)
  while (w == 2) {
    knopka(); // узнаем состояние кнопок
    static uint8_t starthue = 0;
    fill_rainbow( leds + 5, NUM_LEDS - 5, --starthue, rate);
    uint8_t secs = (millis() / 1000) % (rate * 2);
    if (secs < rate) { FastLED.setTemperature( Tungsten100W ); leds[0] = Tungsten100W; }
    else { FastLED.setTemperature( OvercastSky ); leds[0] = OvercastSky; }
    FastLED.setBrightness(bright);
    FastLED.show();
  }

  // третий режим (конфетти)
  while (w == 3) {
    knopka(); // узнаем состояние кнопок
    fadeToBlackBy(leds, NUM_LEDS, (rate + 1) * 2);
    int pos = random16(NUM_LEDS);
    leds[pos] += CHSV(baza++ + random8(64), 200, 255);
    FastLED.setBrightness(bright);
    FastLED.show();
  }

  // четвертый режим (бегущий огонек)
  while (w == 4) {
    knopka(); // узнаем состояние кнопок
    fadeToBlackBy(leds, NUM_LEDS, (rate + 1) * 2);
    int pos = beatsin16(13, 0, NUM_LEDS - 1);
    leds[pos] += CHSV(baza++, 255, 192);
    FastLED.setBrightness(bright);
    FastLED.show();
  }

  // пятый режим (циклон)
  while (w == 5) {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i].nscale8(250);
      }
    for (int i = 0; i < NUM_LEDS; i++) {
      knopka(); // узнаем состояние кнопок
      leds[i] = CHSV(baza++, 255, 255);
      FastLED.setBrightness(bright);
      FastLED.show();
      delay(rate);
    }
  }

  // шестой режим (фокус)
  while (w == 6) {
    knopka(); // узнаем состояние кнопок
    fadeToBlackBy(leds, NUM_LEDS, (rate + 1) * 2);
    for (int i = 0; i < 8; i++) {
      leds[beatsin16(i + 7, 0, NUM_LEDS - 1)] |= CHSV(baza+=16, 200, 255);
    }
    FastLED.setBrightness(bright);
    FastLED.show();
    delay(10);
  }

  // седьмой режим (радуга с мерцанием)
  while (w == 7) {
    knopka(); // узнаем состояние кнопок
    fill_rainbow( leds, NUM_LEDS, baza++, 7);
    if (random8() < 80) { leds[ random16(NUM_LEDS) ] += CRGB::White; }
    FastLED.setBrightness(bright);
    FastLED.show();
    delay(50 - rate);
  }
}

Пояснения к коду:

  1. эффекты прошивки сделаны из стандартных скетчей библиотеки FastLED.h;
  2. можно в схеме подключить только одну кнопку для переключения режимов работы новогодней гирлянды (пин 12), а значение яркости bright и скорость эффектов rate установить по умолчанию в начале программы.

Заключение: Гирлянда из адресных светодиодов ws2812b своими руками может иметь и больше различных крутых световых эффектов. Для управления гирляндой можно использовать библиотеку Adafruit_NeoPixel.h, с помощью которой мы подключали матрицу ws2812b к Ардуино. Если у вас остались вопросы по сборке или программированию данного проекта — оставляйте их в комментариях к этой записи.

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5,00 out of 5)
Загрузка...

Подборка на тему: Гирлянда на адресной ленте и Ардуино

Один комментарий для “Гирлянда на адресной ленте и Ардуино

  1. Спасибо за проект! Получилась отличная адресная светодиодная гирлянда ws2812 со множеством эффектов. Особенно понравился режим радуги с мерцанием

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *