Návod ESP32 52/55 - WS2812 CheerLights MQTT Globálna synchronizácia s LCD | SunFounder ESP32 IoT kit
V tomto návode vytvoríme projekt CheerLights pomocou ESP32, ktorý bude globálne synchronizovať farby cez MQTT. Tento projekt nebude meniť farby len na základe vstupov od iných používateľov, ale tiež zobrazí aktuálnu farbu a počet jej aktualizácií na LCD obrazovke. Výsledkom je zábavná demonštrácia možností IoT, ktorá ukazuje, ako môžu zariadenia interagovať a udržiavať používateľov v spojení na diaľku. Pre ďalšie objasnenie si pozrite video (vo videu o 00:00).
Vysvetlenie hardvéru
Na zostavenie tohto projektu budete potrebovať mikrokontrolér ESP32, LED pás WS2812 a LCD displej. ESP32 slúži ako mozog operácie, pričom využíva svoje vstavané Wi-Fi schopnosti na pripojenie k internetu a príjem MQTT správ. To umožňuje aktualizácie farieb LED v reálnom čase na základe globálneho vstupu od iných používateľov.
LED pás WS2812 je obľúbenou voľbou pre projekty vyžadujúce adresovateľné RGB LED. Každá LED môže byť ovládaná nezávisle, čo umožňuje bohaté farebné zobrazenia. LCD poskytne vizuálne potvrdenie aktuálnej farby a počtu jej zmien, čím zvyšuje interakciu s používateľom.
Podrobnosti z datasheetu
| Výrobca | SunFounder |
|---|---|
| Označenie dielu | ESP32 |
| Logické/IO napätie | 3,3 V |
| Napájacie napätie | 5 V |
| Výstupný prúd (na kanál) | 20 mA |
| Špičkový prúd (na kanál) | 60 mA |
| Odporúčaná PWM frekvencia | 400 Hz |
| Vstupné logické úrovne | 0,15 V (nízka), 0,8 V (vysoká) |
| Pokles napätia / RDS(on) / saturácia | 0,2 V |
| Tepelné limity | 85 °C |
| Puzdro | Modul ESP32 |
| Poznámky / varianty | Zahŕňa vstavané Wi-Fi a Bluetooth |
- Zabezpečte správne napájanie ESP32 (5 V) a pásu WS2812 (5 V).
- Použite spoločnú zem medzi ESP32 a LED pásom.
- Implementujte správny MQTT broker na synchronizáciu farieb.
- Venujte pozornosť pripojeniu dátového pinu pre WS2812 (pin 14 podľa kódu).
- Buďte opatrní s počtom LED; prekročenie výkonových limitov vyžaduje ďalšie zdroje napájania.
Pokyny na zapojenie


Na zapojenie komponentov začnite pripojením LED pásu WS2812. Pripojte uzemňovací pin (zvyčajne čierny) LED pásu k uzemňovaciemu pinu na ESP32. Ďalej pripojte VCC pin (zvyčajne červený) LED pásu k 5V výstupu na ESP32. Nakoniec pripojte dátový pin (často žltý) na GPIO pin 14 na ESP32.
Pre LCD pripojte uzemňovací pin (často čierny) k zemi na ESP32. VCC pin (zvyčajne červený) by mal byť pripojený k 5V výstupu. SDA pin (zvyčajne sivý) sa pripája na GPIO pin 21, zatiaľ čo SCL pin (zvyčajne biely) sa pripája na GPIO pin 22. Toto nastavenie umožňuje ESP32 komunikovať s LCD a zobrazovať informácie podľa potreby.
Príklady kódu a vysvetlenie
Vo funkcii setup inicializujeme LCD a pripojíme sa k Wi-Fi. Kód nižšie ukazuje, ako definovať potrebné knižnice a nastaviť LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // nastavenie adresy LCD
void setup() {
Serial.begin(115200);
lcd.init(); // inicializácia LCD
lcd.backlight(); // Zapne podsvietenie LCD.
}
Toto inicializuje LCD na použitie, čo mu umožňuje zobrazovať správy. Nasledujúci výňatok ukazuje, ako sa vytvorí Wi-Fi pripojenie:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //pre LCD
delay(500);
}
Serial.println("WiFi pripojené");
}
Táto funkcia vytvorí pripojenie k určenej Wi-Fi sieti, pričom počas pripájania zobrazuje správu na LCD. Nakoniec je logika zmeny farby spracovaná vo funkcii 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);
}
}
Táto funkcia počúva prichádzajúce správy na téme "cheerlights" a podľa toho aktualizuje farbu. Celý kód sa načíta nižšie pod článkom, takže si ho určite preštudujte pre úplnú implementáciu.
Demonštrácia / Čo očakávať
Po dokončení projektu môžete očakávať, že LED pás bude meniť farby na základe vstupov z globálneho MQTT kanála. LCD zobrazí aktuálny názov farby a počet jej zmien. Ak odpojíte internet, LCD zobrazí "Pripájam sa..." (Connecting...), kým sa neobnoví pripojenie (vo videu o 12:30).
Medzi bežné úskalia patrí zabezpečenie správnych pinov pre dátové pripojenia a overenie presnosti prihlasovacích údajov Wi-Fi. Ak sa v SSID alebo hesle vyskytnú nezrovnalosti, ESP32 sa nepripojí a LCD bude naďalej zobrazovať správu o pripájaní.
Časové značky videa
- 00:00 Štart
- 1:59 Úvod do projektu
- 6:16 Vysvetlenie zapojenia
- 8:13 Vysvetlenie kódu pre Arduino
- 14:26 Výber dosky ESP32 a COM portu v Arduino IDE
- 16:07 Ukážka CheerLight s 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
Zdroje a referencie
-
DokumentáciaESP32 Tutorial 52/55 - SunFounder doc page for CheerLightdocs.sunfounder.com
Súbory📁
Žiadne súbory nie sú k dispozícii.