ESP32 Tutorial 52/55 - WS2812 CheerLights MQTT Globale Synchronisatie met LCD | SunFounder ESP32 IoT-kit
In deze tutorial maken we een CheerLights-project met behulp van de ESP32, dat wereldwijd kleuren synchroniseert via MQTT. Dit project zal niet alleen kleuren veranderen op basis van invoer van andere gebruikers, maar ook de huidige kleur en het aantal keren dat deze is bijgewerkt weergeven op een LCD-scherm. Het resultaat is een leuke demonstratie van IoT-mogelijkheden, die laat zien hoe apparaten kunnen interageren en gebruikers verbonden kunnen houden over afstanden. Voor extra verduidelijking, bekijk de video op (in video op 00:00).
Hardware Uitgelegd
Om dit project te bouwen, heb je een ESP32-microcontroller, een WS2812-LED-strip en een LCD-display nodig. De ESP32 fungeert als het brein van de operatie en gebruikt zijn ingebouwde Wi-Fi-mogelijkheden om verbinding te maken met het internet en MQTT-berichten te ontvangen. Dit maakt realtime updates van de LED-kleuren mogelijk op basis van een wereldwijde invoer van andere gebruikers.
De WS2812-LED-strip is een populaire keuze voor projecten die adresseerbare RGB-LED's vereisen. Elke LED kan onafhankelijk worden aangestuurd, wat rijke kleurweergaven mogelijk maakt. De LCD zorgt voor een visuele bevestiging van de huidige kleur en het aantal keren dat deze is gewijzigd, wat de gebruikersinteractie verbetert.
Datasheet Details
| Fabrikant | SunFounder |
|---|---|
| Onderdeelnummer | ESP32 |
| Logica/IO-spanning | 3,3 V |
| Voedingsspanning | 5 V |
| Uitgangsstroom (per kanaal) | 20 mA |
| Piekstroom (per kanaal) | 60 mA |
| PWM-frequentierichtlijn | 400 Hz |
| Ingangslogische drempels | 0,15 V (laag), 0,8 V (hoog) |
| Spanningsval / RDS(on) / verzadiging | 0,2 V |
| Thermische limieten | 85 °C |
| Behuizing | ESP32-module |
| Opmerkingen / varianten | Inclusief ingebouwde Wi-Fi en Bluetooth |
- Zorg voor een juiste voedingsspanning voor de ESP32 (5 V) en WS2812-strip (5 V).
- Gebruik een gemeenschappelijke aarde tussen de ESP32 en de LED-strip.
- Implementeer een geschikte MQTT-broker voor kleursynchronisatie.
- Let op de data-pinverbinding voor de WS2812 (pin 14 volgens de code).
- Wees voorzichtig met het aantal LED's; het overschrijden van de vermogenslimieten vereist extra voedingsbronnen.
Bekabelingsinstructies


Om de componenten te bedraden, begin je met het aansluiten van de WS2812-LED-strip. Verbind de aardingspin (meestal zwart) van de LED-strip met de aardingspin op de ESP32. Verbind vervolgens de VCC-pin (meestal rood) van de LED-strip met de 5V-uitgang op de ESP32. Verbind ten slotte de data-pin (vaak geel) met GPIO-pin 14 op de ESP32.
Voor de LCD verbind je de aardingspin (vaak zwart) met de aarde op de ESP32. De VCC-pin (meestal rood) moet worden verbonden met de 5V-uitgang. De SDA-pin (meestal grijs) verbindt met GPIO-pin 21, terwijl de SCL-pin (meestal wit) verbindt met GPIO-pin 22. Deze opstelling stelt de ESP32 in staat om met de LCD te communiceren en informatie naar behoefte weer te geven.
Codevoorbeelden & Uitleg
In de setup-functie initialiseren we de LCD en maken we verbinding met Wi-Fi. De onderstaande code laat zien hoe je de benodigde bibliotheken definieert en de LCD instelt:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // stel het LCD-adres in
void setup() {
Serial.begin(115200);
lcd.init(); // initialiseer de lcd
lcd.backlight(); // Schakelt de LCD-achtergrondverlichting in.
}
Dit initialiseert de LCD voor gebruik, zodat deze berichten kan weergeven. Het volgende fragment laat zien hoe de Wi-Fi-verbinding tot stand wordt gebracht:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //voor LCD
delay(500);
}
Serial.println("WiFi verbonden");
}
Deze functie brengt een verbinding tot stand met het opgegeven Wi-Fi-netwerk en geeft tijdens het verbinden een bericht weer op de LCD. Tot slot wordt de kleurveranderingslogica afgehandeld in de callback-functie:
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);
}
}
Deze functie luistert naar inkomende berichten op het onderwerp "cheerlights" en werkt de kleur dienovereenkomstig bij. De volledige code wordt onder het artikel geladen, dus zorg ervoor dat je deze bekijkt voor de volledige implementatie.
Demonstratie / Wat te Verwachten
Na voltooiing van het project kun je verwachten dat de LED-strip van kleur verandert op basis van invoer van een wereldwijde MQTT-feed. De LCD toont de huidige kleurnaam en het aantal keren dat deze is gewijzigd. Als je de internetverbinding verbreekt, geeft de LCD "Verbinden..." aan totdat de verbinding opnieuw tot stand is gebracht (in video op 12:30).
Veelvoorkomende valkuilen zijn onder meer het zorgen dat de juiste pinnen worden gebruikt voor dataverbindingen en het verifiëren dat de Wi-Fi-referenties correct zijn. Als er discrepanties zijn in de SSID of het wachtwoord, zal de ESP32 niet kunnen verbinden en blijft de LCD het verbindingsbericht weergeven.
Videotijdstempels
- 00:00 Start
- 1:59 Introductie van het project
- 6:16 Bedrading uitgelegd
- 8:13 Arduino-code uitgelegd
- 14:26 ESP32-board en COM-poort selecteren in Arduino IDE
- 16:07 CheerLight-demonstratie met 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
Hulpmiddelen en referenties
-
DocumentatieESP32 Tutorial 52/55 - SunFounder doc page for CheerLightdocs.sunfounder.com
Bestanden📁
Geen bestanden beschikbaar.