دليل ESP32 52/55 - مزامنة عالمية لـ WS2812 CheerLights عبر MQTT مع شاشة LCD | مجموعة ESP32 IoT من SunFounder
في هذا الدرس، سنقوم بإنشاء مشروع CheerLights باستخدام ESP32، الذي سيسSynchronize الألوان على مستوى عالمي من خلال MQTT. لن يقوم هذا المشروع بتغيير الألوان بناءً على المدخلات من مستخدمين آخرين فحسب، بل سيعرض أيضًا اللون الحالي وعدد المرات التي تم تحديثه فيها على شاشة LCD. النتيجة هي عرض ممتع لإمكانات إنترنت الأشياء، يوضح كيف يمكن للأجهزة التفاعل والحفاظ على اتصال المستخدمين عبر المسافات. لمزيد من التوضيح، شاهد الفيديو في (في الفيديو عند 00:00).
شرح الأجهزة
لبناء هذا المشروع، ستحتاج إلى متحكم دقيق ESP32، وشريط LED WS2812، وشاشة LCD. يعمل ESP32 كدماغ العملية، مستفيدًا من قدراته المدمجة في الواي فاي للاتصال بالإنترنت واستقبال رسائل MQTT. وهذا يسمح بتحديثات فورية لألوان LED بناءً على مدخلات عالمية من مستخدمين آخرين.
شريط LED WS2812 هو خيار شائع للمشاريع التي تتطلب LEDs RGB قابلة للتوجيه. يمكن التحكم في كل LED بشكل مستقل، مما يسمح بعروض لونية غنية. ستوفر شاشة LCD تأكيدًا مرئيًا للون الحالي وعدد المرات التي تم تغييرها فيها، مما يعزز تفاعل المستخدم.
تفاصيل ورقة البيانات
| الصانع | صن فاوندير |
|---|---|
| رقم الجزء | ESP32 |
| جهد المنطق/إدخال/إخراج | ٣.٣ فولت |
| جهد التزويد | ٥ ف |
| تيار الخرج (لكل قناة) | 20 مللي أمبير |
| تيار الذروة (لكل قناة) | 60 مللي أمبير |
| توجيه تردد PWM | ٤٠٠ هرتز |
| عتبات منطق الإدخال | 0.15 فولت (منخفض)، 0.8 فولت (مرتفع) |
| فقدان الجهد / Rدي إس (أون)/ الإشباع | 0.2 فولت |
| الحدود الحرارية | 85 درجة مئوية |
| حزمة | وحدة ESP32 |
| ملاحظات / متغيرات | يحتوي على واي فاي وبلوتوث مدمجين |
- تأكد من توفير الطاقة المناسبة لـ ESP32 (5 فولت) وشريط WS2812 (5 فولت).
- استخدم أرضية مشتركة بين ESP32 وشريط LED.
- قم بتنفيذ خادم MQTT مناسب لمزامنة الألوان.
- انتبه إلى اتصال دبابيس البيانات لجهاز WS2812 (الدبوس 14 حسب الكود).
- كن حذرًا بشأن عدد مصابيح LED؛ تجاوز حدود الطاقة يتطلب مصادر طاقة إضافية.
تعليمات التوصيل


