Conectar y controlar LEDs WS2812B a ESP8266 con ESP Easy

Última modificación el 27 mayo, 2021

¿Quieres conectar LEDs WS2812 a un ESP8266 con ESP Easy? En este tutorial te voy a enseñar a hacerlo fácilmente.

Los LEDs WS2812 (también llamados NeoPixels) son fantásticos y nos dan unas posibilidades y una flexibilidad increíble.

Los WS2812 se presentan tanto de forma individual como en tiras, pero mientras que una tira normal RGB se enciende toda a la vez de un color, en este caso podemos controlar cada LED independientemente.

Son LEDs que podemos conectar el paralelo, uniendo tantos como queramos con solo tres cables y la gran ventaja es que los podemos controlar de uno en uno. Podemos encender unos y apagar otros, poner cado uno del color que queramos y regular su intensidad independientemente.

Estos LEDs son de los llamados RGB porque cada uno de ellos tiene los tres colores básicos (rojo, verde y azul). Lo que quiere decir que podemos conseguir muchísimos colores combinando esos tres colores básicos (incluso el blanco, si encendemos los tres colores juntos con la misma intensidad).

Además, se alimentan a 5 voltios, lo que facilita mucho los montajes, al no necesitar fuentes de alimentación adicionales. Podemos utilizar la misma alimentación de un NodeMCU o Wemos D1 Mini o poner un cargador de móvil independiente para alimentarlos (u otra fuente de alimentación mayor si hay muchos LEDs).

Solamente tienes que tener en cuenta una cosa: cada color de cada led, encendido al 100% consume 20mA. Cada LED tiene tres colores. Esto significa que un LED puede consumir 60mA si encendemos sus tres colores a máxima potencia al mismo tiempo.

Si ponemos una tira de 10 LEDs WS2812 consumirá un máximo de 600mA. Tenlo en cuenta a la hora de pensar en el alimentador que usarás.

Los alimentadores de móvil suelen proporcionar entre 500 y 2000mA, mira de cuanto es el tuyo y calcula cuántos LEDs puedes conectar a tu alimentador para no exceder su capacidad.

Diagrama con las conexiones del NodeMCU a los LEDs WS2812 (Neopixel)

Como te decía, la conexión no puede ser más fácil. ¡Solamente tres cables y a funcionar!

En el ejemplo he utilizado tres LED WS2812B pero, una de las grandes ventajas de este tipo de LED, es que puedes utilizar los que quieras. Eso sí, ten en cuenta el consumo, cada LED puede consumir hasta 60 mA.

Configuración ESPEasy

Una vez que tengas hechas las conexiones, tienes que configurar el ESPEasy para que reconozca los dispositivos e incluir unas sencillas reglas para que se comporten de la forma que queramos.

A lo mejor también te interesa:  Medidor de CO2 con ESP8266 (NodeMCU) y sensor Senseair S8

Te voy a poner como ejemplo el medidor de CO₂ casero de eMariete, pero puedes utilizarlo exactamente igual con cualquier otro proyecto.

Básicamente, tendremos que hacer lo siguiente:

  1. Activar el motor de reglas de ESPEasy
  2. Añadir una regla para que cuando se encienda el ESP8266 lo haga con los LEDS apagados
  3. Añadir una regla para que cambie el color de los LEDS dependiendo del nivel de CO2

No es necesario que des de alta los LEDs como dispositivo en la pestaña “Devices”.

Activar el motor de reglas de ESPEasy

Lo primero que debes hacer, es activar el motor de reglas de ESPEasy, si no lo has hecho ya.

Para ello, vete a la pestaña “Tools” (Herramientas) y pulsa el botón “Advanced” (Avanzado):

Se abrirá la ventana con las opciones de configuración avanzadas de ESPEasy.

Allí debes activar las opciones “Rules” (Reglas) y “Old Engine” (Viejo Motor):

Añadir una regla para que cuando se encienda lo haga con los LEDS apagados

Ahora tienes que escribir las reglas, en la pestaña “Rules” (Reglas). Esta pestaña no aparecerá hasta que no habilites el motor de reglas, como has visto en el punto anterior:

