Новогодняя гирлянда на Ардуино Нано и ws2812b
Ищу интересные проекты для самостоятельной сборки.
Хочу поделиться этим проектом с вами. Возможно он будет вам так же интересен.
Новогодняя гирлянда на адресных светодиодах ws2812b Arduino своими руками — интересный проект, который способен порадовать и удивить ваших гостей. Мы разместили на этой странице подробную схему сборки устройства и программу для микроконтроллера Ардуино Нано с возможностью управления яркостью и переключением эффектов елочной гирлянды на адресной светодиодной ленте ws2812b с помощью нескольких кнопок.
Необходимые компоненты:
Для переключения эффектов на елочной гирлянде из светодиодов WS2812B используется кнопка, подключенная к 4 пину Ардуино Нано. Кнопка на 8 пине замедляет или ускоряет скорость эффектов, а кнопка на 12 пине изменяет яркость гирлянды на адресной ленте. Всего в программе используется пять эффектов, также есть возможность полностью выключить гирлянду или включить все светодиоды белым светом без эффектов.
Схема сборки гирлянды на Arduino Nano и WS2812B
На картинке выше показана сборка схемы новогодней гирлянды на ws2812b с платой Arduino Nano (можно использовать любую другую плату). Для настройки световых эффектов используются тактовые кнопки. После сборки схемы необходимо будет установить библиотеку FastLED.h для управления адресной лентой от Ардуино. Библиотеку можно скачать с сайта GitHub.com (ссылка для скачивания архива дана выше).
Скетч для новогодней елочной гирлянды WS2812B
#include "FastLED.h"
#define NUM_LEDS 150 // количество светодиодов в ленте
#define PIN 2 // пин подключения ленты
#define B1 12 // кнопка для настройки яркости
#define B2 8 // кнопка для настройки скорости
#define B3 4 // кнопка для переключения режимов
byte bright = 50; // яркость по умолчанию
byte rate = 50; // скорость по умолчанию
byte w, baza;
boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button1IsUp;
boolean button2IsUp;
boolean button3IsUp;
CRGB leds[NUM_LEDS];
void setup() {
pinMode(B1, INPUT_PULLUP);
pinMode(B2, INPUT_PULLUP);
pinMode(B3, INPUT_PULLUP);
FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(bright);
}
// функция настройки режимов работы
void setting() {
button1IsUp = digitalRead(B1);
button2IsUp = digitalRead(B2);
button3IsUp = digitalRead(B3);
if (button1WasUp && !button1IsUp) {
delay(10);
button1IsUp = digitalRead(B1);
if (!button1IsUp) {
bright = bright + 50; if (bright > 250) {
bright = 50;
}
}
}
button1WasUp = button1IsUp;
if (button2WasUp && !button2IsUp) {
delay(10);
button2IsUp = digitalRead(B2);
if (!button2IsUp) {
rate = rate + 10; if (rate > 50) {
rate = 10;
}
}
}
button2WasUp = button2IsUp;
if (button3WasUp && !button3IsUp) {
delay(10);
button3IsUp = digitalRead(B3);
if (!button3IsUp) {
w++; if (w > 6) {
w = 0;
}
}
}
button3WasUp = button3IsUp;
}
void loop() {
// гирлянда полностью выключена
while (w == 0) {
for (int i = 0; i < NUM_LEDS; i++) {
setting();
leds[i] = CRGB::Black;
FastLED.show();
}
}
// гирлянда светит белым цветом
while (w == 1) {
for (int i = 0; i < NUM_LEDS; i++) {
setting();
leds[i] = CRGB::White;
FastLED.setBrightness(bright);
FastLED.show();
}
}
// эффект переливания
while (w == 2) {
for (int i = 0; i < NUM_LEDS; i++) {
setting();
leds[i] = CHSV(baza + i * 5, 255, 255);
}
baza++;
FastLED.setBrightness(bright);
FastLED.show();
delay(50 - rate);
}
// эффект радуги
while (w == 3) {
setting();
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 == 4) {
setting();
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 == 5) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
for (int i = 0; i < NUM_LEDS; i++) {
setting();
leds[i] = CHSV(baza++, 255, 255);
FastLED.setBrightness(bright);
FastLED.show();
delay(rate);
}
}
// эффект конфетти
while (w == 6) {
setting();
fill_rainbow( leds, NUM_LEDS, baza++, 7);
if (random8() < 80) {
leds[ random16(NUM_LEDS) ] += CRGB::White;
}
FastLED.setBrightness(bright);
FastLED.show();
delay(50 - rate);
}
}
Заключение. Тактовые кнопки позволяют получить желаемый эффект на елочной гирлянде. Светодиодная гирлянда на ленте ws2812b может иметь больше световых эффектов — вы можете самостоятельно добавить их в скетч или изменить существующие эффекты. Дополнительно к скетчу можно подключить библиотеку Adafruit_NeoPixel.h, чтобы увеличить количество режимов со световыми эффектами на новогодней гирлянде.

