Tutorial ESP32 52/55 - Sincronizzazione Globale MQTT CheerLights WS2812 con LCD | Kit IoT SunFounder ESP32
In questo tutorial, creeremo un progetto CheerLights utilizzando l'ESP32, che sincronizzerà i colori a livello globale tramite MQTT. Questo progetto cambierà non solo i colori in base agli input di altri utenti, ma visualizzerà anche il colore attuale e quante volte è stato aggiornato su un display LCD. Il risultato è una dimostrazione divertente delle capacità dell'IoT, che mostra come i dispositivi possano interagire e mantenere gli utenti connessi attraverso le distanze. Per ulteriori chiarimenti, guarda il video (nel video a 00:00).
Spiegazione dell'hardware
Per costruire questo progetto, avrai bisogno di un microcontrollore ESP32, di una striscia LED WS2812 e di un display LCD. L'ESP32 funge da cervello dell'operazione, sfruttando le sue capacità Wi-Fi integrate per connettersi a Internet e ricevere messaggi MQTT. Questo consente aggiornamenti in tempo reale dei colori LED basati su un input globale da parte di altri utenti.
La striscia LED WS2812 è una scelta popolare per progetti che richiedono LED RGB indirizzabili. Ogni LED può essere controllato in modo indipendente, consentendo di creare visualizzazioni di colori ricche. Il LCD fornirà una conferma visiva del colore attuale e del numero di volte che è stato cambiato, migliorando l'interazione con l'utente.
Dettagli della scheda dati
| Produttore | SunFounder |
|---|---|
| Numero di parte | ESP32 |
| Tensione logica/IO | 3,3 V |
| Tensione di alimentazione | 5 V |
| Corrente di uscita (per canale) | 20 mA |
| Corrente di picco (per canale) | 60 mA |
| Linee guida sulla frequenza PWM | 400 Hz |
| Soglie logiche di ingresso | 0,15 V (basso), 0,8 V (alto) |
| Caduta di tensione / RDS(on)/ saturazione | 0,2 V |
| Limiti termici | 85 °C |
| Pacchetto | Modulo ESP32 |
| Note / varianti | Include Wi-Fi e Bluetooth integrati |
- Assicurati di fornire la corretta alimentazione all'ESP32 (5 V) e alla striscia WS2812 (5 V).
- Usa un terreno comune tra l'ESP32 e la striscia LED.
- Implementa un broker MQTT adeguato per la sincronizzazione dei colori.
- Presta attenzione alla connessione del pin dei dati per il WS2812 (pin 14 secondo il codice).
- Fai attenzione al numero di LED; superare i limiti di potenza richiede fonti di alimentazione aggiuntive.
Istruzioni di cablaggio


