ESP32 Упатство 47/55 - WS2812 CheerLights користејќи MQTT преку Интернет | SunFounder's ESP32 IoT комплет
Во ова упатство, ќе креираме синхронизиран систем за осветлување користејќи ESP32 и WS2812 LED диоди кои можат да се контролираат далечински преку MQTT. Овој систем им овозможува на повеќе корисници истовремено да ја менуваат бојата на светлата, создавајќи поврзано искуство без оглед на локацијата. Проектот го користи SunFounder ESP32 IoT комплетот, кој вклучува моќен микроконтролер со Wi-Fi можности, што го прави идеален за IoT апликации.
Низ видеото, ќе поминеме низ потребното поставување, жичање и имплементација на кодот за да го постигнеме овој ефект. Ако ви треба дополнително појаснување, задолжително проверете го видеото на одредени временски ознаки (во видео на mm:ss).
Објаснување на хардверот
Примарните компоненти на овој проект вклучуваат ESP32 микроконтролер, WS2812 LED лента и MQTT брокер. ESP32 е разноврсен микроконтролер со вградени Wi-Fi и Bluetooth можности, што му овозможува лесно да се поврзе на интернет. Тој служи како мозок на нашиот проект, управувајќи со комуникацијата и контролирајќи ја LED лентата.
WS2812 LED лентата се состои од поединечно адресирани RGB LED диоди, кои можат да се контролираат за прикажување на широк опсег на бои. Секоја LED диода може да се вклучи или исклучи и да се постави на која било боја користејќи една линија за податоци, што ја прави совршена за динамични ефекти на осветлување. MQTT брокерот ја олеснува комуникацијата помеѓу различни клиенти, овозможувајќи им на корисниците да објавуваат и да се претплатат на теми што ги контролираат боите на LED диодите.
Детали од техничката документација
| Производител | Adafruit |
|---|---|
| Број на дел | WS2812B |
| Логички/IO напон | 3.5 - 5.5 V |
| Напон на напојување | 5 V |
| Излезна струја (по канал) | 20 mA |
| Врвна струја (по канал) | 60 mA |
| Насоки за PWM фреквенција | 400 Hz |
| Праг на влезна логика | 0.2Vcc (ниско), 0.7Vcc (високо) |
| Пад на напон / RDS(on) / заситување | 0.5 V |
| Термички граници | Работна температура: -25 до 85 °C |
| Пакет | Поединечен 5050 SMD |
| Белешки / варијанти | Достапни во различни должини и конфигурации |
- Обезбедете соодветно напојување за WS2812 лентата за да избегнете падови на напон.
- Користете заедничка земја помеѓу ESP32 и LED лентата.
- Чувајте ги линиите за податоци кратки за да спречите деградација на сигналот.
- Размислете за користење кондензатор (1000μF) преку напојувањето за да ги изедначите напонските бранови.
- Користете соодветни отпорници на линијата за податоци за да спречите рефлексија на сигналот.
- Внимавајте на вкупната струја што ја повлекува LED лентата; користете надворешно напојување кога е потребно.
Инструкции за жичање
За да го жичате ESP32 со WS2812 LED лентата, започнете со поврзување на напојувањето. Поврзете ја црвената жица од LED лентата на 5V извор на напојување и црната жица на земја. Следно, поврзете ја линијата за податоци (жолта жица) од WS2812 лентата на пин 14 на ESP32. Осигурете се дека ESP32 е исто така поврзан на истата земја како и LED лентата за да се одржи заедничка референца.
По поставувањето на врските за напојување и податоци, поврзете го ESP32 на вашиот компјутер користејќи микро USB кабел за програмирање. Ќе треба да се осигурате дека ESP32 е вклучен додека програмирате за да воспоставите врска. Откако ќе се жича, можете да продолжите со поставување на кодот и тестирање на поставувањето.

Примери на код и објаснување
Кодот започнува со вклучување на потребните библиотеки за Wi-Fi и MQTT функционалност. Идентификаторите ssid и password се користат за складирање на вашите Wi-Fi акредитиви, додека mqtt_server ја содржи адресата на MQTT брокерот.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Следно, ги дефинираме поддржаните CheerLights бои и нивните соодветни RGB вредности користејќи низи. Ова му овозможува на програмата лесно да пристапи до поставките за боја врз основа на корисничкиот влез.
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" ...};
Функцијата setup() ја иницијализира сериската комуникација, ја поставува Wi-Fi врската и го подготвува MQTT клиентот. Исто така, ја започнува LED лентата.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Главната јамка континуирано ја проверува MQTT врската и обработува дојдовни пораки што ги контролираат боите на LED диодите. Функцијата callback() се активира кога ќе се прими порака на претплатената тема.
Демонстрација / Што да очекувате
Откако сè ќе биде поставено и кодот ќе се постави, треба да можете да ја менувате бојата на WS2812 LED диодите со испраќање пораки на MQTT темата. Ако друг корисник ја промени бојата, сите поврзани уреди ќе ја одразат промената истовремено. Бидете внимателни на потенцијални проблеми како обратен поларитет или неправилни врски, што може да спречат правилно функционирање на LED диодите (во видео на mm:ss).
Временски ознаки на видеото
- 00:00 Почеток
- 2:00 Вовед
- 3:48 Страница со документација
- 6:33 Објаснето поврзување
- 7:35 Објаснет Arduino код
- 15:03 Избор на ESP32 плоча и COMP порта во Arduino IDE
- 16:46 Демонстрација на 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
Resources & references
-
DocumentationESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Files📁
No files available.