لربط المكونات، ابدأ بتوصيل شريط LED WS2812. قم بتوصيل دبوس الأرض (عادةً أسود) لشريط LED إلى دبوس الأرض على ESP32. بعد ذلك، قم بتوصيل دبوس VCC (عادةً أحمر) لشريط LED إلى مخرج 5 فولت على ESP32. أخيرًا، قم بتوصيل دبوس البيانات (غالبًا أصفر) إلى دبوس GPIO 14 على ESP32.
لشاشة LCD، قم بتوصيل دبوس الأرض (غالبًا أسود) بالأرض على ESP32. يجب توصيل دبوس VCC (عادةً أحمر) بمخرج 5V. يتصل دبوس SDA (عادةً رمادي) بدبوس GPIO رقم 21، بينما يتصل دبوس SCL (عادةً أبيض) بدبوس GPIO رقم 22. يتيح هذا الإعداد للـ ESP32 التواصل مع شاشة LCD وعرض المعلومات حسب الحاجة.
أمثلة على الشيفرة ودليل الاستخدام
في دالة الإعداد، نقوم بتهيئة شاشة LCD ونتصل بشبكة Wi-Fi. يعرض الكود أدناه كيفية تعريف المكتبات الضرورية وإعداد شاشة LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // set the LCD address
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
}هذا يقوم بتهيئة الشاشة LCD للاستخدام، مما يسمح لها بعرض الرسائل. المقتطف التالي يوضح كيفية إنشاء اتصال Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //for LCD
delay(500);
}
Serial.println("WiFi connected");
}تقوم هذه الوظيفة بإنشاء اتصال بشبكة الواي فاي المحددة، مع عرض رسالة على شاشة 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);
}
}تقوم هذه الوظيفة بالاستماع إلى الرسائل الواردة على موضوع "أضواء التشجيع" وتحديث اللون وفقًا لذلك. يتم تحميل الشيفرة الكاملة أدناه المقال، لذا تأكد من مراجعتها للحصول على التنفيذ الكامل.
عرض / ما يمكن توقعه
عند الانتهاء من المشروع، يمكنك توقع أن يتغير لون شريط LED بناءً على المدخلات من تغذية MQTT العالمية. ستعرض شاشة LCD اسم اللون الحالي وعدد مرات تغييره. إذا قمت بفصل الاتصال بالإنترنت، ستشير شاشة LCD إلى "جارٍ الاتصال..." حتى يتم إعادة الاتصال (في الفيديو عند 12:30).
تشمل pitfalls الشائعة التأكد من استخدام الدبابيس الصحيحة للاتصالات البيانات والتحقق من دقة بيانات اعتماد الواي فاي. إذا كانت هناك أي تناقضات في SSID أو كلمة المرور، ستفشل ESP32 في الاتصال، وستستمر شاشة LCD في عرض رسالة الاتصال.
طوابق الفيديو
- 00:00 بداية
- مقدمة للمشروع
- 6:16 توصيل الأسلاك موضح
- 8:13 شرح كود أردوينو
- 14:26 اختيار لوحة ESP32 ومنفذ COM على Arduino IDE
- 16:07 عرض CheerLight مع شاشة LCD
/*
* هذا هو الكود الأصلي من أمثلة->iot_5_cheerlight من SunFounder
* دليل الفيديو الكامل https://youtu.be/xEqmxMiF-E8
* 📚⬇️ صفحة التحميل والموارد https://robojax.com/RJT685
*
* لقد أضفت شاشة LCD لعرض:
* 1- اسم اللون
* 2- عدد مرات تحديث اللون
* 3- عرض على LCD إذا كان الواي فاي متصلًا
* 4- عرض "جاري الاتصال" إذا لم يكن متصلاً أو تم فصل الاتصال
*
* كتب بواسطة أحمد شمشيري
* www.Robojax.com
* 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); // قم بتعيين عنوان LCD إلى 0x27 لشاشة بها 16 حرفًا وخطان.
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>
// استبدل المتغيرات التالية بمزيج اسم الشبكة/Wi-Fi وكلمة المرور الخاصة بك
const char* ssid = "dars";
const char* password = "5152535455";
// أدخل عنوان خادم MQTT الخاص بك:
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;
// حدد الألوان المدعومة ل CheerLights وقيم RGB الخاصة بها
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // أحمر
255, 192, 203, // وردي
0, 255, 0, // أخضر
0, 0, 255, // أزرق
0, 255, 255, // سماوي
255, 255, 255, // أبيض
255, 223, 223, // دافئ أبيض
255, 223, 223, // دانتيل قديم
128, 0, 128, // أرجواني
255, 0, 255, // ماجنتا
255, 255, 0, // أصفر
255, 165, 0}; // برتقال
// تهيئة شريط RGB
#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(); // تهيئة الشاشة LCD
lcd.backlight(); // يشعل الإضاءة الخلفية لشاشة LCD.
// إعدادات الواي فاي الافتراضية
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// شريط rgb ابدأ
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// نبدأ بالاتصال بشبكة الواي فاي
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); // لـ 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 (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// استمر في الحلقة حتى نعيد الاتصال
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// محاولة للاتصال
if (client.connect(unique_identifier)) {
Serial.println("connected");
// اشترك
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// انتظر 5 ثوانٍ قبل المحاولة مرة أخرى
delay(5000);
}
}
}
void setColor(String color) {
// مرر عبر قائمة الألوان للعثور على اللون المطابق
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex; // تذكر آخر لون
colorCount++; // زيادة العدد
// قم بتحديد لون كل نيوبكسل على الشريط
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); // خط 0
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // السطر 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();
// الصف الأول
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
// الصف الثاني
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000); // يجب أن ننتظر بعض الوقت لنتمكن من قراءة الشاشة.
}
Common Course Links
Common Course Files
الموارد والمراجع
-
توثيقدليل ESP32 52/55 - صفحة مستندات SunFounder لـ CheerLightdocs.sunfounder.com
ملفات📁
لا توجد ملفات متاحة.