Componentes · 7 min de lectura

Tira LED WS2812B NeoPixel con Arduino: guía de LED RGB direccionables

¿Qué es un WS2812B NeoPixel y cómo se conecta? Tiras, anillos y matrices de LED RGB direccionables, cálculo de potencia, código con Adafruit NeoPixel y FastLED, efecto arcoíris, ESP32 y Pico.

El WS2812B es un LED RGB que lleva su propio chip controlador integrado. Mientras que un LED RGB normal necesita un pin para cada color, con el WS2812B controlas cientos de LED con un solo cable de datos y das a cada uno su propio color y brillo. NeoPixel es el nombre que Adafruit da a esta familia de LED direccionables. Se venden en tiras, anillos, barras y matrices, y se usan en un sinfín de proyectos, desde iluminación ambiental y relojes LED hasta juegos y lámparas de notificación.

Tramo de tira LED RGB direccionable WS2812B
Un tramo de tira WS2812B: los datos entran por la entrada DI de la izquierda y pasan al siguiente LED por la salida DO de la derecha. La flecha indica el sentido de los datos.

¿Cómo funciona el WS2812B?

Dentro de la cápsula de 5x5 mm de cada WS2812B hay tres LED diminutos, rojo, verde y azul, y un minúsculo chip que los controla. Arduino envía por la línea de datos, uno tras otro, paquetes de color de 24 bits: 8 bits de verde, 8 de rojo y 8 de azul (orden GRB). El primer LED se queda con los primeros 24 bits y pasa el resto al siguiente LED por su pin DO; todos los LED hacen lo mismo. Cuando la línea de datos se queda en LOW al menos 50 microsegundos (280 en las versiones nuevas), todos los LED muestran su color a la vez. Con 256 niveles por color, un solo LED puede mostrar 16,7 millones de colores.

CaracterísticaValor
Tensión de alimentación5 V (3,5–5,3 V)
Corriente por LEDHasta ~60 mA (blanco total), ~1 mA apagado
Velocidad de datos800 kHz, un solo cable
Orden de coloresGRB (verde, rojo, azul)
Profundidad de color24 bits, 16,7 millones de colores
Encapsulado5050 SMD (5x5 mm)

Tiras, anillos y matrices

TipoNúmero de LEDUso típico
Tira30, 60 o 144 por metroIluminación ambiental, detrás de la TV, estanterías
Anillo8, 12, 16, 24Reloj LED, indicador, lámpara de mesa
Matriz8x8 = 64, 16x16 = 256Texto en movimiento, animaciones, juegos de píxeles
Barra (stick)8Indicador de nivel, luz de estado
Anillo NeoPixel WS2812B de 24 LED
Anillo NeoPixel de 24 LED: ideal para relojes LED e indicadores circulares; en una esfera de 12 horas, cada LED marca media hora.

Conexión del WS2812B

El WS2812B tiene tres conexiones: 5V, GND y DIN (entrada de datos). Las flechas de la tira indican hacia dónde van los datos; conecta siempre Arduino al extremo donde empiezan las flechas, el lado DIN. Añadir una resistencia de 330–470 Ω en serie con la línea de datos y un condensador de 1000 µF entre 5V y GND en la entrada de alimentación de la tira protege al primer LED de picos de tensión repentinos.

Pin del WS2812BConexión
5V5V de Arduino para pocos LED, un adaptador externo de 5 V para más
GNDGND (con un adaptador externo, la masa debe ser común con Arduino)
DIND6 (a través de una resistencia de 330 Ω)
DOUTDIN del siguiente LED o tira
No alimentes muchos LED desde el pin 5V de Arduino: el USB da como máximo 500 mA, y un solo LED puede consumir 60 mA en blanco total. Alimenta la tira con un adaptador externo de 5 V, une siempre el GND del adaptador con el GND de Arduino y, con el circuito encendido, nunca conectes el cable de datos antes que el GND: el primer LED podría estropearse.

Cálculo de potencia: ¿cuántos amperios necesitas?

La fórmula para el peor caso es sencilla: número de LED × 60 mA. En las animaciones es raro que todos los LED estén en blanco total a la vez; en la práctica se ve una media de unos 20 mA por LED. Aun así, conviene elegir el adaptador para el peor caso o limitar el brillo por software. Para calcular la potencia en vatios usa la herramienta Ley de Ohm, y para estimar cuánto dura un proyecto con batería, la herramienta Duración de batería.

