Tutorial ESP32 47/55 - CheerLights WS2812 usando MQTT su Internet | Kit IoT ESP32 di SunFounder
In questo tutorial, creeremo un sistema di illuminazione sincronizzato utilizzando l'ESP32 e i LED WS2812 che possono essere controllati da remoto tramite MQTT. Questo sistema consente a più utenti di cambiare simultaneamente il colore delle luci, creando un'esperienza connessa indipendentemente dalla posizione. Il progetto utilizza il kit IoT SunFounder ESP32, che include un potente microcontrollore con capacità Wi-Fi, rendendolo ideale per applicazioni IoT.
In tutto il video, passeremo attraverso la configurazione necessaria, il cablaggio e l'implementazione del codice per ottenere questo effetto. Se hai bisogno di ulteriori chiarimenti, assicurati di controllare il video ai timestamp specifici (nel video a mm:ss).
Spiegazione dell'hardware
I componenti principali di questo progetto includono il microcontrollore ESP32, la striscia LED WS2812 e un broker MQTT. L'ESP32 è un microcontrollore versatile con capacità Wi-Fi e Bluetooth integrate, che gli consente di connettersi facilmente a Internet. Funziona come il cervello del nostro progetto, gestendo la comunicazione e controllando la striscia LED.
La striscia LED WS2812 è composta da LED RGB individualmente indirizzabili, che possono essere controllati per visualizzare un'ampia gamma di colori. Ogni LED può essere acceso o spento e impostato su qualsiasi colore utilizzando una singola linea di dati, rendendolo perfetto per effetti di illuminazione dinamici. Il broker MQTT facilita la comunicazione tra i diversi client, consentendo agli utenti di pubblicare e iscriversi a argomenti che controllano i colori delle LED.
Dettagli della scheda tecnica
| Produttore | Adafruit |
|---|---|
| Numero di parte | WS2812B |
| Tensione di logica/IO | 3,5 - 5,5 V |
| Tensione di alimentazione | 5 V |
| Corrente di uscita (per canale) | 20 mA |
| Corrente di picco (per canale) | 60 mA |
| Guideline sulla frequenza PWM | 400 Hz |
| Soglie logiche di input | 0,2Vcc (basso), 0,7Vcc (alto) |
| Caduta di tensione / RDS(on)/ saturazione | 0,5 V |
| Limiti termici | Temperatura di esercizio: -25 a 85 °C |
| Pacchetto | Individual 5050 SMD |
| Note / varianti | Disponibile in diverse lunghezze e configurazioni |
- Garantire un'alimentazione adeguata per la striscia WS2812 per evitare cadute di tensione.
- Utilizza un comune collegamento tra l'ESP32 e la striscia LED.
- Mantieni le linee di dati corte per prevenire la degradazione del segnale.
- Considera di utilizzare un condensatore (1000μF) attraverso l'alimentazione per attenuare i picchi di tensione.
- Utilizzare resistori appropriati sulla linea dati per prevenire la riflessione del segnale.
- Fai attenzione al prelievo totale di corrente della striscia LED; utilizza alimentazione esterna quando necessario.
Istruzioni per il cablaggio
Per collegare l'ESP32 con la striscia LED WS2812, inizia collegando l'alimentazione. Collega il filo rosso della striscia LED a una fonte di alimentazione a 5V e il filo nero a massa. Successivamente, collega la linea dei dati (filo giallo) dalla striscia WS2812 al pin 14 dell'ESP32. Assicurati che l'ESP32 sia collegato alla stessa massa della striscia LED per mantenere un riferimento comune.
Dopo aver impostato le connessioni di alimentazione e dati, collega l'ESP32 al tuo computer utilizzando un cavo micro USB per la programmazione. Dovrai assicurarti che l'ESP32 sia acceso durante la programmazione per stabilire una connessione. Una volta cablato, puoi procedere a caricare il codice e testare la configurazione.

Esempi di codice e guida passo passo
Il codice inizia includendo le librerie necessarie per la funzionalità Wi-Fi e MQTT. Gli identificatorissidepasswordsono utilizzati per memorizzare le tue credenziali Wi-Fi, mentremqtt_serverdetiene l'indirizzo del broker MQTT.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";Successivamente, definiamo i colori CheerLights supportati e i loro corrispondenti valori RGB utilizzando array. Questo consente al programma di accedere facilmente alle impostazioni dei colori in base all'input dell'utente.
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // "red"
255, 192, 203, // "pink" ...};Ilsetup()La funzione inizializza la comunicazione seriale, configura la connessione Wi-Fi e prepara il client MQTT. Inizia anche il nastro LED.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}Il ciclo principale controlla continuamente la connessione MQTT e gestisce i messaggi in arrivo che controllano i colori dei LED.callback()la funzione viene attivata quando viene ricevuto un messaggio sul tema sottoscritto.
Dimostrazione / Cosa Aspettarsi
Una volta configurato tutto e caricato il codice, dovresti essere in grado di cambiare il colore dei LED WS2812 inviando messaggi al topic MQTT. Se un altro utente cambia il colore, tutti i dispositivi connessi rifletteranno il cambiamento simultaneamente. Fai attenzione ai potenziali problemi come la polarità inversa o connessioni errate, che potrebbero impedire il corretto funzionamento dei LED (nel video a mm:ss).
Timestamp video
- 00:00 Inizio
- 2:00 Introduzione
- 3:48 Pagina di documentazione
- 6:33 Spiegazione del cablaggio
- 7:35 Codice Arduino spiegato
- 15:03 Selezionando la scheda ESP32 e la porta COMP nell'IDE di Arduino
- 16:46 Dimostrazione CheerLighs
/*
* :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 <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
#include <Adafruit_NeoPixel.h>
// Sostituisci le prossime variabili con la tua combinazione SSID/Password
const char* ssid = "SSID";
const char* password = "PASSWORD";
// 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, // "pizzo antico"
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);
// impostazioni predefinite 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) {
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 un messaggio viene ricevuto sull'argomento, controllerai questo messaggio.
// Cambia lo stato di uscita secondo il 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()) {
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");
// Attendi 5 secondi prima di riprovare
delay(5000);
}
}
}
void setColor(String color) {
// Scorri attraverso l'elenco dei colori per trovare il colore corrispondente.
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
// 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]));
}
pixels.show();
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Common Course Links
Common Course Files
Risorse e riferimenti
-
DocumentazioneTutoriale ESP32 47/55 - Pagina doc di SunFounder per luce cheerdocs.sunfounder.com
File📁
Nessun file disponibile.