En el editor de reglas que aparece en ESPEasy, escribes las siguientes reglas (te recomiendo copiar y pegar, para evitar errores y dejar los comentarios – líneas que empiezan por // – que ESPEasy ignorará).

Deberás sustituir Senseair#PPM por el nombre de dispositivo y valor que hayas elegido (en la pestaña “Devices” – Dispositivos). En esta captura de pantalla el nombre del dispositivo es CO2, por lo que en vez de Senseair#PPM escribiríamos CO2#PPM:

On System#Boot do
  NeoPixelAll,0,0,0 // LEDS APAGADOS
EndOn

La línea NeoPixelAll,0,0,0 ordena a ESPEasy que apague todos los LEDS.

Realmente lo que le dice esta línea es que ponga el Rojo a 0, el Verde a 0 y el Azul a 0.

Al estar la línea NeoPixelAll,0,0,0 entre “un bloque“, formado por la línea On System#Boot do y EndOn, le indicamos a ESPEasy que lo ejecute al arrancar el NodeMCU (cualquier cosa que metas dentro de ese bloque se ejecutará cada vez que el NodeMCU se encienda).

Añadir una regla para que cambie el color de los LEDS dependiendo del nivel de CO2

Ahora añade este otro bloque a las reglas:

On SenseairCO2#PPM do
  if [SenseairCO2#PPM]>2000
    NeoPixelAll,32,0,0 // LEDS ROJO
  Elseif [SenseairCO2#PPM] > 1500
    NeoPixelAll,16,9,0 // LEDS NARANJA
  Else
    NeoPixelAll,0,32,0 // LEDS VERDE
  Endif
endon

Este bloque ordena a ESPEasy que cada vez que reciba un nuevo valor desde el sensor SenseairCO2 (On SenseairCO2#PPM do), compruebe lo siguiente:

si el valor de SenseairCO2#PPM es superior a 2000 y, de ser así, encienda todos los LEDs de la tira con los siguientes valores: Rojo a 32, el Verde a 0 y el Azul a 0.

si no se cumple lo anterior (que el valor de SenseairCO2#PPM sea superior a 2000), comprobará si el valor es superior a 1500 y, si se cumple, encienda todos los LEDs de la tira con los siguientes valores: Rojo a 16, el Verde a 9 y el Azul a 0 (un amarillo/naranja).

A lo mejor también te interesa:  Medidor de CO₂ con sensor MQ-135 (No te lo pierdas, no es lo que parece)

si no se cumple lo anterior (que el valor de SenseairCO2#PPM sea superior a 1500), y sin hacer más comprobaciones, encenderá todos los LEDs de la tira con los siguientes valores: Rojo a 0, el Verde a 32 y el Azul a 0.

la línea endon termina el bloque de comprobaciones que empezó con On SenseairCO2#PPM do.

El resultado final, debería ser similar a este:

Controlar el encendido y apagado de los LEDs con un interruptor (switch) y qué sean intermitentes y que se apaguen a ciertas horas y que, y que, y que…

Las posibilidades de las reglas de ESP-Easy son enormes, y nos permiten hacer casi cualquier cosa

¿Y si quisieras que el encendido de los LEDs fuera intermitente y que además estuvieran apagados entre determinadas horas, para que no molesten, por ejemplo, y además controlar con un interruptor (o un pulsador) que se enciendan o no (bonus: y que además si tenemos una pantalla OLED conectada también se apague?

Podríamos utilizar esta variación de las reglas del punto anterior en las que incluiríamos unos temporizadores para crear la intermitencia y algunas comprobaciones extras de las horas y de un Switch que conectaríamos (entre el pin D7 y GND, en este caso):

On Rules#Timer=1 do 
  if [Switch#State]=1 and [var#1]=0 // Si el switch está encendido y no es hora de dormir
    if [co2#co2]>1000
      NeoPixelAll,32,0,0 // LEDS ROJO
    Elseif [co2#co2]>750
      NeoPixelAll,16,9,0 // LEDS NARANJA
    Elseif [co2#co2]>400
      NeoPixelAll,0,32,0 // LEDS VERDE
    Else
      NeoPixelAll,0,0,0 // LEDS APAGADOS
    Endif
  Endif 
  looptimerset_ms,2,100 //encendido 100ms cada 2 seg
Endon

On rules#Timer=2 do
  NeoPixelAll,0,0,0 //led off
  looptimerset_ms,2,0
  timerset,1,2
endon

On System#Boot do
  NeoPixelAll,0,0,0 // LEDS APAGADOS
  Let,1,0 // Si está a 1 = hora de dormir, leds apagados!
  timerSet,1,2 //cambiar el 2 por 60seg y se encenderán los leds con la primera medida
EndOn

on Switch#State do
  if [Switch#State]=0
    oledframedcmd,display,off
    NeoPixelAll,0,0,0 // APAGAR LEDS
  else
    oledframedcmd,display,on
    Let,1,0 // Si está a 0 = no es hora de dormir, leds encendidos!
  endif
endon


on Clock#Time=All,22:00 do
  Let,1,1 // Si está a 1 = hora de dormir, leds apagados!
  NeoPixelAll,0,0,0
  oledframedcmd,display,off
endon

on Clock#Time=All,08:00 do
  Let,1,0 // Si está a 0 = no es hora de dormir, leds encendidos!
  oledframedcmd,display,on
endon

En este ejemplo, los LEDs y la pantalla OLED permanecerían apagados cada día desde las 22:00 hasta las 08:00.

Puedes “cancelar” ese tiempo de dormir apagando y volviendo a encender el apagado desde el interruptor.

Solamente te quedaría conectar el switch (en el pin D7 en este ejemplo, aunque podrías usar otros), añadirlo como un nuevo dispositivo de tipo “Switch”:

y configurarlo:

Si lo prefieres puedes utilizar un pulsador en vez de un interruptor. Solamente tendrías que cambiar el tipo de botón y decir que es un pulsador activo a nivel bajo (que se activa cuando se une el pin D7 a GND):

Muchas gracias al usuario Joselu70 por participar en el desarrollo de estas reglas. 😉

Añadir una regla para hacer un semáforo de LEDs

Con los LEDs WS2812 es posible crear, por ejemplo, un efecto de semáforo, en el que, con una tira de tres LED, colocados de manera vertical, podremos encender el primer LED de la tira en verde, el segundo en naranja y el tercero en rojo, dependiendo del nivel de CO2 o de cualquier otro valor.

A lo mejor también te interesa:  Uso de un ModeMCU como voltímetro

El comando a enviar para encender un led determinado de la tira es:

NeoPixel, NumeroLed, CantidadDeRojo, CantidadDeVerde, CantidadDeAzul

Siendo NumeroLed la posición que ocupa el LED que queremos controlar en la tira, y la cantidad de rojo, verde y azul un número entre 0 (apagado) y 255 (encendido al 100% de intensidad).

Para encender el primer LED en rojo (al 50% de intensidad, por ejemplo, ya que el 100% es muy fuerte para mi gusto) utilizaríamos el comando:

NeoPixel,1,128,0,0

Para encender el segundo LED en ámbar (al 50% de intensidad), lo podríamos hacer sumando un 25% de rojo más un 12% de verde. Para conseguir esto utilizaríamos el comando:

NeoPixel,2,64,32,0

Para encender el tercer LED en verde (al 50% de intensidad), utilizaríamos el comando:

NeoPixel,3,0,64,0

La regla que deberíamos incluir sería esta:

On SenseairCO2#PPM do
  if [SenseairCO2#PPM]>900
    NeoPixelAll,0,0,0 // APAGAMOS LOS LED
    NeoPixel,1,128,0,0 // ENCENDEMOS EL PRIMER LED EN ROJO
  Elseif [SenseairCO2#PPM] > 800
    NeoPixelAll,0,0,0 // APAGAMOS LOS LED
    NeoPixel,2,64,32,0 // ENCENDEMOS EL SEGUNDO LED EN NARANJA
  Else
    NeoPixelAll,0,0,0 // APAGAMOS LOS LED
    NeoPixel,3,0,64,0 // ENCENDEMOS EL TERCER LED EN VERDE
  Endif
endon

He escogido los niveles de CO2 para que el semáforo se ponga rojo cuando se superen las 900 ppm (según la normativa RITE IDA 2 para aulas de enseñanza, adecuado para aulas de colegios). Siéntete libre de sustituir los valores de 900 y 700 por los que más te convengan.

Dependiendo de a qué distancia se vaya a ver y de la luminosidad de la sala, puedes ajustar la intensidad de los LEDs (uno de estos LEDS encendido al máximo, valor de 255, se ve mucho).

Como verás antes de encender cada led primero apagamos la tira completa, utilizando el comando NeoPixelAll,0,0,0 porque, si no lo hiciéramos así, en los cambios de color (por ejemplo, al pasar de verde a naranja), se quedarían encendidos los dos LEDS.

Este tipo de LEDS es perfecto para hacer semáforos y otros indicadores. Mejor que las tiras porque se pueden utilizar unidos o separar de forma individual.

Mucho mejor que las tiras LED, que dan mucha menos flexibilidad.

Pincha en la imagen o aquí para ver dónde los compro yo.

Video tutorial paso a paso

Aunque el montaje y configuración son muy sencillos, en el video de la caja en 3D tienes instrucciones específicas y detalladas de conexión y configuración de los LEDs, ya que los utilizaba.

En él podrás encontrar explicaciones, detalles y consejos de todo tipo.

Deja un comentario