ESP32 Tutoriaal 52/55 - WS2812 CheerLights MQTT Globale Sinchronisasie met LCD | SunFounder ESP32 IoT-kit
In hierdie tutoriaal gaan ons 'n CheerLights-projek skep met behulp van die ESP32, wat kleure wêreldwyd deur MQTT sal sinkroniseer. Hierdie projek sal nie net kleure verander op grond van insette van ander gebruikers nie, maar ook die huidige kleur en hoeveel keer dit opgedateer is op 'n LCD-skerm vertoon. Die uitkoms is 'n prettige demonstrasie van IoT-vermoëns, wat wys hoe toestelle kan interaksie en gebruikers verbind hou oor afstande. Vir addisionele verduideliking, kyk die video by (in video by 00:00).
Hardeware Verduidelik
Om hierdie projek te bou, sal jy 'n ESP32-mikrobeheerder, 'n WS2812-LED-strook en 'n LCD-skerm nodig hê. Die ESP32 dien as die brein van die operasie, en gebruik sy ingeboude Wi-Fi-vermoëns om aan die internet te koppel en MQTT-boodskappe te ontvang. Dit maak intydse opdaterings aan die LED-kleure moontlik op grond van 'n globale inset van ander gebruikers.
Die WS2812-LED-strook is 'n gewilde keuse vir projekte wat adresseerbare RGB-LED's vereis. Elke LED kan onafhanklik beheer word, wat ryk kleurvertonings moontlik maak. Die LCD sal 'n visuele bevestiging van die huidige kleur en die aantal kere wat dit verander is, verskaf, wat gebruikersinteraksie verbeter.
Datablad Besonderhede
| Vervaardiger | SunFounder |
|---|---|
| Deelnommer | ESP32 |
| Logika/IO-spanning | 3.3 V |
| Toevoerspanning | 5 V |
| Uitsetstroom (per kanaal) | 20 mA |
| Piekstroom (per kanaal) | 60 mA |
| PWM-frekwensie riglyn | 400 Hz |
| Inset logika drempels | 0.15 V (laag), 0.8 V (hoog) |
| Spanningsval / RDS(on) / versadiging | 0.2 V |
| Termiese limiete | 85 °C |
| Pakket | ESP32-module |
| Notas / variante | Sluit ingeboude Wi-Fi en Bluetooth in |
- Verseker behoorlike kragtoevoer na die ESP32 (5 V) en WS2812-strook (5 V).
- Gebruik 'n gemeenskaplike grond tussen die ESP32 en die LED-strook.
- Implementeer 'n behoorlike MQTT-broker vir kleursinkronisasie.
- Let op die data-penverbinding vir die WS2812 (pen 14 soos per die kode).
- Wees versigtig met die aantal LED's; die oorskry van kraglimiete vereis addisionele kragbronne.
Bedradingsinstruksies


Om die komponente te bedraad, begin deur die WS2812-LED-strook te koppel. Koppel die grondpen (gewoonlik swart) van die LED-strook aan die grondpen op die ESP32. Koppel dan die VCC-pen (gewoonlik rooi) van die LED-strook aan die 5V-uitset op die ESP32. Laastens, koppel die data-pen (dikwels geel) aan GPIO-pen 14 op die ESP32.
Vir die LCD, koppel die grondpen (dikwels swart) aan die grond op die ESP32. Die VCC-pen (gewoonlik rooi) moet aan die 5V-uitset gekoppel word. Die SDA-pen (tipies grys) koppel aan GPIO-pen 21, terwyl die SCL-pen (gewoonlik wit) aan GPIO-pen 22 koppel. Hierdie opstelling laat die ESP32 toe om met die LCD te kommunikeer en inligting soos nodig te vertoon.
Kode Voorbeelde & Deurloop
In die opstellingsfunksie initialiseer ons die LCD en koppel aan Wi-Fi. Die kode hieronder demonstreer hoe om die nodige biblioteke te definieer en die LCD op te stel:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // stel die LCD-adres
void setup() {
Serial.begin(115200);
lcd.init(); // initialiseer die lcd
lcd.backlight(); // Skakel die LCD-agterlig aan.
}
Dit initialiseer die LCD vir gebruik, wat dit toelaat om boodskappe te vertoon. Die volgende uittreksel wys hoe die Wi-Fi-verbinding tot stand gebring word:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //vir LCD
delay(500);
}
Serial.println("WiFi gekoppel");
}
Hierdie funksie stel 'n verbinding tot die gespesifiseerde Wi-Fi-netwerk, en vertoon 'n boodskap op die LCD terwyl dit koppel. Laastens word die kleurveranderingslogika in die terugroepfunksie hanteer:
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);
}
}
Hierdie funksie luister vir inkomende boodskappe op die "cheerlights"-onderwerp en werk die kleur dienooreenkomstig op. Die volledige kode laai onder die artikel, so maak seker om dit te hersien vir die volledige implementering.
Demonstrasie / Wat om te Verwacht
By voltooiing van die projek kan jy verwag dat die LED-strook kleure sal verander op grond van insette van 'n globale MQTT-voer. Die LCD sal die huidige kleurnaam en hoeveel keer dit verander is, vertoon. As jy die internet ontkoppel, sal die LCD "Connecting..." aandui totdat 'n verbinding hervestig word (in video by 12:30).
Algemene slaggate sluit in om te verseker dat die korrekte penne vir dataverbindings gebruik word en dat die Wi-Fi-geloofsbriewe akkuraat is. As daar enige teenstrydighede in die SSID of wagwoord is, sal die ESP32 nie koppel nie, en die LCD sal aanhou om die koppelboodskap te vertoon.
Video Tydstempels
- 00:00 Begin
- 1:59 Inleiding tot die projek
- 6:16 Bedrading verduidelik
- 8:13 Arduino-kode verduidelik
- 14:26 Kies ESP32-bord en COM-poort op Arduino IDE
- 16:07 CheerLight-demonstrasie 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
Hulpbronne en verwysings
-
DokumentasieESP32 Tutorial 52/55 - SunFounder doc page for CheerLightdocs.sunfounder.com
Lêers📁
Geen lêers beskikbaar.