Poradnik ESP32 52/55 - WS2812 CheerLights MQTT Global Sync z LCD | SunFounder ESP32 IoT kit
W tym samouczku stworzymy projekt CheerLights z użyciem ESP32, który będzie synchronizował kolory globalnie przez MQTT. Projekt ten nie tylko będzie zmieniał kolory na podstawie danych wejściowych od innych użytkowników, ale także wyświetlał bieżący kolor oraz liczbę jego aktualizacji na ekranie LCD. Efektem będzie zabawna demonstracja możliwości IoT, pokazująca, jak urządzenia mogą współdziałać i utrzymywać kontakt między użytkownikami na odległość. Aby uzyskać dodatkowe wyjaśnienia, obejrzyj wideo (na wideo w 00:00).
Wyjaśnienie sprzętu
Do zbudowania tego projektu potrzebny będzie mikrokontroler ESP32, pasek LED WS2812 oraz wyświetlacz LCD. ESP32 pełni rolę mózgu operacji, wykorzystując wbudowane możliwości Wi-Fi do połączenia z internetem i odbierania wiadomości MQTT. Umożliwia to aktualizacje kolorów LED w czasie rzeczywistym na podstawie globalnych danych wejściowych od innych użytkowników.
Pasek LED WS2812 to popularny wybór do projektów wymagających adresowalnych diod RGB. Każda dioda może być sterowana niezależnie, co pozwala na bogate wyświetlanie kolorów. LCD zapewni wizualne potwierdzenie bieżącego koloru oraz liczby jego zmian, zwiększając interakcję z użytkownikiem.
Szczegóły z karty katalogowej
| Producent | SunFounder |
|---|---|
| Numer części | ESP32 |
| Napięcie logiki/IO | 3,3 V |
| Napięcie zasilania | 5 V |
| Prąd wyjściowy (na kanał) | 20 mA |
| Prąd szczytowy (na kanał) | 60 mA |
| Zalecana częstotliwość PWM | 400 Hz |
| Progi logiczne wejścia | 0,15 V (niski), 0,8 V (wysoki) |
| Spadek napięcia / RDS(on) / nasycenie | 0,2 V |
| Limity termiczne | 85 °C |
| Obudowa | Moduł ESP32 |
| Uwagi / warianty | Obejmuje wbudowane Wi-Fi i Bluetooth |
- Zapewnij prawidłowe zasilanie ESP32 (5 V) i paska WS2812 (5 V).
- Użyj wspólnej masy między ESP32 a paskiem LED.
- Zaimplementuj odpowiedni broker MQTT do synchronizacji kolorów.
- Zwróć uwagę na połączenie pinu danych dla WS2812 (pin 14 zgodnie z kodem).
- Zachowaj ostrożność z liczbą diod LED; przekroczenie limitów mocy wymaga dodatkowych źródeł zasilania.
Instrukcje podłączenia


Aby podłączyć komponenty, zacznij od podłączenia paska LED WS2812. Podłącz pin masy (zwykle czarny) paska LED do pinu masy na ESP32. Następnie podłącz pin VCC (zwykle czerwony) paska LED do wyjścia 5V na ESP32. Na koniec podłącz pin danych (często żółty) do pinu GPIO 14 na ESP32.
Dla LCD podłącz pin masy (często czarny) do masy na ESP32. Pin VCC (zwykle czerwony) powinien być podłączony do wyjścia 5V. Pin SDA (zazwyczaj szary) łączy się z pinem GPIO 21, podczas gdy pin SCL (zwykle biały) łączy się z pinem GPIO 22. Ta konfiguracja umożliwia ESP32 komunikację z LCD i wyświetlanie informacji w razie potrzeby.
Przykłady kodu i omówienie
W funkcji setup inicjalizujemy LCD i łączymy się z Wi-Fi. Poniższy kod pokazuje, jak zdefiniować niezbędne biblioteki i skonfigurować LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // ustaw adres LCD
void setup() {
Serial.begin(115200);
lcd.init(); // inicjalizacja LCD
lcd.backlight(); // Włącza podświetlenie LCD.
}
To inicjalizuje LCD do użycia, umożliwiając wyświetlanie komunikatów. Następny fragment pokazuje, jak nawiązywane jest połączenie Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //dla LCD
delay(500);
}
Serial.println("WiFi connected");
}
Ta funkcja nawiązuje połączenie z określoną siecią Wi-Fi, wyświetlając komunikat na LCD podczas łączenia. Na koniec logika zmiany koloru jest obsługiwana w funkcji wywołania zwrotnego:
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);
}
}
Ta funkcja nasłuchuje przychodzących wiadomości na temacie "cheerlights" i odpowiednio aktualizuje kolor. Pełny kod znajduje się poniżej artykułu, więc upewnij się, że go przejrzałeś, aby zobaczyć kompletną implementację.
Demonstracja / Czego się spodziewać
Po ukończeniu projektu możesz spodziewać się, że pasek LED będzie zmieniał kolory na podstawie danych z globalnego źródła MQTT. LCD będzie wyświetlać nazwę bieżącego koloru oraz liczbę jego zmian. Jeśli odłączysz internet, LCD wskaże "Connecting..." (Łączenie...) do czasu ponownego nawiązania połączenia (na wideo w 12:30).
Typowe pułapki obejmują upewnienie się, że używane są prawidłowe piny do połączeń danych oraz weryfikację poprawności danych logowania Wi-Fi. Jeśli wystąpią jakiekolwiek rozbieżności w SSID lub haśle, ESP32 nie połączy się, a LCD będzie nadal wyświetlać komunikat o łączeniu.
Znaczniki czasu wideo
- 00:00 Start
- 1:59 Wprowadzenie do projektu
- 6:16 Wyjaśnienie podłączeń
- 8:13 Wyjaśnienie kodu Arduino
- 14:26 Wybór płytki ESP32 i portu COM w Arduino IDE
- 16:07 Demonstracja CheerLight z wyświetlaczem 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
Zasoby i odniesienia
-
DokumentacjaESP32 Tutorial 52/55- SunFounder doc page for CheerLightdocs.sunfounder.com
Pliki📁
Brak dostępnych plików.