آموزش ESP32 52/55 - همگامسازی جهانی CheerLights WS2812 با MQTT و LCD | کیت اینترنت اشیاء SunFounder ESP32
در این آموزش، ما یک پروژه CheerLights با استفاده از ESP32 ایجاد خواهیم کرد که رنگها را بهصورت جهانی از طریق MQTT همگامسازی میکند. این پروژه نه تنها رنگها را بر اساس ورودی از کاربران دیگر تغییر میدهد، بلکه رنگ فعلی و تعداد دفعات بهروزرسانی آن را بر روی یک صفحه نمایش LCD نمایش میدهد. نتیجه یک نمایش سرگرمکننده از قابلیتهای IoT است که چگونه دستگاهها میتوانند با هم تعامل داشته باشند و کاربران را در فواصل دور متصل نگه دارند. برای توضیحات اضافی، ویدئو را در (در ویدئو در 00:00) تماشا کنید.
توضیح سختافزار
برای ساخت این پروژه، به یک میکروکنترلر ESP32، یک نوار LED WS2812 و یک نمایشگر LCD نیاز دارید. ESP32 به عنوان مغز عملیات عمل میکند و از قابلیتهای Wi-Fi داخلی خود برای اتصال به اینترنت و دریافت پیامهای MQTT استفاده میکند. این امکان بهروزرسانیهای لحظهای رنگهای LED را بر اساس ورودی جهانی از سایر کاربران فراهم میکند.
نوار LED WS2812 گزینهای محبوب برای پروژههایی است که به LEDهای RGB قابل آدرسدهی نیاز دارند. هر LED میتواند بهطور مستقل کنترل شود و این امکان نمایش رنگهای غنی را فراهم میکند. LCD تأیید بصری از رنگ جاری و تعداد دفعات تغییر آن را ارائه میدهد که تعامل کاربر را بهبود میبخشد.
جزئیات دیتاشیت
| تولیدکننده | سان فاندار |
|---|---|
| شماره قطعه | ESP32 |
| ولتاژ منطقی/ورودی و خروجی | ۳.۳ ولت |
| ولتاژ تغذیه | ۵ ولت |
| جریان خروجی (به ازای هر کانال) | ۲۰ میلیآمپر |
| جریان اوج (برای هر کانال) | 60 میلی آمپر |
| راهنمایی فرکانس PWM | ۳۰۰ هرتز |
| آستانههای منطقی ورودی | ۰.۱۵ ولت (پایین)، ۰.۸ ولت (بالا) |
| افت ولتاژ / RDS(on)/ اشباع | ۰.۲ ولت |
| محدودیتهای حرارتی | 85 درجه سانتیگراد |
| بسته | ماجیول ESP32 |
| یادداشتها / تنوعها | شامل Wi-Fi و بلوتوث داخلی است |
- تأمین منبع تغذیه مناسب برای ESP32 (۵ ولت) و نوار WS2812 (۵ ولت).
- از یک پایه مشترک بین ESP32 و نوار LED استفاده کنید.
- یک بروکر MQTT مناسب برای همگامسازی رنگ پیادهسازی کنید.
- به اتصالات پایه داده برای WS2812 توجه کنید (پایه 14 طبق شِفر (کود)).
- با تعداد LEDها احتیاط کنید؛ فراتر رفتن از محدودیتهای توان نیاز به منابع برق اضافی دارد.
دستورالعملهای سیمکشی


برای اتصال اجزا، ابتدا نوار LED WS2812 را وصل کنید. پایه زمین (معمولاً سیاه) نوار LED را به پایه زمین روی ESP32 متصل کنید. سپس پایه VCC (معمولاً قرمز) نوار LED را به خروجی 5V روی ESP32 وصل کنید. در نهایت، پایه داده (اغلب زرد) را به پایه GPIO 14 روی ESP32 متصل کنید.
برای ال سی دی، پایه زمین (معمولاً سیاه) را به زمین روی ESP32 متصل کنید. پایه VCC (که معمولاً قرمز است) باید به خروجی 5 ولت متصل شود. پایه SDA (معمولاً خاکستری) به پایه GPIO 21 متصل میشود، در حالی که پایه SCL (معمولاً سفید) به پایه GPIO 22 متصل میشود. این تنظیم به ESP32 اجازه میدهد تا با ال سی دی ارتباط برقرار کند و اطلاعات را به دلخواه نمایش دهد.
نمونههای شِفر (کود) و راهنمایی
در تابع راهاندازی، ما 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");
}این تابع یک اتصال به شبکه 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" گوش میدهد و رنگ را بهطور مناسب بهروزرسانی میکند. شِفر (کود) کامل زیر مقاله بارگذاری میشود، بنابراین مطمئن شوید که آن را برای پیادهسازی کامل بررسی کنید.
نمایش / چه انتظاراتی داشته باشیم
پس از اتمام پروژه، میتوانید انتظار داشته باشید که نوار LED بر اساس ورودیهای یک فید جهانی MQTT رنگها را تغییر دهد. LCD نام رنگ فعلی و تعداد دفعات تغییر آن را نمایش خواهد داد. اگر اینترنت را قطع کنید، LCD نشان میدهد "در حال اتصال..." تا زمانی که ارتباط دوباره برقرار شود (در ویدیو در ساعت ۱۲:۳۰).
دامهای رایج شامل اطمینان از این است که پایههای صحیح برای اتصالات داده استفاده میشوند و بررسی اینکه اعتبارنامههای Wi-Fi دقیق هستند. اگر در SSID یا گذرواژه هر گونه ناسازگاری وجود داشته باشد، ESP32 اتصال را برقرار نخواهد کرد و LCD به نمایش پیام در حال اتصال ادامه خواهد داد.
ویدئو زمانبندیها
- ۰۰:۰۰ شروع
- مقدمهای بر پروژه
- توضیح سیمکشی 6:16
- شِفر (کود) آردوینو در 8:13 توضیح داده شده است
- 14:26 انتخاب برد ESP32 و پورت COM در Arduino IDE
- نمایش CheerLight با LCD ساعت ۱۶:۰۷
/*
* این شِفر (کود) اصلی از Examples->iot_5_cheerlight شرکت SunFounder است.
* دستورالعملهای ویدیویی کامل https://youtu.be/xEqmxMiF-E8
* 📚⬇️ صفحه دانلود و منابع https://robojax.com/RJT685
*
* من السیدی را برای نمایش اضافه کردهام:
* ۱- نام رنگ
* ۲- شمارش تعداد دفعاتی که رنگ بهروزرسانی میشود
* ۳- نمایش بر روی السیدی اگر وایفای متصل باشد
* ۴- نمایش در حال اتصال اگر متصل نباشد یا قطع شده باشد
*
* نوشته احمد شمشیری
* www.Robojax.com
* ۲۹ دسامبر ۲۰۲۳
*
* :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>
// اس دی ای -> ۲۱، اس سی ال -> ۲۲
LiquidCrystal_I2C lcd(0x27, 16,2); // آدرس ال سی دی را برای یک نمایشگر 16 کاراکتری و 2 خطی به 0x27 تنظیم کنید
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>
// متغیرهای بعدی را با ترکیب SSID/رمز عبور خود جایگزین کنید
const char* ssid = "dars";
const char* password = "5152535455";
// آدرس MQTT Broker خود را افزودن کنید:
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); // خط ۰
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // خط ۱
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
فایلها📁
هیچ فایلی موجود نیست.