ESP32 Tutorijal 47/55 - WS2812 CheerLights koristeći MQTT preko interneta | SunFounder-ov ESP32 IoT komplet
U ovom tutorijalu ćemo kreirati sinhronizovani sistem osvetljenja koristeći ESP32 i WS2812 LED diode koje se mogu daljinski kontrolisati putem MQTT-a. Ovaj sistem omogućava više korisnika da istovremeno menjaju boju svetala, stvarajući povezano iskustvo bez obzira na lokaciju. Projekat koristi SunFounder ESP32 IoT komplet, koji uključuje moćan mikrokontroler sa Wi-Fi mogućnostima, što ga čini idealnim za IoT aplikacije.
Tokom videa, proći ćemo kroz neophodno podešavanje, povezivanje i implementaciju koda za postizanje ovog efekta. Ako vam je potrebno dodatno pojašnjenje, obavezno pogledajte video na određenim vremenskim oznakama (u videu na mm:ss).
Objašnjenje hardvera
Primarne komponente ovog projekta uključuju ESP32 mikrokontroler, WS2812 LED traku i MQTT broker. ESP32 je svestran mikrokontroler sa ugrađenim Wi-Fi i Bluetooth mogućnostima, što mu omogućava lako povezivanje na internet. On služi kao mozak našeg projekta, upravljajući komunikacijom i kontrolišući LED traku.
WS2812 LED traka se sastoji od pojedinačno adresabilnih RGB LED dioda, koje se mogu kontrolisati za prikaz širokog spektra boja. Svaka LED dioda se može uključiti ili isključiti i podesiti na bilo koju boju koristeći jednu liniju podataka, što je čini savršenom za dinamične svetlosne efekte. MQTT broker olakšava komunikaciju između različitih klijenata, omogućavajući korisnicima da objavljuju i pretplaćuju se na teme koje kontrolišu boje LED dioda.
Detalji iz tehničke dokumentacije
| Proizvođač | Adafruit |
|---|---|
| Broj dela | WS2812B |
| Logički/IO napon | 3.5 - 5.5 V |
| Napon napajanja | 5 V |
| Izlazna struja (po kanalu) | 20 mA |
| Maksimalna struja (po kanalu) | 60 mA |
| Preporuka za PWM frekvenciju | 400 Hz |
| Ulazni logički pragovi | 0.2Vcc (nisko), 0.7Vcc (visoko) |
| Pad napona / RDS(on) / zasićenje | 0.5 V |
| Termička ograničenja | Radna temperatura: -25 do 85 °C |
| Pakovanje | Pojedinačni 5050 SMD |
| Napomene / varijante | Dostupno u različitim dužinama i konfiguracijama |
- Osigurajte adekvatno napajanje za WS2812 traku kako biste izbegli padove napona.
- Koristite zajedničko uzemljenje između ESP32 i LED trake.
- Držite linije podataka kratkim kako biste sprečili degradaciju signala.
- Razmotrite korišćenje kondenzatora (1000μF) preko napajanja kako biste izgladili naponske šiljke.
- Koristite odgovarajuće otpornike na liniji podataka kako biste sprečili refleksiju signala.
- Budite svesni ukupne struje koju povlači LED traka; koristite eksterno napajanje kada je to neophodno.
Uputstva za povezivanje
Da biste povezali ESP32 sa WS2812 LED trakom, počnite povezivanjem napajanja. Povežite crvenu žicu sa LED trake na 5V izvor napajanja, a crnu žicu na uzemljenje. Zatim povežite liniju podataka (žutu žicu) sa WS2812 trake na pin 14 na ESP32. Uverite se da je ESP32 takođe povezan na isto uzemljenje kao i LED traka kako biste održali zajedničku referencu.
Nakon podešavanja napajanja i podatkovnih veza, povežite ESP32 sa računarom koristeći mikro USB kabl za programiranje. Moraćete da osigurate da je ESP32 uključen tokom programiranja kako biste uspostavili vezu. Kada je povezano, možete nastaviti sa otpremanjem koda i testiranjem podešavanja.

Primeri koda i objašnjenje
Kod počinje uključivanjem neophodnih biblioteka za Wi-Fi i MQTT funkcionalnost. Identifikatori ssid i password se koriste za čuvanje vaših Wi-Fi kredencijala, dok mqtt_server sadrži adresu MQTT brokera.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Zatim definišemo podržane CheerLights boje i njihove odgovarajuće RGB vrednosti koristeći nizove. Ovo omogućava programu lak pristup podešavanjima boja na osnovu korisničkog unosa.
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" ...};
Funkcija setup() inicijalizuje serijsku komunikaciju, podešava Wi-Fi vezu i priprema MQTT klijenta. Takođe pokreće LED traku.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Glavna petlja kontinuirano proverava MQTT vezu i obrađuje dolazne poruke koje kontrolišu boje LED dioda. Funkcija callback() se aktivira kada se primi poruka na pretplaćenu temu.
Demonstracija / Šta očekivati
Kada je sve podešeno i kod otpremljen, trebalo bi da budete u mogućnosti da promenite boju WS2812 LED dioda slanjem poruka na MQTT temu. Ako drugi korisnik promeni boju, svi povezani uređaji će istovremeno odraziti promenu. Budite oprezni na potencijalne probleme kao što su obrnuti polaritet ili nepravilne veze, koje bi mogle sprečiti ispravno funkcionisanje LED dioda (u videu na mm:ss).
Vremenske oznake videa
- 00:00 Početak
- 2:00 Uvod
- 3:48 Stranica dokumentacije
- 6:33 Objašnjeno povezivanje
- 7:35 Objašnjen Arduino kod
- 15:03 Odabir ESP32 ploče i COMP porta u Arduino IDE-u
- 16:46 Demonstracija CheerLights-a
/*********
: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
Resursi i reference
-
DokumentacijaESP32 Tutorial 47/55 - SunFounder doc page for cheer lightdocs.sunfounder.com
Datoteke📁
Nema dostupnih datoteka.