Tutorial ESP32 52/55 - Sincronización Global WS2812 CheerLights MQTT con LCD | Kit IoT SunFounder ESP32
En este tutorial, crearemos un proyecto CheerLights utilizando el ESP32, que sincronizará colores globalmente a través de MQTT. Este proyecto no solo cambiará de color según las entradas de otros usuarios, sino que también mostrará el color actual y cuántas veces se ha actualizado en una pantalla LCD. El resultado es una divertida demostración de las capacidades de IoT, mostrando cómo los dispositivos pueden interactuar y mantener a los usuarios conectados a través de distancias. Para una aclaración adicional, mira el video en (en el video en 00:00).
Hardware Explicado
Para construir este proyecto, necesitarás un microcontrolador ESP32, una tira de LED WS2812 y una pantalla LCD. El ESP32 sirve como el cerebro de la operación, utilizando sus capacidades de Wi-Fi integradas para conectarse a internet y recibir mensajes MQTT. Esto permite actualizaciones en tiempo real de los colores de los LED basado en una entrada global de otros usuarios.
La tira LED WS2812 es una opción popular para proyectos que requieren LED RGB direccionables. Cada LED puede controlarse de forma independiente, lo que permite crear espectáculos de color ricos. La pantalla LCD proporcionará una confirmación visual del color actual y el número de veces que ha sido cambiado, mejorando la interacción del usuario.
Detalles de la hoja de datos
| Fabricante | SunFounder |
|---|---|
| Número de parte | ESP32 |
| Voltaje de lógica/entrada/salida | 3.3 V |
| Tensión de suministro | 5 V |
| Corriente de salida (por canal) | 20 mA |
| Corriente pico (por canal) | 60 mA |
| Orientación sobre la frecuencia PWM | 400 Hz |
| Umbrales de lógica de entrada | 0.15 V (bajo), 0.8 V (alto) |
| Caída de voltaje / RDS(on)/ saturación | 0.2 V |
| Límites térmicos | 85 °C |
| Paquete | módulo ESP32 |
| Notas / variantes | Incluye Wi-Fi y Bluetooth integrados. |
- Asegúrate de proporcionar la alimentación adecuada al ESP32 (5 V) y a la tira WS2812 (5 V).
- Utiliza un suelo común entre el ESP32 y la tira de LED.
- Implementar un broker MQTT adecuado para la sincronización de colores.
- Presta atención a la conexión del pin de datos para el WS2812 (pin 14 según el código).
- Ten cuidado con el número de LED; exceder los límites de potencia requiere fuentes de energía adicionales.
Instrucciones de cableado


