CONTENIDO ►
Guirnalda de Navidad con tira de luces LEDs direccionables ws2812b / ws2811 de tus propias manos es un interesante proyecto en Arduino que puede hacerte feliz y sorprender a tus invitados durante las fiestas. Hemos publicado en esta página un circuito detallado del montaje del dispositivo y un ejemplo de firmware del microcontrolador con la capacidad de controlar los efectos de iluminación en la tira de LEDs Arduino ws2812b desde el pulsador.
Para esta actividad necesitaremos:
- Arduino Uno / Arduino Nano / Arduino Mega
- tira de LED ws2812b;
- fuente de alimentación de 5V;
- resistencia de 100 a 500 ohm;
- 3 pulsadores;
- libreria FastLED.h
Guirnalda de Navidad con LEDs direccionables WS2812B
Una guirnalda programable ws2812b consume mucha energía. La elección de la fuente de alimentación para la tira de LEDs depende de la tensión de alimentación del ws2812b. La corriente de alimentación (amperios) está influida por la longitud de la tira y la densidad de los LED, por ejemplo, 60 LED por metro. Suponiendo que un LED consume 60 mA, respectivamente 60 LEDs (un metro de tira) requieren una corriente de 3,6 amperios.
Como hacer guirnalda de Navidad con WS2812B

La foto muestra el montaje del circuito de luces de Navidad de Arduino ws2812b. Los botones pulsador se utilizan para ajustar los efectos de luz: permiten cambiar los diferentes efectos de luz del ws2812b, así como el brillo de los LED y la velocidad del brillo del color. Después del ensamblaje necesitarás instalar la librería FastLED para controlar la tira de direcciones ws2812b / ws2811b, la librería puede ser descargada desde nuestro sitio web.
Programa Arduino para cadena de Navidad con 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); if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(8); if (!button1IsUp) { bright = bright + 50; if (bright > 250) { bright = 50; } } } button1WasUp = button1IsUp; if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(10); if (!button2IsUp) { rate = rate + 10; if (rate > 50) { rate = 0; } } } button2WasUp = button2IsUp; if (button3WasUp && !button3IsUp) { delay(10); button3IsUp = digitalRead(12); if (!button3IsUp) { w++; if (w > 7) { w = 1; } } } button3WasUp = button3IsUp; } 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); } }
Explicación del código para cadena de Navidad con WS2812B:
- sólo se puede conectar un pulsadore para cambiar los modos de funcionamiento del WS2812B (pin 12), y el valor del brillo y la velocidad de los efectos rítmicos se establecen por defecto al principio del programa Arduino «Guirnalda de Navidad en ws2812b»;
- al pulsar los botones, las variables brillo, pasos y ritmo aumentan, y cuando se alcanza el umbral establecido, las variables vuelven a su valor inicial.
Conclusión. Los botones permiten obtener el efecto de luz deseado para la guirnalda del árbol de Navidad. La guirnalda de LEDs NeoPixel ws2812b puede tener más efectos de luz diferentes y geniales, porque además se puede utilizar la librería Adafruit_NeoPixel.h Arduino. Si tienes alguna duda sobre el montaje o la programación del proyecto Arduino «Guirnalda en LEDs direccionables WS2812B con Arduino» – déjala en los comentarios de este post.

Hola como estas y feliz 2023. Mi nombre es Esteban y te escribo desde Argentina. Tengo dudas sobre como esta funcionando el Random16 ya que no veo que hayas incluido la biblioteca. Quizas este ya en el paquete de Fastled, pero mi intriga es porque necesito usar esa biblioteca y no logro que funcione bien.
Gracias de antemano
Hola.
Se han comprobado todos los programas del sitio web (por supuesto, puede haber alguna errata), pero todos funcionan. Si no te sientes cómodo utilizando Random16, es posible que quieras prescindir de algunos de los efectos.