ESP32 Оқулық 47/55 - WS2812 CheerLights интернет арқылы MQTT көмегімен | SunFounder ESP32 IoT жинағы
Бұл оқулықта біз ESP32 және WS2812 жарықдиодтарын қолданып, MQTT арқылы қашықтан басқаруға болатын синхрондалған жарықтандыру жүйесін жасаймыз. Бұл жүйе бірнеше пайдаланушыға шамдардың түсін бір уақытта өзгертуге мүмкіндік береді, орналасқан жеріне қарамастан байланысқан тәжірибе жасайды. Жоба SunFounder ESP32 IoT жинағын пайдаланады, ол Wi-Fi мүмкіндіктері бар қуатты микроконтроллерді қамтиды, бұл оны IoT қолданбалары үшін өте қолайлы етеді.
Бейне бойына біз бұл эффектіге жету үшін қажетті орнатуды, сымдарды қосуды және кодты іске асыруды қарастырамыз. Қосымша түсініктеме қажет болса, бейнені нақты уақыт белгілерінде тексеріңіз (бейнеде мм:сс).
Аппараттық құрал түсіндірмесі
Бұл жобаның негізгі компоненттеріне ESP32 микроконтроллері, WS2812 жарықдиодты жолағы және MQTT брокері кіреді. ESP32 - кірістірілген Wi-Fi және Bluetooth мүмкіндіктері бар әмбебап микроконтроллер, ол Интернетке оңай қосылуға мүмкіндік береді. Ол біздің жобамыздың миы ретінде қызмет етеді, байланысты басқарады және жарықдиодты жолақты басқарады.
WS2812 жарықдиодты жолағы жеке адрестелетін RGB жарықдиодтарынан тұрады, оларды түстердің кең ауқымын көрсету үшін басқаруға болады. Әрбір жарықдиодты бір деректер желісі арқылы қосуға немесе өшіруге және кез келген түске орнатуға болады, бұл оны динамикалық жарықтандыру эффектілері үшін өте қолайлы етеді. MQTT брокері әртүрлі клиенттер арасындағы байланысты жеңілдетеді, пайдаланушыларға жарықдиодты түстерді басқаратын тақырыптарға жариялауға және жазылуға мүмкіндік береді.
Деректер парағының мәліметтері
| Өндіруші | Adafruit |
|---|---|
| Бөлшек нөмірі | WS2812B |
| Логика/IO кернеуі | 3.5 - 5.5 В |
| Қоректендіру кернеуі | 5 В |
| Шығыс тогы (арнаға) | 20 мА |
| Ең жоғары ток (арнаға) | 60 мА |
| PWM жиілігі бойынша нұсқау | 400 Гц |
| Кіріс логикалық шектері | 0.2Vcc (төмен), 0.7Vcc (жоғары) |
| Кернеудің төмендеуі / RDS(on) / қанығу | 0.5 В |
| Жылулық шектеулер | Жұмыс температурасы: -25-тен 85 °C-қа дейін |
| Қаптама | Жеке 5050 SMD |
| Ескертулер / нұсқалар | Әртүрлі ұзындықтар мен конфигурацияларда қолжетімді |
- Кернеудің төмендеуін болдырмау үшін WS2812 жолағы үшін жеткілікті қуат көзін қамтамасыз етіңіз.
- ESP32 мен жарықдиодты жолақ арасында ортақ жерге қосуды пайдаланыңыз.
- Сигналдың нашарлауын болдырмау үшін деректер желілерін қысқа ұстаңыз.
- Кернеу шыңдарын тегістеу үшін қуат көзіне конденсаторды (1000μF) қолдануды қарастырыңыз.
- Сигналдың шағылысуын болдырмау үшін деректер желісінде тиісті резисторларды пайдаланыңыз.
- Жарықдиодты жолақтың жалпы ток тұтынуын ескеріңіз; қажет болғанда сыртқы қуатты пайдаланыңыз.
Сымдарды қосу нұсқаулары
ESP32-ні WS2812 жарықдиодты жолағымен қосу үшін қуат көзін жалғаудан бастаңыз. Жарықдиодты жолақтағы қызыл сымды 5В қуат көзіне, ал қара сымды жерге қосыңыз. Әрі қарай, WS2812 жолағының деректер желісін (сары сым) ESP32-дегі 14 пинге қосыңыз. ESP32-нің де жарықдиодты жолақпен бірдей жерге қосылғанына көз жеткізіңіз, бұл ортақ анықтаманы сақтау үшін қажет.
Қуат пен деректер қосылымдарын орнатқаннан кейін, бағдарламалау үшін 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 клиентін дайындайды. Ол сондай-ақ жарықдиодты жолақты бастайды.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Негізгі цикл MQTT қосылымын үнемі тексереді және жарықдиодты түстерді басқаратын кіріс хабарламаларды өңдейді. callback() функциясы жазылған тақырыпта хабарлама алынған кезде іске қосылады.
Демонстрация / Не күтуге болады
Барлығы орнатылып, код жүктелгеннен кейін, MQTT тақырыбына хабарламалар жіберу арқылы WS2812 жарықдиодтарының түсін өзгерте алуыңыз керек. Егер басқа пайдаланушы түсті өзгертсе, барлық қосылған құрылғылар өзгерісті бір уақытта көрсетеді. Полярлықтың ауысуы немесе дұрыс емес қосылымдар сияқты ықтимал ақауларға абай болыңыз, олар жарықдиодтардың дұрыс жұмыс істеуіне кедергі келтіруі мүмкін (бейнеде мм:сс).
Бейне уақыт белгілері
- 00:00 Бастау
- 2:00 Кіріспе
- 3:48 Құжаттама беті
- 6:33 Сымдарды қосу түсіндірілді
- 7:35 Arduino коды түсіндірілді
- 15:03 Arduino IDE-де ESP32 платасын және COMP портын таңдау
- 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
Ресурстар мен сілтемелер
-
ҚұжаттамаESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
Файлдар📁
Файлдар жоқ.