ESP32 Tutorial 47/55 - WS2812 CheerLights met MQTT via internet | SunFounder's ESP32 IoT-kit
In deze tutorial maken we een gesynchroniseerd verlichtingssysteem met behulp van de ESP32 en WS2812 LED's dat op afstand kan worden bediend via MQTT. Dit systeem stelt meerdere gebruikers in staat om tegelijkertijd de kleur van de lichten te veranderen, waardoor een verbonden ervaring ontstaat, ongeacht de locatie. Het project maakt gebruik van de SunFounder ESP32 IoT-kit, die een krachtige microcontroller met Wi-Fi-mogelijkheden bevat, waardoor het ideaal is voor IoT-toepassingen.
In de video doorlopen we de benodigde opstelling, bedrading en code-implementatie om dit effect te bereiken. Als je verdere verduidelijking nodig hebt, bekijk dan de video op specifieke tijdstippen (in video op mm:ss).
Hardware Uitgelegd
De primaire componenten van dit project zijn de ESP32-microcontroller, WS2812 LED-strip en een MQTT-broker. De ESP32 is een veelzijdige microcontroller met ingebouwde Wi-Fi- en Bluetooth-mogelijkheden, waardoor deze gemakkelijk verbinding kan maken met internet. Het fungeert als het brein van ons project en verzorgt de communicatie en aansturing van de LED-strip.
De WS2812 LED-strip bestaat uit individueel adresseerbare RGB-LED's, die kunnen worden aangestuurd om een breed scala aan kleuren weer te geven. Elke LED kan worden in- of uitgeschakeld en op elke kleur worden ingesteld via een enkele datalijn, waardoor het perfect is voor dynamische lichteffecten. De MQTT-broker faciliteert de communicatie tussen verschillende clients, waardoor gebruikers berichten kunnen publiceren en zich kunnen abonneren op onderwerpen die de LED-kleuren aansturen.
Datasheet Details
| Fabrikant | Adafruit |
|---|---|
| Onderdeelnummer | WS2812B |
| Logica/IO-spanning | 3,5 - 5,5 V |
| Voedingsspanning | 5 V |
| Uitgangsstroom (per kanaal) | 20 mA |
| Piekstroom (per kanaal) | 60 mA |
| PWM-frequentierichtlijn | 400 Hz |
| Ingangslogische drempels | 0,2Vcc (laag), 0,7Vcc (hoog) |
| Spanningsval / RDS(on) / verzadiging | 0,5 V |
| Thermische limieten | Bedrijfstemperatuur: -25 tot 85 °C |
| Behuizing | Individuele 5050 SMD |
| Opmerkingen / varianten | Beschikbaar in verschillende lengtes en configuraties |
- Zorg voor een adequate voeding voor de WS2812-strip om spanningsdalingen te voorkomen.
- Gebruik een gemeenschappelijke aarde tussen de ESP32 en de LED-strip.
- Houd datalijnen kort om signaalverslechtering te voorkomen.
- Overweeg een condensator (1000μF) over de voeding te plaatsen om spanningspieken af te vlakken.
- Gebruik geschikte weerstanden op de datalijn om signaalreflectie te voorkomen.
- Wees je bewust van de totale stroomafname van de LED-strip; gebruik externe voeding wanneer nodig.
Bedradingsinstructies
Om de ESP32 met de WS2812 LED-strip te bedraden, begin je met het aansluiten van de voeding. Verbind de rode draad van de LED-strip met een 5V-voedingsbron en de zwarte draad met de aarde. Verbind vervolgens de datalijn (gele draad) van de WS2812-strip met pin 14 op de ESP32. Zorg ervoor dat de ESP32 ook op dezelfde aarde is aangesloten als de LED-strip om een gemeenschappelijke referentie te behouden.
Nadat je de stroom- en dataverbindingen hebt ingesteld, verbind je de ESP32 met je computer via een micro-USB-kabel voor het programmeren. Je moet ervoor zorgen dat de ESP32 is ingeschakeld tijdens het programmeren om een verbinding tot stand te brengen. Zodra de bedrading is voltooid, kun je doorgaan met het uploaden van de code en het testen van de opstelling.

Codevoorbeelden & Uitleg
De code begint met het opnemen van de benodigde bibliotheken voor Wi-Fi- en MQTT-functionaliteit. De identifiers ssid en password worden gebruikt om je Wi-Fi-referenties op te slaan, terwijl mqtt_server het adres van de MQTT-broker bevat.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Vervolgens definiëren we de ondersteunde CheerLights-kleuren en hun bijbehorende RGB-waarden met behulp van arrays. Hierdoor heeft het programma gemakkelijk toegang tot de kleurinstellingen op basis van gebruikersinvoer.
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" ...};
De functie setup() initialiseert de seriële communicatie, stelt de Wi-Fi-verbinding in en bereidt de MQTT-client voor. Het start ook de LED-strip.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
De hoofdloop controleert continu de MQTT-verbinding en verwerkt inkomende berichten die de LED-kleuren aansturen. De functie callback() wordt geactiveerd wanneer een bericht wordt ontvangen op het geabonneerde onderwerp.
Demonstratie / Wat te Verwachten
Zodra alles is ingesteld en de code is geüpload, zou je de kleur van de WS2812-LED's moeten kunnen veranderen door berichten naar het MQTT-onderwerp te sturen. Als een andere gebruiker de kleur verandert, zullen alle verbonden apparaten de wijziging tegelijkertijd weerspiegelen. Wees voorzichtig met mogelijke problemen zoals omgekeerde polariteit of onjuiste verbindingen, die kunnen voorkomen dat de LED's correct functioneren (in video op mm:ss).
Videotijdstippen
- 00:00 Start
- 2:00 Introductie
- 3:48 Documentatiepagina
- 6:33 Bedrading uitgelegd
- 7:35 Arduino-code uitgelegd
- 15:03 ESP32-board en COMP-poort selecteren in Arduino IDE
- 16:46 CheerLights-demonstratie
/*********
: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>
// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";
// 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);
// 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) {
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()) {
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]) {
// 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]));
}
pixels.show();
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Common Course Links
Common Course Files
Hulpmiddelen en referenties
-
DocumentatieESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Bestanden📁
Geen bestanden beschikbaar.