Número de LEDPeor caso (blanco total)Alimentación recomendada
80,48 ABasta con USB (brillo limitado)
301,8 AAdaptador de 5 V 3 A
603,6 AAdaptador de 5 V 4 A
1448,6 AAdaptador de 5 V 10 A
En las tiras largas, las finas pistas de cobre pierden tensión y el final de la tira se ve amarillento o rojizo. Para evitarlo, vuelve a llevar 5V y GND desde el adaptador a la tira cada 1–2 metros (inyección de alimentación). Bajar el brillo al 20–30 % también reduce mucho la corriente sin que el ojo note una gran diferencia.

Primer código con la librería Adafruit NeoPixel

En el Gestor de librerías busca Adafruit NeoPixel e instálala. El código siguiente «barre» la tira con un color encendiendo los LED uno a uno en rojo, verde y azul:

Arduino (C++)
1#include <Adafruit_NeoPixel.h>
2
3#define PIN 6          // DIN pini / data pin
4#define NUM_LEDS 8     // LED sayısı / number of LEDs
5
6Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
7
8void setup() {
9  strip.begin();
10  strip.setBrightness(50);   // 0–255, yalnız bir kez / only once
11  strip.show();              // hepsini söndür / all off
12}
13
14void colorWipe(uint32_t color, int wait) {
15  for (int i = 0; i < NUM_LEDS; i++) {
16    strip.setPixelColor(i, color);
17    strip.show();            // değişikliği gönder / send the change
18    delay(wait);
19  }
20}
21
22void loop() {
23  colorWipe(strip.Color(255, 0, 0), 80);   // kırmızı / red
24  colorWipe(strip.Color(0, 255, 0), 80);   // yeşil / green
25  colorWipe(strip.Color(0, 0, 255), 80);   // mavi / blue
26}

setPixelColor() solo cambia el color en la memoria; para que los LED se enciendan de verdad tienes que llamar a show(). Así puedes ajustar el color de todos los LED y mostrarlos de una sola vez. Como setBrightness() escala los datos de color de forma permanente, lo mejor es llamarla una vez en setup() en lugar de cambiarla continuamente en loop(). Cada LED ocupa 3 bytes de la RAM de Arduino; los 2 KB del Uno se llenan rápido con cientos de LED.

Efecto arcoíris: colores HSV

En lugar de ajustar los colores con valores de rojo, verde y azul, usar HSV (tono, saturación, brillo) hace los efectos mucho más fáciles: recorres todo el círculo cromático cambiando solo el tono. En la librería de Adafruit el tono va de 0 a 65535. gamma32() corrige los colores según cómo los percibe el ojo, para que las transiciones parezcan más naturales:

Arduino (C++)
1#include <Adafruit_NeoPixel.h>
2
3#define PIN 6
4#define NUM_LEDS 24
5
6Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
7
8void setup() {
9  strip.begin();
10  strip.setBrightness(40);
11}
12
13void loop() {
14  for (long first = 0; first < 65536; first += 256) {
15    for (int i = 0; i < NUM_LEDS; i++) {
16      uint16_t hue = first + i * 65536L / NUM_LEDS;   // her LED'e farklı ton / a different hue per LED
17      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue)));
18    }
19    strip.show();
20    delay(10);
21  }
22}

La librería FastLED

Para efectos más avanzados, la librería FastLED también es muy popular. Guarda los LED en un array CRGB, ofrece órdenes muy legibles como leds[3] = CRGB::Red; y usa un rango de tono de 0 a 255. Sus funciones listas para usar, como fill_rainbow() y fadeToBlackBy(), te permiten escribir efectos de fuego, estrella fugaz o respiración en pocas líneas. Una de sus funciones más prácticas es FastLED.setMaxPowerInVoltsAndMilliamps(5, 2000);: la librería baja el brillo automáticamente para mantener la corriente por debajo de 2 A.

Usar una matriz NeoPixel de 8x8

Una matriz no es más que una tira larga: 64 LED encadenados uno tras otro en una sola línea de datos. En la mayoría de las matrices las filas van en zigzag (serpentina): las filas pares de izquierda a derecha y las impares de derecha a izquierda. Por eso, para convertir una coordenada x, y en un número de LED se usa y × 8 + x en las filas pares e y × 8 + (7 − x) en las impares. Como 64 LED pueden consumir 3,8 A en blanco total, mantener el brillo bajo es especialmente importante en las matrices.

