ESP32 Оқулығы 52/55 - WS2812 CheerLights MQTT жаһандық синхрондау LCD-пен | SunFounder ESP32 IoT жиынтығы
Бұл оқулықта біз ESP32 көмегімен CheerLights жобасын жасаймыз, ол MQTT арқылы түстерді жаһандық деңгейде синхрондайды. Бұл жоба басқа пайдаланушылардың енгізулеріне негізделген түстерді өзгертіп қана қоймай, сонымен қатар ағымдағы түсті және оның қанша рет жаңартылғанын LCD экранда көрсетеді. Нәтиже — IoT мүмкіндіктерінің қызықты демонстрациясы, құрылғылардың өзара әрекеттесуін және пайдаланушылардың қашықтыққа қарамастан байланыста болуын көрсетеді. Қосымша түсініктеме алу үшін бейнені қараңыз (бейнеде 00:00).
Аппараттық құрал түсіндірмесі
Бұл жобаны құру үшін сізге ESP32 микроконтроллері, WS2812 жарықдиодты жолағы және LCD дисплей қажет. ESP32 операцияның миы ретінде қызмет етеді, оның кірістірілген Wi-Fi мүмкіндіктерін пайдаланып интернетке қосылады және MQTT хабарламаларын қабылдайды. Бұл басқа пайдаланушылардың жаһандық енгізуіне негізделген жарықдиодты түстерді нақты уақытта жаңартуға мүмкіндік береді.
WS2812 жарықдиодты жолағы — мекенжайланатын RGB жарықдиодтарын қажет ететін жобалар үшін танымал таңдау. Әрбір жарықдиодты тәуелсіз басқаруға болады, бұл бай түс дисплейлерін жасауға мүмкіндік береді. LCD ағымдағы түстің және оның өзгерту санының визуалды растауын қамтамасыз етеді, пайдаланушының өзара әрекеттесуін жақсартады.
Деректер парағының мәліметтері
| Өндіруші | SunFounder |
|---|---|
| Бөлшек нөмірі | ESP32 |
| Логика/IO кернеуі | 3.3 В |
| Қоректендіру кернеуі | 5 В |
| Шығыс тогы (арнаға) | 20 мА |
| Ең жоғары ток (арнаға) | 60 мА |
| PWM жиілігі бойынша нұсқау | 400 Гц |
| Кіріс логикалық шектері | 0.15 В (төмен), 0.8 В (жоғары) |
| Кернеу төмендеуі / RDS(on) / қанығу | 0.2 В |
| Жылулық шектер | 85 °C |
| Қаптама | ESP32 модулі |
| Ескертулер / нұсқалар | Кірістірілген Wi-Fi және Bluetooth қамтиды |
- ESP32 (5 В) және WS2812 жолағына (5 В) дұрыс қоректендіруді қамтамасыз етіңіз.
- ESP32 мен жарықдиодты жолақ арасында ортақ жерді пайдаланыңыз.
- Түстерді синхрондау үшін дұрыс MQTT брокерін енгізіңіз.
- WS2812 үшін деректер істікшесінің қосылымына назар аударыңыз (кодқа сәйкес 14 істікше).
- Жарықдиодтар санына абай болыңыз; қуат шектерінен асып кету қосымша қуат көздерін қажет етеді.
Сым қосу нұсқаулары


Компоненттерді қосу үшін WS2812 жарықдиодты жолағын қосудан бастаңыз. Жарықдиодты жолақтың жер істікшесін (әдетте қара) ESP32-дегі жер істікшесіне қосыңыз. Содан кейін жарықдиодты жолақтың VCC істікшесін (әдетте қызыл) ESP32-дегі 5В шығысына қосыңыз. Соңында, деректер істікшесін (көбінесе сары) ESP32-дегі GPIO 14 істікшесіне қосыңыз.
LCD үшін жер істікшесін (көбінесе қара) ESP32-дегі жерге қосыңыз. VCC істікшесі (әдетте қызыл) 5В шығысына қосылуы керек. SDA істікшесі (әдетте сұр) GPIO 21 істікшесіне, ал SCL істікшесі (әдетте ақ) GPIO 22 істікшесіне қосылады. Бұл орнату ESP32-ге LCD-пен байланысуға және қажетті ақпаратты көрсетуге мүмкіндік береді.
Код мысалдары және түсіндірме
Орнату функциясында біз LCD-ді инициализациялаймыз және Wi-Fi-ға қосыламыз. Төмендегі код қажетті кітапханаларды анықтау және LCD-ді орнату жолын көрсетеді:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // LCD мекенжайын орнату
void setup() {
Serial.begin(115200);
lcd.init(); // LCD инициализациялау
lcd.backlight(); // LCD артқы жарығын қосу.
}
Бұл LCD-ді пайдалануға инициализациялайды, хабарламаларды көрсетуге мүмкіндік береді. Келесі үзінді Wi-Fi қосылымының қалай орнатылғанын көрсетеді:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //LCD үшін
delay(500);
}
Serial.println("WiFi қосылды");
}
Бұл функция көрсетілген Wi-Fi желісіне қосылымды орнатады, қосылу кезінде LCD-де хабарлама көрсетеді. Соңында, түс өзгерту логикасы қайта шақыру функциясында өңделеді:
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);
}
}
Бұл функция "cheerlights" тақырыбындағы кіріс хабарламаларды тыңдайды және түсті сәйкесінше жаңартады. Толық код мақаланың астында жүктеледі, сондықтан толық іске асыру үшін оны қарап шығуды ұмытпаңыз.
Демонстрация / Не күтуге болады
Жобаны аяқтағаннан кейін, жарықдиодты жолақтың жаһандық MQTT ағынынан енгізулерге негізделген түстерді өзгертетінін күтуге болады. LCD ағымдағы түс атауын және оның қанша рет өзгертілгенін көрсетеді. Егер интернеттен ажыратсаңыз, LCD қайта қосылғанға дейін "Қосылуда..." деп көрсетеді (бейнеде 12:30).
Жиі кездесетін қателіктерге деректер қосылымдары үшін дұрыс істікшелердің қолданылуын қамтамасыз ету және Wi-Fi тіркелгі деректерінің дәлдігін тексеру жатады. Егер SSID немесе құпия сөзде сәйкессіздіктер болса, ESP32 қосыла алмайды және LCD қосылу хабарламасын көрсетуді жалғастырады.
Бейне уақыт белгілері
- 00:00 Бастау
- 1:59 Жобаға кіріспе
- 6:16 Сымдарды қосу түсіндірмесі
- 8:13 Arduino коды түсіндірмесі
- 14:26 Arduino IDE-де ESP32 платасын және COM портын таңдау
- 16:07 LCD-мен CheerLight демонстрациясы
/*********
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
Ресурстар мен сілтемелер
-
ҚұжаттамаESP32 Tutorial 52/55- SunFounder doc page for CheerLightdocs.sunfounder.com
Файлдар📁
Файлдар жоқ.