ESP32 Tutoriaal 47/55 - WS2812 CheerLights met MQTT oor die Internet | SunFounder se ESP32 IoT-kit
In hierdie tutoriaal gaan ons 'n gesinchroniseerde beligtingstelsel skep met behulp van die ESP32 en WS2812 LED's wat op afstand via MQTT beheer kan word. Hierdie stelsel stel veelvuldige gebruikers in staat om die kleur van die ligte gelyktydig te verander, wat 'n gekoppelde ervaring skep ongeag ligging. Die projek gebruik die SunFounder ESP32 IoT-kit, wat 'n kragtige mikrobeheerder met Wi-Fi-vermoëns insluit, wat dit ideaal maak vir IoT-toepassings.
Deur die video sal ons deur die nodige opstelling, bedrading en kode-implementering stap om hierdie effek te bereik. As jy verdere verduideliking nodig het, maak seker dat jy die video by spesifieke tydstempels nagaan (in video by mm:ss).
Hardeware Verduidelik
Die primêre komponente van hierdie projek sluit die ESP32-mikrobeheerder, WS2812 LED-strook en 'n MQTT-broker in. Die ESP32 is 'n veelsydige mikrobeheerder met ingeboude Wi-Fi- en Bluetooth-vermoëns, wat dit maklik laat verbind tot die internet. Dit dien as die brein van ons projek, en hanteer die kommunikasie en beheer van die LED-strook.
Die WS2812 LED-strook bestaan uit individueel adresseerbare RGB LED's, wat beheer kan word om 'n wye reeks kleure te vertoon. Elke LED kan aan- of afgeskakel word en op enige kleur gestel word met behulp van 'n enkele datalyne, wat dit perfek maak vir dinamiese beligtingseffekte. Die MQTT-broker fasiliteer die kommunikasie tussen verskillende kliënte, wat gebruikers in staat stel om op onderwerpe te publiseer en in te teken wat die LED-kleure beheer.
Datablad Besonderhede
| Vervaardiger | Adafruit |
|---|---|
| Deelnommer | WS2812B |
| Logika/IO-spanning | 3.5 - 5.5 V |
| Toevoerspanning | 5 V |
| Uitsetstroom (per kanaal) | 20 mA |
| Piekstroom (per kanaal) | 60 mA |
| PWM-frekwensie riglyn | 400 Hz |
| Inset logika drempels | 0.2Vcc (laag), 0.7Vcc (hoog) |
| Spanningsval / RDS(on) / versadiging | 0.5 V |
| Termiese limiete | Werkingstemperatuur: -25 tot 85 °C |
| Pakket | Individuele 5050 SMD |
| Notas / variante | Beskikbaar in verskeie lengtes en konfigurasies |
- Verseker voldoende kragtoevoer vir die WS2812-strook om spanningsval te vermy.
- Gebruik 'n gemeenskaplike grond tussen die ESP32 en die LED-strook.
- Hou datalyne kort om seingebrek te voorkom.
- Oorweeg die gebruik van 'n kapasitor (1000μF) oor die kragtoevoer om spanningspulse glad te maak.
- Gebruik toepaslike resistors op die datalyne om seinrefleksie te voorkom.
- Wees bewus van die totale stroomtrekking van die LED-strook; gebruik eksterne krag wanneer nodig.
Bedradingsinstruksies
Om die ESP32 met die WS2812 LED-strook te bedraad, begin deur die kragtoevoer te koppel. Verbind die rooi draad van die LED-strook aan 'n 5V-kragbron en die swart draad aan die grond. Verbind dan die datalyne (geel draad) van die WS2812-strook aan pen 14 op die ESP32. Maak seker dat die ESP32 ook aan dieselfde grond as die LED-strook gekoppel is om 'n gemeenskaplike verwysing te handhaaf.
Na die opstel van die krag- en dataverbindings, koppel die ESP32 aan jou rekenaar met behulp van 'n mikro-USB-kabel vir programmering. Jy sal moet verseker dat die ESP32 aangeskakel is tydens programmering om 'n verbinding te vestig. Sodra dit bedraad is, kan jy voortgaan om die kode op te laai en die opstelling te toets.

Kode Voorbeelde & Deurloop
Die kode begin deur die nodige biblioteke vir Wi-Fi- en MQTT-funksionaliteit in te sluit. Die identifiseerders ssid en password word gebruik om jou Wi-Fi-geloofsbriewe te stoor, terwyl mqtt_server die adres van die MQTT-broker bevat.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Vervolgens definieer ons die ondersteunde CheerLights-kleure en hul ooreenstemmende RGB-waardes deur gebruik te maak van skikkings. Dit laat die program toe om maklik toegang tot die kleurinstellings te verkry op grond 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" ...};
Die setup()-funksie initialiseer die seriekommunikasie, stel die Wi-Fi-verbinding op, en berei die MQTT-kliënt voor. Dit begin ook die LED-strook.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Die hoof-lus kontroleer voortdurend die MQTT-verbinding en verwerk inkomende boodskappe wat die LED-kleure beheer. Die callback()-funksie word geaktiveer wanneer 'n boodskap op die geabonneerde onderwerp ontvang word.
Demonstrasie / Wat om te VerwAg
Sodra alles opgestel is en die kode opgelaai is, behoort jy die kleur van die WS2812 LED's te kan verander deur boodskappe na die MQTT-onderwerp te stuur. As 'n ander gebruiker die kleur verander, sal alle gekoppelde toestelle die verandering gelyktydig weerspieël. Wees versigtig vir potensiële probleme soos omgekeerde polariteit of verkeerde verbindings, wat kan verhoed dat die LED's korrek funksioneer (in video by mm:ss).
Video Tydstempels
- 00:00 Begin
- 2:00 Inleiding
- 3:48 Dokumentasie-bladsy
- 6:33 Bedrading verduidelik
- 7:35 Arduino-kode verduidelik
- 15:03 Kies ESP32-bord en COMP-poort in Arduino IDE
- 16:46 CheerLighs-demonstrasie
/*********
: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
Hulpbronne en verwysings
-
DokumentasieESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Lêers📁
Geen lêers beskikbaar.