Para cablear los componentes, comienza conectando la tira de LED WS2812. Conecta el pin de tierra (generalmente negro) de la tira de LED al pin de tierra en el ESP32. A continuación, conecta el pin VCC (generalmente rojo) de la tira de LED a la salida de 5V en el ESP32. Finalmente, conecta el pin de datos (a menudo amarillo) al pin GPIO 14 en el ESP32.
Para el LCD, conecta el pin de tierra (a menudo negro) a la tierra en el ESP32. El pin VCC (normalmente rojo) debe conectarse a la salida de 5V. El pin SDA (típicamente gris) se conecta al pin GPIO 21, mientras que el pin SCL (usualmente blanco) se conecta al pin GPIO 22. Esta configuración permite que el ESP32 se comunique con el LCD y muestre información según sea necesario.
Ejemplos de código y guía paso a paso
En la función de configuración, inicializamos el LCD y nos conectamos a Wi-Fi. El código a continuación demuestra cómo definir las bibliotecas necesarias y configurar el LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // set the LCD address
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
}Esto inicializa el LCD para su uso, permitiéndole mostrar mensajes. El siguiente extracto muestra cómo se establece la conexión Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //for LCD
delay(500);
}
Serial.println("WiFi connected");
}Esta función establece una conexión con la red Wi-Fi especificada, mostrando un mensaje en la pantalla LCD mientras se conecta. Por último, la lógica de cambio de color se maneja en la función de callback:
void callback(char* topic, byte* message, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
if (String(topic) == "cheerlights") {
setColor(messageTemp);
}
}Esta función escucha los mensajes entrantes en el tema "cheerlights" y actualiza el color en consecuencia. El código completo se carga debajo del artículo, así que asegúrate de revisarlo para la implementación completa.
Demostración / Qué Esperar
Al finalizar el proyecto, puedes esperar que la tira LED cambie de colores según las entradas de un feed MQTT global. El LCD mostrará el nombre del color actual y cuántas veces ha cambiado. Si desconectas internet, el LCD indicará "Conectando..." hasta que se restablezca la conexión (en el video a las 12:30).
Las trampas comunes incluyen asegurarse de que se utilizan los pines correctos para las conexiones de datos y verificar que las credenciales de Wi-Fi sean precisas. Si hay discrepancias en el SSID o la contraseña, el ESP32 no podrá conectarse, y la pantalla LCD seguirá mostrando el mensaje de conexión.
Marcas de tiempo del video
- 00:00 Comienzo
- 1:59 Introducción al proyecto
- 6:16 Explicación del cableado
- 8:13 Código de Arduino explicado
- 14:26 Seleccionando la placa ESP32 y el puerto COM en Arduino IDE
- 16:07 Demostración de CheerLight con LCD
/*
* Este es el código original de Examples->iot_5_cheerlight de SunFounder
* instrucciones de video completo https://youtu.be/xEqmxMiF-E8
* 📚⬇️ Página de descarga y recursos https://robojax.com/RJT685
*
* He añadido un LCD para mostrar:
* 1-Nombre del color
* 2-Contar la cantidad de veces que se actualiza el color
* 3-Mostrar en el LCD si el wifi está conectado
* 4-Mostrar 'conectando' si no está conectado o está desconectado
*
* Escrito por Ahmad Shamshiri
* www.Robojax.com
* 29 de diciembre de 2023
*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27, 16,2); // establecer la dirección LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas
int colorCount = 0;
int lastColor=0;
byte connected[] = {
B00001,
B00001,
B00011,
B00111,
B00111,
B01111,
B01111,
B11111
};
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
#include <Adafruit_NeoPixel.h>
// Reemplace las siguientes variables con su combinación de SSID/Contraseña.
const char* ssid = "dars";
const char* password = "5152535455";
// Agrega la dirección de tu broker MQTT:
const char* mqtt_server = "mqtt.cheerlights.com";
const char* unique_identifier = "sunfounder-client-sdgvsasdda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// Define los colores de CheerLights soportados y sus valores RGB.
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // rojo
255, 192, 203, // rosa
0, 255, 0, // verde
0, 0, 255, // azul
0, 255, 255, // cian
255, 255, 255, // blanco
255, 223, 223, // blanco cálido
255, 223, 223, // "encaje viejo"
128, 0, 128, // "púrpura"
255, 0, 255, // magenta
255, 255, 0, // amarillo
255, 165, 0}; // naranja
// inicializar tira rgb
#define LED_PIN 13
#define NUM_LEDS 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
lcd.init(); // inicializar el lcd
lcd.backlight(); // Enciende la retroiluminación LCD.
// ajustes predeterminados de wifi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// comienzo de tira rgb
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// Comenzamos conectándonos a una red WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); // para LCD
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Si se recibe un mensaje sobre el tema, comprobarás este mensaje.
// Cambia el estado de salida según el mensaje.
if (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// Bucle hasta que estemos reconectados.
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// Intentar conectar
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Suscribirse
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Espera 5 segundos antes de volver a intentar.
delay(5000);
}
}
}
void setColor(String color) {
// Recorra la lista de colores para encontrar el color que coincide.
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex; // recuerda el último color
colorCount++; // incrementar el conteo
// Establece el color de cada NeoPixel en la tira.
for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
delay(100);
}
pixels.show();
}
}
}
void lcdConnect()
{
lcd.clear();
lcd.setCursor(0, 0); // línea 0
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // línea 1
lcd.print(ssid);
}
void loop() {
lcd.clear();
if (!client.connected()) {
reconnect();
}else{
lcd.createChar(0, connected);
lcd.setCursor(15, 0);
lcd.write(byte(0));
}
client.loop();
// primera fila
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
// segunda fila
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000); // debemos tener un retraso para poder leer la pantalla
}
Common Course Links
Common Course Files
Recursos y referencias
-
DocumentaciónTutorial ESP32 52/55 - Página del documento de SunFounder para CheerLightdocs.sunfounder.com
Archivos📁
No hay archivos disponibles.