Luces de Árbol de Navidad con Arduino y WS2812B: Nieve y Arcoíris
Haz luces de árbol de Navidad con Arduino: tira WS2812B, efectos de nieve, arcoíris y destellos, cambio de modo con botón, cálculo de alimentación a 5 V y código.
Usar Arduino y una tira LED WS2812B para tus luces de árbol de Navidad es la forma más divertida de ir más allá de los pocos modos fijos de las luces comerciales. Como puedes controlar el color y el brillo de cada LED por separado, puedes hacer que caigan copos de nieve desde la punta, que un arcoíris gire alrededor de las ramas o que parpadeen estrellas rojas, verdes y doradas al azar. Y para todo eso solo necesitas un cable de datos, un botón y una fuente de 5 V bien elegida.
En esta guía empezamos por la lista de materiales y el cálculo de la fuente según la longitud de la tira, la conexión correcta entre fuente, placa y tira, un programa completo para Arduino Uno (FastLED) que cambia de efecto con un botón y las versiones del mismo proyecto para ESP32 (Adafruit NeoPixel) y Raspberry Pi Pico (MicroPython). Al final aprenderás cómo enrollar la tira en el árbol, qué cuidar en cuanto a seguridad y cómo resolver los problemas más comunes.

¿Por qué una tira LED WS2812B para el árbol de Navidad?
En las luces navideñas clásicas todas las bombillas se encienden a la vez o funcionan por grupos en secuencia. En el WS2812B, en cambio, cada LED lleva un pequeño chip controlador. Arduino envía por la línea de datos la información de color una detrás de otra; el primer LED toma sus 24 bits y pasa el resto al siguiente. Así controlas una tira de 100 o 300 LED con un solo pin y puedes dar a cada LED un color distinto. Gracias a esto, efectos en movimiento como la nieve cobran una vida imposible con luces fijas. Si quieres entender mejor cómo funcionan los LED direccionables, echa un vistazo al artículo LED WS2812B NeoPixel.
| Característica | Valor |
|---|---|
| Encapsulado | 5050 SMD, con el chip controlador dentro del LED |
| Alimentación | 5 V (aprox. 3,5–5,3 V) |
| Corriente | Unos 20 mA por color, unos 60 mA en blanco total |
| Datos | Una sola línea, 800 kHz, 24 bits por LED (orden G-R-B) |
| Tiempo de datos | 30 µs por LED; 100 LED unos 3 ms |
| Umbral de entrada de datos | Mínimo 0,7 × VDD para un 1 lógico (3,5 V a 5 V) |
| Color | 256 niveles por canal, 16,7 millones de colores en total |
| Densidad de la tira | 30, 60 y 144 LED/m |
| Corte | Se puede cortar por el centro de las almohadillas de cobre entre LED |
Lista de materiales
- Tira LED WS2812B: para un árbol de 1,5–1,8 m, una tira de 2,5 m con 60 LED/m o de 5 m con 30 LED/m es un buen comienzo. Los modelos IP65 con cubierta de silicona resisten mejor el roce con las ramas y el polvo.
- Placa de control: Arduino Uno, Nano, ESP32 o Raspberry Pi Pico.
- Fuente de 5 V: elige la corriente según la tabla de abajo; para 100 LED, 5 V 4 A es una opción cómoda.
- Conector DC hembra (con bornes de tornillo): para conectar el enchufe de la fuente a los cables sin soldar.
- Condensador electrolítico de 1000 µF / 10 V: suaviza los picos bruscos de corriente en la entrada de la tira.
- Resistencia de 330 Ω: se conecta en serie con la línea de datos; limita las reflexiones de la señal y la corriente de entrada del primer LED.
- Pulsador: para cambiar entre efectos.
- Cable grueso: cable de al menos 0,75–1,5 mm² de sección para las líneas de 5V y GND.
- Opcional, 74AHCT125 o 74HCT245: para subir a 5 V la señal de datos de 3,3 V del ESP32 y la Pico.
Cálculo de la fuente: ¿de cuántos amperios?
Cada uno de los chips rojo, verde y azul del WS2812B consume unos 20 mA a brillo máximo; es decir, un LED gasta unos 60 mA en blanco total. La corriente en el peor caso es I = número de LED × 60 mA. Una tira de 100 LED con todos en blanco puro y brillo máximo consume 6 A, o sea P = 5 V × 6 A = 30 W. En los efectos de arcoíris, nieve y estrellas, la mayoría de los LED están en un solo color o atenuados, así que en la práctica la corriente queda en torno a un tercio del peor caso. Para elegir con seguridad, multiplica esa corriente típica por 2 y redondea al valor de fuente más cercano; ajusta también el límite de corriente del software a aproximadamente el 80 % de la fuente. Puedes comprobar fácilmente la relación entre corriente, tensión y potencia con la calculadora de la ley de Ohm.
| Número de LED | Peor caso (blanco total) | Corriente típica del efecto | Fuente recomendada | Límite de software (MAX_MA) |
|---|---|---|---|---|
| 30 | 1,8 A | aprox. 0,6 A | 5 V 2 A | 1600 mA |
| 60 | 3,6 A | aprox. 1,2 A | 5 V 3 A | 2400 mA |
| 100 | 6 A | aprox. 2 A | 5 V 4 A | 3200 mA |
| 150 | 9 A | aprox. 3 A | 5 V 6 A | 4800 mA |
| 300 (5 m, 60 LED/m) | 18 A | aprox. 6 A | 5 V 12 A | 9600 mA |
En tiras largas el segundo problema es la caída de tensión. Como las finas pistas de cobre de la tira tienen resistencia, al final de una tira de 5 m la tensión puede bajar de 4 V; entonces los chips azul y verde se debilitan y el blanco se ve amarillento y apagado. La solución es realimentar 5V y GND no solo desde el inicio de la tira, sino cada 1–1,5 metros (o cada 100–150 LED) con cables independientes que vengan de la fuente. Esto se llama inyección de alimentación. En estos cables usa una sección de al menos 0,75 mm² para 5 amperios y 1,5 mm² para 10 amperios; la línea de datos conéctala solo al inicio de la tira.
Esquema de conexión: fuente de 5 V, tira y placa
| Conexión | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| DIN de la tira (datos) | D6 (a través de 330 Ω) | GPIO 13 (a través de 330 Ω) | GP0 (a través de 330 Ω) |
| 5V de la tira | +5 V de la fuente | +5 V de la fuente | +5 V de la fuente |
| GND de la tira | GND de la fuente + GND del Uno | GND de la fuente + GND del ESP32 | GND de la fuente + GND de la Pico |
| Botón | D2 y GND | GPIO 4 y GND | GP15 y GND |
| Condensador de 1000 µF | 5V–GND en la entrada de la tira | 5V–GND en la entrada de la tira | 5V–GND en la entrada de la tira |
| Alimentación de la placa (montaje final) | Pin 5V o USB | Pin 5V (VIN) o USB | VSYS (a través de un diodo Schottky) o USB |
- Busca las flechas de la tira y suelda un cable en el extremo donde empieza la flecha (DIN). Si envías datos en sentido contrario, es decir, por el extremo DOUT, no se enciende ningún LED.
- Conecta la salida +5 V de la fuente al extremo 5V de la tira (en algunas tiras pone +5V o VCC) y el GND de la fuente al extremo GND de la tira.
- Conecta el condensador de 1000 µF entre 5V y GND en la entrada de la tira; la pata larga (positivo) va a 5V y la pata con la franja marcada en el cuerpo (negativo) va a GND.
- Conecta el pin GND de la placa al GND de la fuente. Sin un GND común, la señal de datos no tiene referencia.
- Conecta el pin de datos de la placa (D6 en el Uno) al extremo DIN de la tira a través de la resistencia de 330 Ω; da mejor resultado colocar la resistencia cerca de la tira.
- Conecta una pata del botón a D2 y la otra a GND; la resistencia pull-up interna se activará en el código.
- Si usas más de 150 LED, tira también cables de 5V y GND independientes desde la fuente hasta el centro y el final de la tira.
- Durante el desarrollo alimenta la placa por USB y la tira desde la fuente. Cuando termines, puedes dar los 5 V de la fuente al pin 5V del Uno; en ese caso no conectes el cable USB al mismo tiempo.
Código para Arduino Uno (FastLED): tres efectos y cambio de modo con botón
Abre el Gestor de bibliotecas en el IDE de Arduino y busca FastLED para instalar la biblioteca; para una explicación detallada, mira el artículo Cómo añadir una biblioteca a Arduino. El programa de abajo incluye arcoíris, nieve y destellos tipo estrella; cada vez que pulsas el botón pasa al siguiente efecto. Como el código usa millis() en lugar de delay(), el botón se detecta en todo momento mientras corre el efecto. La lógica de este método la encuentras en el artículo Diferencia entre millis y delay.
1#include <FastLED.h>
2
3#define LED_PIN 6 // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN 2 // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS 100 // şeritteki LED sayısı / number of LEDs on the strip
6#define BRIGHTNESS 120 // genel parlaklık 0-255 / global brightness 0-255
7#define MAX_MA 3200 // 4 A adaptörün %80'i / 80% of a 4 A supply
8
9CRGB leds[NUM_LEDS];
10
11const uint8_t MODE_COUNT = 3; // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
12const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30}; // kare süreleri (ms) / frame times (ms)
13const CRGB XMAS[4] = {CRGB::Red, CRGB::Green, CRGB::Gold, CRGB::White};
14
15uint8_t mode = 0;
16uint8_t hue = 0;
17
18void setup() {
19 pinMode(BUTTON_PIN, INPUT_PULLUP);
20 FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
21 FastLED.setMaxPowerInVoltsAndMilliamps(5, MAX_MA); // akım sınırı / current limit
22 FastLED.setBrightness(BRIGHTNESS);
23 FastLED.clear(true); // açılışta hepsini söndür / all off at start
24}
25
26void checkButton() {
27 static bool lastState = HIGH;
28 static unsigned long lastChange = 0;
29 bool state = digitalRead(BUTTON_PIN);
30 if (state != lastState && millis() - lastChange > 50) { // 50 ms zıplama filtresi / 50 ms debounce
31 lastChange = millis();
32 lastState = state;
33 if (state == LOW) { // basıldı / pressed
34 mode = (mode + 1) % MODE_COUNT;
35 FastLED.clear();
36 }
37 }
38}
39
40void rainbow() {
41 fill_rainbow(leds, NUM_LEDS, hue, 3); // her LED'de ton 3 artar / hue +3 per LED
42 hue += 2; // renkler döner / colours rotate
43}
44
45void snowfall() {
46 for (int i = 0; i < NUM_LEDS - 1; i++) {
47 leds[i] = leds[i + 1]; // bir LED aşağı kaydır / shift one LED down
48 }
49 if (random8() < 38) {
50 leds[NUM_LEDS - 1] = CRGB::White; // tepede yeni kar tanesi / new flake at the top
51 } else {
52 leds[NUM_LEDS - 1] = CRGB(0, 0, 24); // koyu mavi gece / dark blue night
53 }
54}
55
56void twinkle() {
57 fadeToBlackBy(leds, NUM_LEDS, 20); // hepsini biraz kıs / dim everything a little
58 if (random8() < 80) {
59 leds[random16(NUM_LEDS)] = XMAS[random8(4)]; // rastgele yıldız / random star
60 }
61}
62
63void loop() {
64 checkButton();
65 static unsigned long lastFrame = 0;
66 if (millis() - lastFrame >= FRAME_MS[mode]) {
67 lastFrame = millis();
68 if (mode == 0) rainbow();
69 else if (mode == 1) snowfall();
70 else twinkle();
71 FastLED.show(); // renkleri şeride gönder / push colours to the strip
72 }
73}| Línea / ajuste | Para qué sirve |
|---|---|
| NUM_LEDS | Número de LED de la tira; si lo pones mal, parte de la tira no se enciende o los efectos se desplazan. |
| BRIGHTNESS | Brillo general (0–255). Alrededor de 120 es suficientemente brillante para el árbol y también seguro en cuanto a corriente y calor. |
| setMaxPowerInVoltsAndMilliamps(5, MAX_MA) | FastLED estima la corriente que se consumirá en cada fotograma y baja el brillo automáticamente si se va a superar el límite. |
| addLeds<WS2812B, LED_PIN, GRB> | Define el tipo de tira, el pin de datos y el orden de colores; en el WS2812B el orden es GRB. |
| FRAME_MS | Duración de cada fotograma de cada efecto (ms); un valor menor significa una animación más rápida. |
| checkButton() | Lee el botón con un filtro antirrebote de 50 ms y aumenta el modo en cada pulsación. |
| FastLED.show() | Envía a la tira los colores guardados en memoria; si no se llama, no se ve ningún cambio. |
¿Cómo funcionan los efectos?
Arcoíris: la función fill_rainbow parte del tono (hue) dado al primer LED y aumenta el tono 3 pasos en cada LED. En FastLED el tono va de 0 a 255; con 100 LED el tono avanza 300 pasos en total, así que sobre la tira se ve un poco más que un círculo cromático completo. Como aumentamos la variable hue en 2 en cada fotograma, los colores giran lentamente alrededor del árbol. Si quieres bandas de color más anchas, usa 1 o 2 en lugar de 3.
Nieve: cuando la tira se enrolla en el árbol de abajo arriba, el primer LED queda abajo y el último en la punta. En cada fotograma desplazamos todos los colores un LED hacia abajo y añadimos en la punta un copo blanco o un píxel azul oscuro de noche. Como random8() genera un número entre 0 y 255, la probabilidad de que salga menor que 38 es de alrededor del 15 %; si aumentas ese número, la nevada se hace más densa. Con un fotograma de 60 ms, un copo tarda 6 segundos en bajar 100 LED. Destellos (estrellas): fadeToBlackBy atenúa todos los LED un 8 % aproximadamente en cada fotograma; a la vez, un LED elegido al azar se enciende a brillo máximo en rojo, verde, dorado o blanco. El resultado es un centelleo que recuerda a las luces navideñas de antes, pero mucho más vivo.
Árbol de Navidad con ESP32 (Adafruit NeoPixel)
FastLED también funciona en el ESP32, pero aquí escribimos el mismo proyecto con la biblioteca Adafruit NeoPixel; así conocerás las dos bibliotecas populares. La versión actual de la biblioteca compila con el mismo código en las versiones 2.x y 3.x del núcleo Arduino para ESP32 y genera la señal con la unidad RMT por hardware. Como en Adafruit NeoPixel los colores atenuados con setBrightness pueden distorsionarse al leerlos de nuevo, calculamos los efectos en nuestro propio array de brillo (level) y reescribimos la tira desde cero en cada fotograma. El pin de datos es el GPIO 13 y el botón, el GPIO 4. Si más adelante quieres controlar el árbol desde el móvil, el artículo Instalación de WLED ofrece una interfaz ya hecha.
1#include <Adafruit_NeoPixel.h>
2
3#define LED_PIN 13 // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN 4 // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS 100 // şeritteki LED sayısı / number of LEDs on the strip
6
7Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
8
9const uint8_t MODE_COUNT = 3; // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
10const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30}; // kare süreleri (ms) / frame times (ms)
11const uint8_t PALETTE[4][3] = {{255, 0, 0}, {0, 255, 0}, {255, 160, 0}, {255, 255, 255}};
12
13uint8_t level[NUM_LEDS]; // LED başına parlaklık / per-LED level
14uint8_t colorIdx[NUM_LEDS]; // yıldız rengi / star colour index
15uint8_t mode = 0;
16uint16_t hue = 0;
17
18void setup() {
19 pinMode(BUTTON_PIN, INPUT_PULLUP);
20 strip.begin();
21 strip.setBrightness(110); // genel parlaklık / global brightness
22 strip.clear();
23 strip.show();
24}
25
26void checkButton() {
27 static bool lastState = HIGH;
28 static unsigned long lastChange = 0;
29 bool state = digitalRead(BUTTON_PIN);
30 if (state != lastState && millis() - lastChange > 50) { // 50 ms zıplama filtresi / 50 ms debounce
31 lastChange = millis();
32 lastState = state;
33 if (state == LOW) { // basıldı / pressed
34 mode = (mode + 1) % MODE_COUNT;
35 memset(level, 0, sizeof(level)); // efekt belleğini sıfırla / reset effect buffer
36 strip.clear();
37 }
38 }
39}
40
41void rainbow() {
42 for (int i = 0; i < NUM_LEDS; i++) {
43 uint16_t h = hue + (uint32_t)i * 65536UL / NUM_LEDS; // LED'e göre ton / hue per LED
44 strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(h)));
45 }
46 hue += 256; // renkler döner / colours rotate
47}
48
49void snowfall() {
50 for (int i = 0; i < NUM_LEDS - 1; i++) level[i] = level[i + 1]; // bir LED aşağı kaydır / shift one LED down
51 level[NUM_LEDS - 1] = (random(100) < 15) ? 255 : 0; // tepede yeni kar / new flake on top
52 for (int i = 0; i < NUM_LEDS; i++) {
53 if (level[i]) strip.setPixelColor(i, 255, 255, 255); // kar tanesi / snowflake
54 else strip.setPixelColor(i, 0, 0, 24); // koyu mavi gece / dark blue night
55 }
56}
57
58void twinkle() {
59 for (int i = 0; i < NUM_LEDS; i++) {
60 level[i] = (level[i] > 12) ? level[i] - 12 : 0; // yavaşça sön / fade out
61 }
62 if (random(100) < 30) {
63 int p = random(NUM_LEDS);
64 level[p] = 255; // yeni yıldız / new star
65 colorIdx[p] = random(4);
66 }
67 for (int i = 0; i < NUM_LEDS; i++) {
68 const uint8_t *c = PALETTE[colorIdx[i]];
69 strip.setPixelColor(i, c[0] * level[i] / 255, c[1] * level[i] / 255, c[2] * level[i] / 255);
70 }
71}
72
73void loop() {
74 checkButton();
75 static unsigned long lastFrame = 0;
76 if (millis() - lastFrame >= FRAME_MS[mode]) {
77 lastFrame = millis();
78 if (mode == 0) rainbow();
79 else if (mode == 1) snowfall();
80 else twinkle();
81 strip.show(); // renkleri şeride gönder / push colours to the strip
82 }
83}Árbol de Navidad con Raspberry Pi Pico y MicroPython
El módulo neopixel viene incluido en MicroPython para la Raspberry Pi Pico; no necesitas instalar nada más. Como el módulo se encarga por sí mismo de la temporización precisa del WS2812B, puedes usar cualquier pin GP; en el código de abajo los datos van a GP0 y el botón a GP15. Como MicroPython no tiene un ajuste de brillo general, atenuamos los colores nosotros mismos con el coeficiente BRIGHT. Aunque Python es más lento que C++, con 100 LED los efectos van fluidos; por encima de 300 LED los tiempos de fotograma pueden alargarse. Si eres nuevo en MicroPython, puedes empezar con el artículo Fundamentos de MicroPython.
1from machine import Pin
2import neopixel, time, random
3
4NUM_LEDS = 100
5BRIGHT = 0.4 # 0-1 parlaklık / brightness
6np = neopixel.NeoPixel(Pin(0), NUM_LEDS) # veri GP0 / data on GP0
7button = Pin(15, Pin.IN, Pin.PULL_UP) # buton GP15-GND / button GP15-GND
8
9mode = 0
10MODE_COUNT = 3 # 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
11FRAME_MS = (20, 60, 30) # kare süreleri / frame times
12level = [0] * NUM_LEDS # LED başına parlaklık / per-LED level
13color_idx = [0] * NUM_LEDS # yıldız rengi / star colour index
14PALETTE = ((255, 0, 0), (0, 255, 0), (255, 160, 0), (255, 255, 255))
15hue = 0
16
17def scale(r, g, b):
18 return (int(r * BRIGHT), int(g * BRIGHT), int(b * BRIGHT))
19
20def wheel(pos):
21 # 0-255 -> gökkuşağı rengi / rainbow colour
22 pos = pos & 255
23 if pos < 85:
24 return (255 - pos * 3, pos * 3, 0)
25 if pos < 170:
26 pos -= 85
27 return (0, 255 - pos * 3, pos * 3)
28 pos -= 170
29 return (pos * 3, 0, 255 - pos * 3)
30
31def rainbow():
32 global hue
33 for i in range(NUM_LEDS):
34 np[i] = scale(*wheel(hue + i * 256 // NUM_LEDS))
35 hue = (hue + 2) & 255 # renkler döner / colours rotate
36
37def snowfall():
38 for i in range(NUM_LEDS - 1):
39 level[i] = level[i + 1] # bir LED aşağı kaydır / shift one LED down
40 level[-1] = 255 if random.randint(0, 99) < 15 else 0
41 for i in range(NUM_LEDS):
42 np[i] = scale(255, 255, 255) if level[i] else scale(0, 0, 24)
43
44def twinkle():
45 for i in range(NUM_LEDS):
46 level[i] = level[i] - 12 if level[i] > 12 else 0 # yavaşça sön / fade out
47 if random.randint(0, 99) < 30:
48 p = random.randint(0, NUM_LEDS - 1)
49 level[p] = 255 # yeni yıldız / new star
50 color_idx[p] = random.randint(0, 3)
51 for i in range(NUM_LEDS):
52 r, g, b = PALETTE[color_idx[i]]
53 k = level[i] * BRIGHT / 255
54 np[i] = (int(r * k), int(g * k), int(b * k))
55
56effects = (rainbow, snowfall, twinkle)
57last_btn = 1
58last_change = time.ticks_ms()
59last_frame = time.ticks_ms()
60
61while True:
62 now = time.ticks_ms()
63 state = button.value()
64 if state != last_btn and time.ticks_diff(now, last_change) > 50: # zıplama filtresi / debounce
65 last_change = now
66 last_btn = state
67 if state == 0: # basıldı / pressed
68 mode = (mode + 1) % MODE_COUNT
69 for i in range(NUM_LEDS):
70 level[i] = 0
71 if time.ticks_diff(now, last_frame) >= FRAME_MS[mode]:
72 last_frame = now
73 effects[mode]()
74 np.write() # şeride gönder / push to the stripCómo colocar la tira en el árbol y seguridad
- Empieza por abajo: pon el extremo DIN de la tira en la base del árbol, junto a la caja de control, y enrolla la tira en espiral hacia arriba. Así el efecto de nieve cae desde la punta y el cable de datos queda corto.
- Separación de la espiral: en un árbol de 1,8 m, enrollar con 20–25 cm de separación reparte la tira de 5 m de forma equilibrada por las ramas; como el diámetro de cada vuelta se reduce hacia la punta, puedes estrechar un poco la separación.
- Tiras verticales: también puedes colocar la tira en zigzag, de la punta hacia abajo y de abajo hacia arriba. En esta disposición la dirección del efecto de nieve se invierte en una de cada dos tiras, por lo que tendrás que hacer un pequeño ajuste que calcule el orden de los LED según el número de tira.
- Calor: la tira WS2812B se calienta con brillo alto; no la presiones con fuerza contra adornos de papel ni ramas secas. Mantener el brillo en torno a 100–150 reduce tanto el calor como la corriente.
- Seguridad de la fuente: no montes tu propio circuito en el lado de 220 V; usa una fuente de 5 V ya fabricada, con marcado CE y carcasa cerrada. Mantén la caja de control lejos del agua y del riego de las macetas, y apaga el árbol cuando salgas de casa.
- Fusible: en sistemas de más de 5 A, añadir a la salida de la fuente un fusible de cuchilla del valor adecuado es una buena medida contra un posible cortocircuito.
Ideas de proyectos para el árbol de Navidad
- Árbol sensible a la música: enciende las luces al ritmo de la canción con un micrófono; los detalles están en el artículo LED sensible a la música.
- Cuenta atrás de Nochevieja: muestra en una pantalla el tiempo que falta para la medianoche y, cuando sean las 00:00, lanza un efecto de fuegos artificiales en el árbol; echa un vistazo al artículo contador de cuenta atrás de Nochevieja.
- Árbol que se enciende solo: enciende las luces automáticamente al anochecer con un sensor de luz LDR.
- Árbol que brilla al acercarte: sube el brillo cuando alguien entra en la habitación con un sensor de movimiento PIR y bájalo cuando está vacía.
- Control desde el móvil: abre una página web con el ESP32 y elige los efectos y colores desde el móvil; el artículo Servidor web con ESP32 es un buen punto de partida.
- Pantalla en la estrella de la punta: coloca en la punta del árbol una pequeña matriz LED WS2812B y reproduce una animación de estrella o copo de nieve.
Errores comunes y cómo solucionarlos
| Síntoma | Causa probable | Solución |
|---|---|---|
| No se enciende ningún LED | Los datos están en el extremo DOUT o el GND no es común | Mira el sentido de la flecha y conecta al extremo DIN; une los GND de la placa y de la fuente |
| Los primeros LED parpadean, colores aleatorios | Señal de datos débil, nivel de 3,3 V, cable de datos largo | Acerca la resistencia de 330 Ω a la tira, acorta el cable de datos, usa un 74AHCT125 |
| Colores equivocados (verde en lugar de rojo) | Orden de colores incorrecto | Usa GRB en FastLED y NEO_GRB en NeoPixel; algunas tiras tienen orden RGB |
| El final de la tira se ve amarillento y apagado | Caída de tensión | Haz inyección de alimentación en el centro y el final, usa cable más grueso |
| La placa se reinicia al pasar a blanco | Fuente insuficiente, picos de corriente | Usa una fuente mayor, baja el límite MAX_MA, añade el condensador de 1000 µF |
| Con una pulsación del botón salta dos modos | Rebote del botón | Sube el tiempo antirrebote de 50 ms a 80 ms, mantén cortos los cables del botón |
| En la Pico el efecto va lento | Demasiados LED y cálculos en Python | Reduce NUM_LEDS, aumenta el tiempo de fotograma o pasa a C++ con el IDE de Arduino |
Con unos metros de tira LED, un solo botón y una fuente de 5 V bien dimensionada, tu árbol de Navidad se convierte en un espectáculo de luz programable que puedes renovar cada año con efectos nuevos. Puedes diseñar tus propios efectos jugando con las paletas de colores y los tiempos de fotograma, y si te quedan dudas sobre alimentación y conexiones, vuelve a la guía de alimentación de Arduino. En la app de BlueGrays encontrarás, con esquemas de circuito y código paso a paso, proyectos con WS2812B como luces en movimiento, coche fantástico, luces de policía y animaciones, además del control de tiras NeoPixel con ESP32.
Preguntas frecuentes
¿Cuántos LED necesito para un árbol de Navidad?
Para un árbol de 1,5–1,8 m, entre 150 y 300 LED, es decir, una tira de 5 m con 30 LED/m o de 2,5–5 m con 60 LED/m, da un aspecto lleno y vivo. Con menos LED también funciona, pero los efectos se ven espaciados. A medida que aumenta el número de LED, debes tener en cuenta también la corriente de la fuente y la RAM de la placa (3 bytes por LED).
¿De cuántos amperios debe ser la fuente para una tira LED WS2812B?
Cada LED consume unos 60 mA en blanco total; para 100 LED el peor caso es de 6 A. En efectos de colores la corriente real queda en torno a un tercio de eso, así que para 100 LED basta una fuente de 5 V 4 A, siempre que limites la corriente a 3200 mA con la función setMaxPowerInVoltsAndMilliamps de FastLED. Si vas a usar blanco total durante mucho tiempo, elige la fuente según el peor caso.
¿Funciona una tira WS2812B a 12 V?
No, la WS2812B es una tira de 5 V y conectarla a 12 V estropea los LED al instante. Si quieres una tira direccionable que funcione a 12 V, elige el tipo WS2811 o WS2815. Si quieres usar una fuente de 12 V que ya tengas para una tira pequeña, puedes obtener 5 V con un reductor de tensión como el LM2596, pero estos módulos están limitados a unos 2–3 A.
¿Debo usar FastLED o Adafruit NeoPixel?
Las dos manejan el WS2812B sin problemas. FastLED facilita escribir efectos con sus funciones de arcoíris, paletas de color, atenuación y limitación de corriente, y suele ser más rápida. Adafruit NeoPixel ofrece una API más sencilla; si estás empezando, una buena forma es comenzar con una y luego probar la otra.
¿Cuántos LED WS2812B se pueden controlar como máximo con un Arduino Uno?
El límite lo marcan la RAM y la velocidad. Como cada LED ocupa 3 bytes en los 2 KB de RAM del Uno, en la práctica el límite ronda los 500 LED junto con las demás variables. Además, como enviar los datos de cada LED tarda 30 µs, con 1000 LED un solo fotograma llega a 30 ms. En el ESP32 y la Pico hay mucha RAM, así que son posibles miles de LED; el verdadero límite pasa a ser la fuente de alimentación.
¿Por qué el final de la tira LED se ve amarillo o apagado?
Es señal de caída de tensión. Las finas pistas de cobre de la tira hacen caer la tensión a medida que aumenta la corriente; los LED del final, por debajo de 4 V, producen poco azul y verde y el blanco tira a amarillo. Lo solucionas tirando cables de 5V y GND independientes desde la fuente hasta el centro y el final de la tira y bajando un poco el brillo.
Proyectos para hacer después de leer esto
Ver todos los proyectos
Uso de la tira LED WS2812B
Conoces una tira LED inteligente en la que puedes dar color a cada luz por separado. El Arduino enciende primero los cinco primeros LED en rojo, un segundo después los otros cinco en azul, luego los a

Luces de policía con WS2812B
Traes a tu escritorio las luces roja y azul del techo de un coche de policía. Una mitad de una tira WS2812B de diez LED destella en rojo tres veces muy rápido, la otra mitad destella en azul tres vece

Luz secuencial con WS2812B
En una tira de diez LED, un punto de luz verde avanza de principio a fin, LED a LED, y al llegar al final vuelve al comienzo; se queda un tercio de segundo en cada LED. En una tira WS2812B controlas c

Luz secuencial con WS2812B (efecto llenado)
Una tira de luz que se llena y se vacía como un vaso de agua. El Arduino enciende diez LED de color uno a uno en naranja y los deja encendidos; cuando la tira está llena, los apaga uno a uno en el mis

Efecto coche fantástico con WS2812B
Un punto de luz roja recorre una tira LED inteligente de un extremo al otro y vuelve, en un vaivén que nunca se detiene. En cada paso el Arduino enciende un solo LED, espera una décima de segundo y pa

WS2812B Animación 1
En una tira de 56 LED, todos los colores del arcoíris se colocan uno junto a otro y fluyen sin detenerse nunca, como si un río de luz se deslizara por la tira. Cada LED brilla con un color un poco dis

WS2812B Animación 2
Monta en tu habitación un espectáculo de luz que cambia de color solo. El Arduino hace fluir los colores sin parar por una tira de 30 LED y cada pocos segundos pasa a una nueva gama: arcoíris, rayas m

Control de la tira NeoPixel WS2812B con ESP32
Los LED direccionables WS2812B (NeoPixel) son LED RGB inteligentes que se pueden controlar en cadena a través de un único pin de datos. En este proyecto, controlaremos una tira de 8 LED WS2812B con la biblioteca Adafruit_NeoPixel para crear una animación fluida de arcoíris. Aunque el nivel lógico de 3,3 V del ESP32 funciona sin problemas en la mayoría de los componentes WS2812B, mostraremos la solución de una resistencia en serie de 470 Ω y un condensador de 1000 µF en caso de inestabilidad. La
Más artículos
App BlueGrays
Monta este circuito paso a paso en tu teléfono
Esquema, código y lista de piezas en una sola pantalla. Más de 200 proyectos de Arduino, ESP32 y Pico listos para montar.
Escanea con tu teléfono
Apunta la cámara al código y se abrirá la tienda de apps de tu teléfono.
o ábrela en la tienda

