Una tira de LEDs RGB puede convertir un mueble, una repisa o el borde de tu monitor en algo que reacciona a la música, marca la hora o simplemente pinta la pared del color que quieras. Y lo mejor: con los LEDs direccionables WS2812B (los famosos "Neopixel") controlas decenas de luces, cada una con su propio color, usando un solo pin del ESP32.

En esta guía vas a aprender a conectar una tira o anillo WS2812B al ESP32 y a programar cuatro efectos con la librería FastLED: colores individuales, color uniforme, un efecto de barrido y un arcoíris animado. Al final vas a entender no solo cómo se usan, sino por qué funcionan como funcionan.

Qué tienen de especial los WS2812B

A diferencia de un LED RGB común (que necesita tres pines, uno por color), cada LED WS2812B trae un chip controlador integrado dentro del propio encapsulado. Ese chip lee los datos que le llegan, se queda con la parte que le corresponde y reenvía el resto al siguiente LED por su pin DOUT. Así se encadenan en serie y se manejan todos por una sola línea de datos.

LEDs WS2812B conectados en serie

El detalle técnico que importa: el protocolo es de temporización muy estricta (pulsos de cientos de nanosegundos definen un 0 o un 1). Por eso no basta con "poner un pin en alto"; se necesita una librería que genere esos pulsos con precisión. Aquí es donde entra FastLED. Otro punto: la mayoría de estos LEDs esperan los datos en orden GRB, no RGB, algo que verás reflejado en el código.

El presupuesto de energía (no lo saltes)

Cada LED a brillo máximo en blanco consume cerca de 50mA a 5V. Multiplica: 30 LEDs pueden pedir hasta 1.5A. Para tiras largas necesitas una fuente externa de 5V dedicada, y en ese caso hay una regla de oro: conecta siempre el GND de la fuente externa al GND del ESP32, o los datos no tendrán referencia común y verás parpadeos y colores erráticos.

En este tutorial controlamos solo 8 LEDs, así que no hace falta fuente externa: los alimentamos desde el pin VIN del ESP32.

Conexiones

Diagrama de conexión del WS2812B al ESP32

Cablear el WS2812B al ESP32 es simple porque solo usa un pin de datos (DIN):

WS2812B ESP32
GND GND
DIN GPIO2 (o cualquier GPIO digital)
4-7 VDC VIN (5V)

Componentes necesarios: ESP32, tira WS2812B y jumpers

Necesitas una placa ESP32, una tira/anillo/stick WS2812B y algunos cables jumper. En nuestro ejemplo usamos un stick de 8 LEDs.

Instalar la librería FastLED

Instalación de la librería FastLED en el Administrador de Librerías de Arduino IDE

Abre el Administrador de Librerías del Arduino IDE, busca FastLED e instala la versión de Daniel Garcia. Con eso ya puedes compilar los ejemplos.

Ejemplo 1: controlar cada LED por separado

Este código asigna un color distinto a cada uno de los 8 LEDs, uno tras otro. Cárgalo a tu placa y funcionará de inmediato.

C++
/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>

#define NUM_LEDS     8
#define DIN_PIN      2
#define BRIGHTNESS   80   // Brightness (0-255)
#define DELAY_MS     500

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);   
  FastLED.clear();
}

void loop() {
  leds[0] = CRGB(255, 0, 0);     // Red » (R=255, G=0, B=0)
  FastLED.show();
  delay(DELAY_MS);

  leds[1] = CRGB(0, 255, 0);     // Green » (R=0, G=255, B=0)
  FastLED.show();
  delay(DELAY_MS);

  leds[2] = CRGB(0, 0, 255);     // Blue » (R=0, G=0, B=255)
  FastLED.show();
  delay(DELAY_MS);

  leds[3] = CRGB(255, 165, 0);   // Orange » (R=255, G=165, B=0)
  FastLED.show();
  delay(DELAY_MS);

  leds[4] = CRGB(128, 0, 128);   // Purple » (R=128, G=0, B=128)
  FastLED.show();
  delay(DELAY_MS);

  leds[5] = CRGB(255, 255, 0);   // Yellow » (R=255, G=255, B=0)
  FastLED.show();
  delay(DELAY_MS);
  
  leds[6] = CRGB(255, 255, 255); // White » (R=255, G=255, B=255)
  FastLED.show();
  delay(DELAY_MS);

  leds[7] = CRGB(0, 0, 0);       // Off/Black » (R=0, G=0, B=0)
  FastLED.show();
  delay(DELAY_MS);

  FastLED.clear();
  delay(DELAY_MS);
}

Cada LED del WS2812B encendido con un color distinto

Cómo funciona. Primero se incluye #include <FastLED.h> y se define el arreglo CRGB leds[NUM_LEDS], que es donde FastLED guarda el color de cada LED. En el setup(), la línea clave es FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS): le dices el tipo de LED, el pin de datos y el orden de color GRB. Después, para cambiar un LED escribes su color en el arreglo (leds[0] = CRGB(255, 0, 0)) y recién al llamar a FastLED.show() los cambios llegan físicamente a las luces. Ese patrón. modificar el arreglo, luego show()— se repite en todos los ejemplos.

