Samouczek ESP32 47/55 - WS2812 CheerLights z użyciem MQTT przez Internet | Zestaw IoT SunFounder ESP32
W tym samouczku stworzymy zsynchronizowany system oświetlenia wykorzystujący ESP32 i diody WS2812, który można zdalnie sterować przez MQTT. System ten pozwala wielu użytkownikom jednocześnie zmieniać kolor świateł, tworząc połączone doświadczenie niezależnie od lokalizacji. Projekt wykorzystuje zestaw SunFounder ESP32 IoT, który zawiera wydajny mikrokontroler z funkcjami Wi-Fi, co czyni go idealnym do zastosowań IoT.
W trakcie filmu omówimy niezbędną konfigurację, okablowanie i implementację kodu, aby osiągnąć ten efekt. Jeśli potrzebujesz dalszych wyjaśnień, sprawdź film w określonych znacznikach czasu (na filmie mm:ss).
Omówienie Sprzętu
Główne komponenty tego projektu to mikrokontroler ESP32, taśma LED WS2812 oraz broker MQTT. ESP32 to wszechstronny mikrokontroler z wbudowanym Wi-Fi i Bluetooth, co pozwala mu łatwo łączyć się z Internetem. Służy jako mózg naszego projektu, obsługując komunikację i sterując taśmą LED.
Taśma LED WS2812 składa się z indywidualnie adresowalnych diod RGB, które można sterować, aby wyświetlać szeroką gamę kolorów. Każda dioda może być włączona lub wyłączona i ustawiona na dowolny kolor za pomocą jednej linii danych, co czyni ją idealną do dynamicznych efektów świetlnych. Broker MQTT ułatwia komunikację między różnymi klientami, umożliwiając użytkownikom publikowanie i subskrybowanie tematów sterujących kolorami diod LED.
Szczegóły z Karty Katalogowej
| Producent | Adafruit |
|---|---|
| Numer części | WS2812B |
| Napięcie logiki/IO | 3,5 - 5,5 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,2 Vcc (niski), 0,7 Vcc (wysoki) |
| Spadek napięcia / RDS(on) / nasycenie | 0,5 V |
| Limity termiczne | Temperatura pracy: -25 do 85 °C |
| Obudowa | Pojedynczy SMD 5050 |
| Uwagi / warianty | Dostępne w różnych długościach i konfiguracjach |
- Zapewnij odpowiednie zasilanie dla taśmy WS2812, aby uniknąć spadków napięcia.
- Użyj wspólnej masy między ESP32 a taśmą LED.
- Utrzymuj krótkie linie danych, aby zapobiec degradacji sygnału.
- Rozważ użycie kondensatora (1000μF) na zasilaniu, aby wygładzić skoki napięcia.
- Użyj odpowiednich rezystorów na linii danych, aby zapobiec odbiciom sygnału.
- Zwracaj uwagę na całkowity pobór prądu taśmy LED; w razie potrzeby użyj zewnętrznego zasilania.
Instrukcje Okablowania
Aby podłączyć ESP32 do taśmy LED WS2812, zacznij od podłączenia zasilania. Podłącz czerwony przewód z taśmy LED do źródła zasilania 5 V, a czarny przewód do masy. Następnie podłącz linię danych (żółty przewód) z taśmy WS2812 do pinu 14 na ESP32. Upewnij się, że ESP32 jest również podłączony do tej samej masy co taśma LED, aby zachować wspólne odniesienie.
Po skonfigurowaniu połączeń zasilania i danych podłącz ESP32 do komputera za pomocą kabla micro USB w celu programowania. Musisz upewnić się, że ESP32 jest zasilany podczas programowania, aby nawiązać połączenie. Po podłączeniu możesz przejść do wgrania kodu i przetestowania konfiguracji.

Przykłady Kodu i Omówienie
Kod zaczyna się od dołączenia niezbędnych bibliotek do funkcji Wi-Fi i MQTT. Identyfikatory ssid i password służą do przechowywania danych logowania do Wi-Fi, podczas gdy mqtt_server przechowuje adres brokera MQTT.
const char* ssid = "SSID";
const char* password = "HASŁO";
const char* mqtt_server = "mqtt.cheerlights.com";
Następnie definiujemy obsługiwane kolory CheerLights i odpowiadające im wartości RGB za pomocą tablic. Pozwala to programowi na łatwy dostęp do ustawień kolorów na podstawie danych wejściowych użytkownika.
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" ...};
Funkcja setup() inicjalizuje komunikację szeregową, konfiguruje połączenie Wi-Fi i przygotowuje klienta MQTT. Rozpoczyna również pracę taśmy LED.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Główna pętla stale sprawdza połączenie MQTT i przetwarza przychodzące wiadomości sterujące kolorami diod LED. Funkcja callback() jest wyzwalana po otrzymaniu wiadomości na zasubskrybowanym temacie.
Demonstracja / Czego Się Spodziewać
Po skonfigurowaniu wszystkiego i wgraniu kodu powinieneś być w stanie zmienić kolor diod WS2812, wysyłając wiadomości na temat MQTT. Jeśli inny użytkownik zmieni kolor, wszystkie podłączone urządzenia odzwierciedlą tę zmianę jednocześnie. Uważaj na potencjalne problemy, takie jak odwrócona polaryzacja lub nieprawidłowe połączenia, które mogą uniemożliwić prawidłowe działanie diod LED (na filmie mm:ss).
Znaczniki Czasu Filmu
- 00:00 Start
- 2:00 Wprowadzenie
- 3:48 Strona dokumentacji
- 6:33 Wyjaśnienie podłączeń
- 7:35 Wyjaśnienie kodu Arduino
- 15:03 Wybór płytki ESP32 i portu COM w Arduino IDE
- 16:46 Demonstracja CheerLights
/*********
: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
Zasoby i odniesienia
-
DokumentacjaESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Pliki📁
Brak dostępnych plików.