Tutorial ESP32 52/55 - Sincronizare globală WS2812 CheerLights MQTT cu LCD | Kit IoT ESP32 SunFounder
În acest tutorial, vom crea un proiect CheerLights folosind ESP32, care va sincroniza culorile la nivel global prin MQTT. Acest proiect nu doar că va schimba culorile pe baza intrărilor de la alți utilizatori, dar va afișa și culoarea curentă și de câte ori a fost actualizată pe un ecran LCD. Rezultatul este o demonstrație distractivă a capacităților IoT, evidențiind modul în care dispozitivele pot interacționa și pot menține utilizatorii conectați pe distanțe. Pentru clarificări suplimentare, urmăriți videoclipul la (în videoclip la 00:00).
Hardware Explicat
Pentru a construi acest proiect, veți avea nevoie de un microcontroler ESP32, o bandă LED WS2812 și un afișaj LCD. ESP32 servește ca creier al operațiunii, utilizând capacitățile sale Wi-Fi integrate pentru a se conecta la internet și a primi mesaje MQTT. Acest lucru permite actualizări în timp real ale culorilor LED pe baza unei intrări globale de la alți utilizatori.
Banda LED WS2812 este o alegere populară pentru proiectele care necesită LED-uri RGB adresabile. Fiecare LED poate fi controlat independent, permițând afișaje bogate în culori. LCD-ul va oferi o confirmare vizuală a culorii curente și a numărului de modificări, îmbunătățind interacțiunea utilizatorului.
Detalii din Fișa Tehnică
| Producător | SunFounder |
|---|---|
| Număr de piesă | ESP32 |
| Tensiune logică/IO | 3,3 V |
| Tensiune de alimentare | 5 V |
| Curent de ieșire (pe canal) | 20 mA |
| Curent de vârf (pe canal) | 60 mA |
| Ghid frecvență PWM | 400 Hz |
| Praguri logice de intrare | 0,15 V (jos), 0,8 V (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0,2 V |
| Limite termice | 85 °C |
| Pachet | Modul ESP32 |
| Note / variante | Include Wi-Fi și Bluetooth integrate |
- Asigurați o alimentare adecvată pentru ESP32 (5 V) și banda WS2812 (5 V).
- Utilizați o masă comună între ESP32 și banda LED.
- Implementați un broker MQTT adecvat pentru sincronizarea culorilor.
- Acordați atenție conexiunii pinului de date pentru WS2812 (pinul 14 conform codului).
- Fiți atenți la numărul de LED-uri; depășirea limitelor de putere necesită surse de alimentare suplimentare.
Instrucțiuni de Cablare


Pentru a cabla componentele, începeți prin conectarea benzii LED WS2812. Conectați pinul de masă (de obicei negru) al benzii LED la pinul de masă de pe ESP32. Apoi, conectați pinul VCC (de obicei roșu) al benzii LED la ieșirea de 5V de pe ESP32. În final, conectați pinul de date (adesea galben) la pinul GPIO 14 de pe ESP32.
Pentru LCD, conectați pinul de masă (adesea negru) la masa de pe ESP32. Pinul VCC (de obicei roșu) ar trebui conectat la ieșirea de 5V. Pinul SDA (de obicei gri) se conectează la pinul GPIO 21, în timp ce pinul SCL (de obicei alb) se conectează la pinul GPIO 22. Această configurare permite ESP32 să comunice cu LCD-ul și să afișeze informații după cum este necesar.
Exemple de Cod & Explicații
În funcția de configurare, inițializăm LCD-ul și ne conectăm la Wi-Fi. Codul de mai jos demonstrează cum să definiți bibliotecile necesare și să configurați LCD-ul:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // setați adresa LCD
void setup() {
Serial.begin(115200);
lcd.init(); // inițializați LCD-ul
lcd.backlight(); // Pornește lumina de fundal a LCD-ului.
}
Aceasta inițializează LCD-ul pentru utilizare, permițându-i să afișeze mesaje. Următorul extras arată cum se stabilește conexiunea Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //pentru LCD
delay(500);
}
Serial.println("WiFi conectat");
}
Această funcție stabilește o conexiune la rețeaua Wi-Fi specificată, afișând un mesaj pe LCD în timpul conectării. În cele din urmă, logica de schimbare a culorii este gestionată în funcția 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);
}
}
Această funcție ascultă mesajele primite pe subiectul "cheerlights" și actualizează culoarea în consecință. Codul complet este încărcat mai jos în articol, așa că asigurați-vă că îl revizuiți pentru implementarea completă.
Demonstrație / Ce să Vă Așteptați
La finalizarea proiectului, vă puteți aștepta ca banda LED să schimbe culorile pe baza intrărilor dintr-un flux MQTT global. LCD-ul va afișa numele culorii curente și de câte ori a fost schimbată. Dacă deconectați internetul, LCD-ul va indica "Connecting..." până când conexiunea este restabilită (în videoclip la 12:30).
Capcanele comune includ asigurarea că pinii corecți sunt utilizați pentru conexiunile de date și verificarea că acreditările Wi-Fi sunt corecte. Dacă există discrepanțe în SSID sau parolă, ESP32 nu se va conecta, iar LCD-ul va continua să afișeze mesajul de conectare.
Marcaje Temporale din Videoclip
- 00:00 Start
- 1:59 Introducere în proiect
- 6:16 Conexiunile explicate
- 8:13 Codul Arduino explicat
- 14:26 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
- 16:07 Demonstrație CheerLight cu LCD
/*********
This is the origianl code from Examples->iot_5_cheerlight of SunFounder
full video instrucions https://youtu.be/xEqmxMiF-E8
📚⬇️ Download and resource page https://robojax.com/RJT685
I have added LCD to display:
1-Color name
2-Count the number of times the color is updated
3-Showon LCD if wifi is connected
4-Show connecting if not connected or disconnected
Written by Ahmad Shamshiri
www.Robojax.com
Dec 29, 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); // set the LCD address to 0x27 for a 16 chars and 2 line display
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>
// Replace the next variables with your SSID/Password combination
const char* ssid = "dars";
const char* password = "5152535455";
// Add your MQTT Broker address:
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 the supported CheerLights colors and their RGB values
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"
0, 255, 0, // "green"
0, 0, 255, // "blue"
0, 255, 255, // "cyan"
255, 255, 255, // "white"
255, 223, 223, // "warmwhite"
255, 223, 223, // "oldlace"
128, 0, 128, // "purple"
255, 0, 255, // "magenta"
255, 255, 0, // "yellow"
255, 165, 0}; // "orange"
// init rgb strip
#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();// initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
// wifi default settings
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// rgb strip begin
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect();//for 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();
// If a message is received on the topic, you will check this message.
// Changes the output state according to the message
if (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Subscribe
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setColor(String color) {
// Loop through the list of colors to find the matching color
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex;//remeber the last color
colorCount++;//increment the count
// Set the color of each NeoPixel on the strip
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();
//first row
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
//second row
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000);//we must have delay to able to read the display
}
Common Course Links
Common Course Files
Resurse și referințe
-
DocumentațieESP32 Tutorial 52/55- SunFounder doc page for CheerLightdocs.sunfounder.com
Fișiere📁
Nu sunt disponibile fișiere.