Ejemplo 2: el mismo color en todos los LEDs

Aquí aplicamos un color a toda la tira con un solo comando, usando fill_solid().

C++
/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>

#define NUM_LEDS     8
#define DIN_PIN      2
#define BRIGHTNESS   80   // Brightness (0-255)
#define DELAY_MS     500

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
}

void loop() {
  fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));     // Color » Red
  FastLED.show();
  delay(DELAY_MS);

  fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0));     // Color » Green
  FastLED.show();
  delay(DELAY_MS);

  fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));     // Color » Blue
  FastLED.show();
  delay(DELAY_MS);

  fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255)); // Color » White
  FastLED.show();
  delay(DELAY_MS);
}

Todos los LEDs WS2812B encendidos en azul

La función fill_solid(leds, NUM_LEDS, CRGB(...)) recibe el arreglo, la cantidad de LEDs y el color a aplicar. Es la forma más limpia de pintar toda la tira de un color de una sola vez.

Ejemplo 3: efecto de barrido (chase)

Este efecto enciende un LED a la vez que "corre" a lo largo de la tira mientras los demás quedan apagados, primero en un sentido y luego en el otro.

C++
/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>

#define NUM_LEDS     8
#define DIN_PIN      2
#define BRIGHTNESS   80   // Brightness (0-255)
#define DELAY_MS     50   // Chase effect speed

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
}

void loop() {
  // Chase effect from left to right
  for (int i = 0; i < NUM_LEDS; i++) {
    FastLED.clear();            // Clear LEDs
    leds[i] = CRGB(0, 0, 255);  // Light current position
    FastLED.show();
    delay(DELAY_MS);            // Chase effect speed
  }
  // Reverse the chase effect direction
  for (int i = NUM_LEDS - 1; i >= 0; i--) { 
    FastLED.clear();
    leds[i] = CRGB(0, 0, 255);
    FastLED.show();
    delay(DELAY_MS);
  }
}

Efecto de barrido en la tira WS2812B

La lógica es simple: en cada paso se hace FastLED.clear(), se enciende el LED de la posición actual y se llama a show() con un pequeño delay. El primer for recorre de izquierda a derecha y el segundo invierte la dirección.

Ejemplo 4: efecto arcoíris animado

El último ejemplo genera un arcoíris que se desliza suavemente por toda la tira.

C++
/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.  
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>

#define NUM_LEDS     8
#define DIN_PIN      2
#define SATURATION   255   // Saturarion (0-255)
#define BRIGHTNESS   255   // Brightness (0-255)
#define DELAY_MS     20 

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
}

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    // Set LED i to a moving rainbow color effect: i*10 creates color spread across LEDs
    // millis()/20 makes the rainbow slowly animate over time with full saturation and full brightness
    leds[i] = CHSV(i * 10 + millis() / 20, SATURATION, BRIGHTNESS);
  }
  FastLED.show();
  delay(DELAY_MS);
}

Efecto arcoíris animado en los LEDs WS2812B

La clave está en CHSV(i * 10 + millis() / 20, SATURATION, BRIGHTNESS), que usa el modelo de color HSV (matiz, saturación, valor). El término i * 10 reparte el matiz entre los LEDs para crear el degradado, y millis() / 20 agrega un desplazamiento en el tiempo que hace que el arcoíris se anime solo.

Variantes y mejoras

Ideas para llevar esto más allá de lo que muestra el tutorial original:

  • Control por navegador con un servidor web: el ESP32 puede levantar un servidor web con botones para cambiar color y efecto desde el celular o el PC, sin recompilar. Es la evolución natural: pasas de efectos fijos a una lámpara RGB controlable por WiFi desde cualquier dispositivo de tu casa.
  • Luces reactivas al sonido: agregando un módulo de micrófono puedes hacer que la tira "baile" con la música, mapeando el nivel de audio a brillo o a la cantidad de LEDs encendidos.
  • Tiras más largas con fuente externa: si escalas a una tira de metros, agrega una fuente de 5V/2A o más, inyecta alimentación cada cierta cantidad de LEDs y no olvides unir las tierras.

Personalización para Chile

En Chile consigues todo con stock local en MechatronicStore:

  • Placa ESP32 WROOM-32 (SKU X2-10V2). $7.990 CLP
  • Módulo/Stick WS2812B RGB de 8 bits (SKU GN3-11). $1.990 CLP (el stick de 8 LEDs que usamos en los ejemplos)
  • Cinta LED WS2812B 5V 5 metros (SKU G-599). $23.990 CLP (para proyectos de iluminación más grandes)
  • Cables macho hembra 30cm (SKU C-418). $1.990 CLP

Si el tutorial original enlaza a tiendas extranjeras, acá tienes los equivalentes exactos: el mismo LED WS2812B, ya sea en formato stick, anillo o cinta, funciona con el código tal cual. Para tiras largas, MechatronicStore también tiene fuentes de 5V.

Recursos

Versión chilena con componentes en stock local en MechatronicStore, inspirada en la guía de Random Nerd Tutorials.