Per cablare i componenti, inizia collegando la striscia LED WS2812. Collega il pin di massa (di solito nero) della striscia LED al pin di massa dell'ESP32. Successivamente, collega il pin VCC (di solito rosso) della striscia LED all'uscita 5V dell'ESP32. Infine, collega il pin dati (spesso giallo) al pin GPIO 14 dell'ESP32.
Per il LCD, collegare il pin di massa (spesso nero) al terra dell'ESP32. Il pin VCC (di solito rosso) deve essere collegato all'uscita 5V. Il pin SDA (tipicamente grigio) si collega al pin GPIO 21, mentre il pin SCL (di solito bianco) si collega al pin GPIO 22. Questa configurazione consente all'ESP32 di comunicare con il LCD e visualizzare le informazioni secondo necessità.
Esempi di codice e guida passo passo
Nella funzione di configurazione, inizializziamo il LCD e ci connettiamo al Wi-Fi. Il codice sottostante dimostra come definire le librerie necessarie e configurare il 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.
}Questo inizializza l'LCD per l'uso, permettendo di visualizzare i messaggi. Il prossimo estratto mostra come viene stabilita la connessione Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //for LCD
delay(500);
}
Serial.println("WiFi connected");
}Questa funzione stabilisce una connessione alla rete Wi-Fi specificata, visualizzando un messaggio sul LCD durante la connessione. Infine, la logica del cambio di colore è gestita nella funzione di 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);
}
}Questa funzione ascolta i messaggi in arrivo sul tema "cheerlights" e aggiorna il colore di conseguenza. Il codice completo è caricato sotto l'articolo, quindi assicurati di rivederlo per l'implementazione completa.
Dimostrazione / Cosa Aspettarsi
Al termine del progetto, puoi aspettarti che la striscia LED cambi colore in base agli input di un feed MQTT globale. Il LCD mostrerà il nome del colore attuale e quante volte è stato cambiato. Se disconnetti Internet, il LCD indicherà "Connecting..." fino a quando non verrà ripristinata una connessione (nel video alle 12:30).
I punti critici comuni includono l'assicurarsi che i pin corretti siano utilizzati per le connessioni dati e verificare che le credenziali Wi-Fi siano accurate. Se ci sono discrepanze nell'SSID o nella password, l'ESP32 non riuscirà a connettersi e il display LCD continuerà a visualizzare il messaggio di connessione.
Timestamp video
- 00:00 Inizio
- 1:59 Introduzione al progetto
- 6:16 Spiegazione del cablaggio
- 8:13 Spiegazione del codice Arduino
- 14:26 Selezionare la scheda ESP32 e la porta COM su Arduino IDE
- 16:07 Dimostrazione CheerLight con LCD
/*
* Questo è il codice originale di Esempi->iot_5_cheerlight di SunFounder
* istruzioni video complete https://youtu.be/xEqmxMiF-E8
* 📚⬇️ Pagina di download e risorse https://robojax.com/RJT685
*
* Ho aggiunto un LCD per visualizzare:
* 1-Nome del colore
* 2-Conteggio del numero di volte che il colore viene aggiornato
* 3-Mostrare sul LCD se il wifi è connesso
* 4-Mostrare "connessione in corso" se non connesso o disconnesso
*
* Scritto da Ahmad Shamshiri
* www.Robojax.com
* 29 dicembre 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); // impostare l'indirizzo LCD su 0x27 per un display di 16 caratteri e 2 righe
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>
// Sostituisci le seguenti variabili con la tua combinazione SSID/Password
const char* ssid = "dars";
const char* password = "5152535455";
// Aggiungi l'indirizzo del tuo 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;
// Definisci i colori CheerLights supportati e i loro valori RGB.
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // rosso
255, 192, 203, // rosa
0, 255, 0, // verde
0, 0, 255, // blu
0, 255, 255, // ciano
255, 255, 255, // bianco
255, 223, 223, // "bianco caldo"
255, 223, 223, // "vecchio pizzo"
128, 0, 128, // viola
255, 0, 255, // magenta
255, 255, 0, // giallo
255, 165, 0}; // arancia
// inizia striscia 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(); // inizializza il lcd
lcd.backlight(); // Accende la retroilluminazione LCD.
// impostazioni predefinite del wifi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// striscia rgb inizio
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// Iniziamo collegandoci a una rete WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); // per 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();
// Se viene ricevuto un messaggio sull'argomento, controllerai questo messaggio.
// Cambia lo stato del'uscita in base al messaggio
if (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// Ripeti finché non siamo riconnessi.
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// Tentativo di connessione
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Iscriviti
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Attendere 5 secondi prima di riprovare.
delay(5000);
}
}
}
void setColor(String color) {
// Scorri l'elenco dei colori per trovare il colore corrispondente.
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex; // ricorda l'ultimo colore
colorCount++; // incrementa il conteggio
// Imposta il colore di ogni NeoPixel sulla striscia
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); // line 0
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // line 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();
// prima fila
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
// seconda fila
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000); // dobbiamo avere un ritardo per poter leggere il display
}
Common Course Links
Common Course Files
Risorse e riferimenti
-
DocumentazioneESP32 Tutorial 52/55 - Pagina doc SunFounder per CheerLightdocs.sunfounder.com
File📁
Nessun file disponibile.