Matriz LED NeoPixel WS2812B de 8x8
Matriz NeoPixel de 8x8: 64 LED direccionables controlados con una sola línea de datos; ideal para texto en movimiento y juegos de píxeles.

WS2812B con el ESP32 y la Raspberry Pi Pico

Las librerías Adafruit NeoPixel y FastLED también funcionan en el ESP32; gracias al Wi-Fi es muy fácil controlar los LED desde el móvil o hacer una lámpara que cambie de color según el tiempo. Lo que hay que vigilar es el nivel de tensión: un WS2812B alimentado a 5 V espera al menos 3,5 V en su entrada de datos, mientras que el ESP32 y la Pico dan 3,3 V. La mayoría de las tiras funcionan igualmente, pero si el primer LED parpadea o aparecen colores aleatorios, añade a la línea de datos un convertidor de nivel como el 74AHCT125. En la Raspberry Pi Pico, MicroPython ya trae el módulo neopixel:

MicroPython
1from machine import Pin
2import neopixel
3import time
4
5NUM = 8
6np = neopixel.NeoPixel(Pin(0), NUM)      # GP0 → DIN
7
8def wheel(pos):                          # 0–255 → renk çemberi / colour wheel
9    if pos < 85:
10        return (255 - pos * 3, pos * 3, 0)
11    if pos < 170:
12        pos -= 85
13        return (0, 255 - pos * 3, pos * 3)
14    pos -= 170
15    return (pos * 3, 0, 255 - pos * 3)
16
17j = 0
18while True:
19    for i in range(NUM):
20        r, g, b = wheel((i * 256 // NUM + j) & 255)
21        np[i] = (r // 5, g // 5, b // 5)  # parlaklığı düşür / dim it
22    np.write()
23    j = (j + 2) & 255
24    time.sleep_ms(20)

Ideas de proyectos con WS2812B

  • Luz ambiental para la TV: pega una tira detrás del televisor para dar a la habitación un brillo suave.
  • Reloj NeoPixel: muestra horas, minutos y segundos en colores distintos en un anillo de 60 LED.
  • Vúmetro: con un módulo de micrófono, haz una barra de LED que suba con el volumen de la música.
  • Lámpara de notificaciones: cambia de color con el ESP32 según el tiempo o los correos que lleguen por internet.
  • Luces de policía y Knight Rider: programa destellos rojo-azul o una luz que va y viene.
  • Juego de la serpiente: recrea el clásico juego de la serpiente con una matriz de 8x8 y un joystick.

Errores comunes y cómo solucionarlos

  • No se enciende ningún LED: Arduino está conectado al extremo equivocado de la tira, el lado DOUT; fíjate en las flechas y usa el extremo DIN.
  • Los colores salen cambiados (verde en vez de rojo): el orden de colores es incorrecto; usa NEO_GRB en el código, aunque algunas tiras necesitan NEO_RGB.
  • El primer LED parpadea o muestra colores aleatorios: falta la resistencia en serie, la masa no es común o la señal de datos de 3,3 V no basta.
  • El final de la tira se ve amarillento: hay caída de tensión; alimenta la tira en varios puntos o baja el brillo.
  • Arduino se reinicia al encenderse los LED: se está consumiendo demasiada corriente del USB; usa un adaptador externo y un condensador de 1000 µF.
  • Solo se encienden los primeros LED: el valor NUM_LEDS del código es menor que el número real de LED, o hay una conexión rota en algún punto de la tira.

El WS2812B es un punto de partida estupendo para entender cómo se mezclan los colores; la lógica del color la tienes en Cómo usar un LED RGB y el control del brillo en ¿Qué es PWM? En la app BlueGrays encontrarás proyectos de uso del WS2812B, luces de policía, LED secuenciales, efecto Knight Rider, animaciones y control de tiras NeoPixel con el ESP32, con esquemas y código.

Preguntas frecuentes

¿Qué diferencia hay entre WS2812B y NeoPixel?

NeoPixel es la marca que usa Adafruit para LED direccionables como el WS2812, el WS2812B y el SK6812. Todos usan el mismo protocolo de datos, así que se controlan igual y con las mismas librerías.

¿Cuántos WS2812B puedo conectar a un Arduino?

En cuanto a datos no hay un límite fijo, pero te limitan tres cosas: la RAM (3 bytes por LED, unos cientos de LED en la práctica en un Uno), el tiempo de refresco (30 microsegundos por LED; 1000 LED tardan unos 30 ms, unos 33 fotogramas por segundo) y la fuente de alimentación.

¿Puedo alimentar el WS2812B desde el pin 5V de Arduino?

Solo unos pocos LED con poco brillo; por ejemplo, una barra de 8 LED funciona por USB con un brillo de unos 50. Para más LED usa un adaptador externo de 5 V y une las masas.

¿Son imprescindibles la resistencia y el condensador?

No son obligatorios, pero sí muy recomendables. La resistencia de 330–470 Ω en la línea de datos suaviza los picos de la señal y protege al primer LED, y el condensador de 1000 µF en la entrada de alimentación absorbe el pico de corriente al conectar la alimentación.

¿Funciona el WS2812B con el ESP32 y placas de 3,3 V?

Casi siempre, pero no está garantizado: un WS2812B alimentado a 5 V espera al menos 3,5 V en su entrada de datos. Si ves parpadeos o colores incorrectos, sube la señal de datos a 5 V con un convertidor de nivel como el 74AHCT125.

¿Qué diferencias hay entre WS2812B, WS2811, WS2813 y SK6812?

El WS2811 es un chip controlador aparte y en las tiras de 12 V suele controlar tres LED juntos. El WS2813 tiene una línea de datos de reserva, de modo que la cadena sigue funcionando aunque falle un LED. El SK6812 es una alternativa compatible y también existe en versión RGBW con LED blanco; para ella se usa NEO_GRBW en el código.

Ver todos los proyectos
Uso de la tira LED WS2812B
#69Intermedio
Premium

Uso de la tira LED WS2812B

Proyecto que demuestra el uso básico de la tira de LED direccionable WS2812B ajustando el color de cada LED de forma independiente. Enseña el control del color basado en píxeles con la librería FastLE

4.8(54)
70
Luces de policía con WS2812B
#70Intermedio
Premium

Luces de policía con WS2812B

Proyecto que crea un efecto estroboscópico de policía mediante el parpadeo rápido de colores rojo y azul con tira de LED WS2812B. Enseña el control de LED basado en grupos y la lógica de temporización

4.8(67)
86
Luz secuencial con WS2812B
#71Intermedio
Premium

Luz secuencial con WS2812B

Un proyecto que crea un efecto de luz secuencial moviendo un único LED secuencialmente hacia delante en una tira de LED WS2812B. Enseña la lógica de animación secuencial basada en píxeles.

4.8(58)
75
Luz secuencial con WS2812B (efecto llenado)
#72Intermedio
Premium

Luz secuencial con WS2812B (efecto llenado)

Un proyecto de animación de llenado y drenaje que acumula LEDs en una tira de LED WS2812B encendiéndolos secuencialmente, y luego apagándolos secuencialmente. Enseña la lógica de la animación LED acum

4.7(50)
65
Efecto coche fantástico con WS2812B
#73Intermedio
Premium

Efecto coche fantástico con WS2812B

Proyecto para crear un efecto coche fantástico (Knight Rider) moviendo un solo LED hacia adelante y hacia atrás en la tira de LED WS2812B. Enseña la animación bidireccional de píxeles.

4.9(73)
94
WS2812B Trueno negro 3 piezas
#74Intermedio
Premium

WS2812B Trueno negro 3 piezas

Proyecto para crear una animación de transición de color de arco iris que cambia continuamente en una tira de LED WS2812B utilizando el espacio de color HSV. Enseña el uso del modelo de color CHSV y l

4.8(61)
79
WS2812B Animación 1
#75Intermedio
Premium

WS2812B Animación 1

Proyecto que crea una animación de arco iris de desplazamiento continuo con espacio de color HSV en tira de LED WS2812B. Enseña la lógica de la transición suave del color cambiando el valor del tono e

4.9(69)
89
WS2812B Animación 2
#76Intermedio
Premium

WS2812B Animación 2

Proyecto de animación avanzada con sistema de paleta FastLED en tira de LED WS2812B, que cambia automáticamente diferentes paletas de colores como arco iris, nube, fiesta, etc. en función del tiempo.

4.8(65)
84
Control de la tira NeoPixel WS2812B con ESP32
#126Intermedio
Premium

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

4.9(19)
30

Aprende paso a paso a controlar cientos de LED RGB con un solo cable de datos, a conectar bien una tira WS2812B, a calcular cuánta corriente necesita y a programar efectos arcoíris.