آموزش ESP32 54/55 - تنظیم رنگ نوار LED WS2812 از طریق Wifi | کیت آموزشی IoT ESP32 سانفایندر
در این آموزش، ما یاد خواهیم گرفت که چگونه رنگ نوار LED RGB WS2812 را با استفاده از میکروکنترلر ESP32 از طریق Wi-Fi کنترل کنیم. با استفاده از یک انتخابگر رنگ، میتوانید رنگهای مختلف را از دستگاه موبایل یا دسکتاپ خود انتخاب کرده و آن اطلاعات را به نوار LED ارسال کنید. این پروژه قابلیتهای ESP32 را به نمایش میگذارد و اجازه میدهد که ارتباط بدون درز با نورپردازی LED از طریق یک رابط وب برقرار شود.
میکروکنترلر ESP32 با هر دو Wi-Fi و بلوتوث مجهز است، که آن را به گزینهای چندکاره برای برنامههای IoT تبدیل میکند. در این پروژه، تمرکز ما بر روی قابلیت Wi-Fi برای کنترل نوار LED خواهد بود. کاربران قادر خواهند بود رنگها را به صورت پویا انتخاب کنند و تجربهای بصری جذاب ایجاد کنند. برای وضوح بیشتر در مورد این پروژه، حتماً ویدیو در (در ویدیو در 00:00) را مشاهده کنید.
توضیحاتی درباره سختافزار
مؤلفههای اصلی این پروژه شامل میکروکنترلر ESP32 و نوار LED WS2812 است. ESP32 یک میکروکنترلر قوی با قابلیتهای Wi-Fi داخلی است که ارتباط و کنترل بیسیم را امکانپذیر میکند.
نواری LED WS2812 شامل LED های RGB قابل آدرسدهی بهصورت جداگانه است که به شما این امکان را میدهد که رنگ هر LED را بهطور مستقل تنظیم کنید. هر LED شامل یک مدار کنترل و یک LED RGB در یک بسته واحد است که سیمکشی و کنترل چندین LED را ساده میکند.
جزئیات برگه اطلاعات
| تولیدکننده | ورلدسمی |
|---|---|
| شماره قطعه | WS2812B |
| ولتاژ منطقی/ورودی و خروجی | ۳.۵-۵.۳ ولت |
| ولتاژ تامین | ۵ ولت |
| خروجی جریان (به ازای هر کانال) | ۲۰ میلی آمپر |
| جریان اوج (به ازای هر کانال) | 60 میلیآمپر |
| راهنمایی فرکانس PWM | ۴۰۰ هرتز |
| آستانههای منطقی ورودی | ۰.۳ × VDD (پایین)، ۰.۷ × VDD (بالا) |
| افت ولتاژ / RDS(روشن)/ اشباع | 0.5 ولت |
| محدودیتهای حرارتی | -40 تا +80 درجه سلسیوس |
| بسته | 5050 اس ام دی |
| یادداشتها / انواع | در اندازهها و پیکربندیهای مختلف در دسترس است. |
- تأمین منبع تغذیه مناسب تا از آسیب به LED ها جلوگیری گردد.
- از یک پایه مشترک بین ESP32 و نوار LED استفاده کنید.
- خطوط داده را کوتاه نگه دارید تا از کاهش کیفیت سیگنال جلوگیری شود.
- اضافه کردن یک خازن (1000 میکروفاراد) به موازات منبع تغذیه برای پایداری را در نظر بگیرید.
- از یک مقاومت (۴۷۰ اهم) در خط داده برای یکپارچگی سیگنال استفاده کنید.
دستورات سیمکشی

برای اتصال ESP32 به نوار LED WS2812، اجزاء را به شرح زیر وصل کنید: ابتدا، پایه ۵ ولت نوار LED را به خروجی ۵ ولت ESP32 متصل کنید. سپس، پایه زمین (GND) نوار LED را به یک پایه GND روی ESP32 متصل کنید. در نهایت، پایه داده نوار LED (که معمولاً با DI یا Data In علامتگذاری شده) را به پایه GPIO ۱۳ روی ESP32 متصل کنید. مطمئن شوید که تمام اتصالات محکم هستند تا کارکرد صحیح تضمین شود.
در ویدیو، روشهای سیمکشی جایگزین بهطور مختصر ذکر شده است، اما تنظیماتی که در اینجا توصیف شده است، پیکربندی توصیهشده برای عملکرد بهینه است (در ویدیو در :00).
نمونههای شِفر (کود) و راهنما
شِفر (کود) با اضافه کردن کتابخانههای لازم برای کنترل نوار LED WS2812 و راهاندازی سرور وب آغاز میشود. پایه LED بهعنوانLED_PINو تعداد LED ها در نوار با تنظیم میشودNUM_LEDS.
#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
این قطعه شِفر (کود) کتابخانه NeoPixel را راهاندازی کرده و نوار LED را روی پایه مشخص شده تنظیم میکند.Adafruit_NeoPixelشیء،stripاین چیزی است که شما برای کنترل رنگهای LED استفاده خواهید کرد.
در مرحله بعد، شِفر (کود) Wi-Fi را راهاندازی میکند و یک سرور وب برای رسیدگی به درخواستهای ورودی تنظیم میکند. SSID و رمز عبور برای شبکه تعریف شدهاند تا ESP32 بتواند به Wi-Fi متصل شود.
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);
در این بخش، جایگزین کنیدyour_SSIDوyour_PASSWORDبا اطلاعات کاربری واقعی Wi-Fi شما. این اتصال به ESP32 امکان میدهد تا با دستگاههای موجود در همان شبکه ارتباط برقرار کند و کنترل از راه دور نوار LED را ممکن میسازد.
عملکرد اصلی برای تغییر رنگ LED این استsetColor()که از هر LED عبور میکند و رنگ آن را بر اساس مقادیر RGB انتخاب شده تنظیم میکند.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED
strip.show(); // Update the LED strip with the new colors
delay(10); // Wait for 10 milliseconds
}
}
این تابع تضمین میکند که هر LED در نوار با رنگ انتخاب شده بهروزرسانی شود. تأخیر باعث میشود که LEDها بهصورت نرم تغییر رنگ دهند. در حین تعامل با رابط وب، این تابع برای بازتاب انتخابهای رنگی شما فراخوانی خواهد شد.
نمایش / چه انتظاری باید داشت
هنگامی که راه اندازی کامل شد، شما باید بتوانید از طریق آدرس IP ESP32 به رابط وب دسترسی پیدا کنید. شما یک انتخابگر رنگ خواهید دید که به شما امکان میدهد هر رنگی را انتخاب کنید، که سپس به نوار LED ارسال خواهد شد. اگر ESP32 ارتباط Wi-Fi را از دست بدهد، نوار یک رنگ هشدار را چشمک خواهد زد که مشکل را نشان میدهد (در ویدیو در ساعت 14:30).
اشتباهات رایج شامل سیمکشی نادرست است که میتواند باعث شود لامپهای LED روشن نشوند، یا استفاده از ترکیبهای نادرست SSID/رمز عبور که مانع اتصال ESP32 به شبکه میشود. همیشه اتصالات و مدارک خود را دوباره بررسی کنید.
زمانبندی ویدیوها
- ۰۰:۰۰ شروع
- مقدمه به پروژه ٢:٠١
- ۳:۰۹ اسناد
- توضیح رنگ RGB ۳:۴۷
- ۷:۴۷ سیم کشی
- شِفر (کود) آردوینو برای WS2812 با WIFI توضیح داده شده در ساعت ۸:۴۰
- انتخاب برد ESP32 و پورت COM در IDE آردوینو 19:35
- کنترل نوار LED از طریق وایفای دمو
/*
* کنترل LED RGB از طریق وایفای با استفاده از ESP32
*
* دستورالعملهای کامل ویدئویی https://youtu.be/J_UFHk_T9aE
* 📚⬇️ صفحه دانلود و منابع https://robojax.com/RJT687
* نوشته احمد شمشیری در ۱۸ دسامبر ۲۰۲۳
*
* برای مشاهده دستورالعمل ویدئویی این ویدیو:
*
* کتابخانه DHT آدافرود را با وبسرور ESP8266 ترکیب کردهام، هر دو واصل
* کتابخانه DHT آدافرود در گیتهاب: https://github.com/adafruit/DHT-sensor-library
* و
* ESP8266 در گیتهاب: https://github.com/esp8266/Arduino
*
* حقوق کپیرایت (c) ۲۰۱۵، تکنولوژیهای مایجنگو
* کلیه حقوق محفوظ است.
*
* توزیع و استفاده در اشکال منبع و باینری، با یا بدون تغییر،
* مجاز است به شرط آنکه شرایط زیر رعایت شود:
*
* توزیعهای شِفر (کود) منبع باید اطلاعیه کپیرایت فوق، این
* لیست شرایط و اعلامیه معافیت زیر را حفظ کند.
*
* توزیعها در قالب باینری باید اطلاعیه کپیرایت فوق، این
* لیست شرایط و اعلامیه معافیت زیر را در مستندات و/یا
* سایر مواد ارائه شده با توزیع، تولید کنند.
*
* نه نام تکنولوژیهای مایجنگو و نه نامهای مشارکتکنندگان آن
* نباید برای تأیید یا ترویج محصولات مشتق شده از
* این نرمافزار بدون اجازه کتبی خاص استفاده شود.
*
* این نرمافزار از سوی دارندگان کپیرایت و مشارکتکنندگان "به صورت موجود" ارائه شده است و
* هرگونه ضمانتنامه صریح یا ضمنی، از جمله، اما نه محدود به، ضمانتنامههای ضمنی
* قابلیت فروش و تناسب برای یک هدف خاص، رد شده است. در هیچ حالتی، دارندگان کپیرایت یا مشارکتکنندگان مسئول
* هیچگونه خسارت مستقیم، غیرمستقیم، تصادفی، ویژه، نمونهای یا تبعی نخواهند بود
* (از جمله، اما نه محدود به، تأمین کالا یا خدمات جانشین؛
* از دست دادن استفاده، داده یا سود؛ یا قطع کسبوکار) ناشی از هرگونه علت و بر اساس
* هر نظریه مسئولیت، خواه در قرارداد، مسئولیت سختگیرانه، یا تقصیر
* (از جمله بیاحتیاطی یا غیره) که به هر شکلی ناشی از استفاده از این
* نرمافزار باشد، حتی اگر از احتمال چنین خسارتی مطلع باشید.
*/
#include <Adafruit_NeoPixel.h> // کتابخانه Adafruit NeoPixel را وارد کنید
#define LED_PIN 13 // نوپیکسل نوار LED
#define NUM_LEDS 8 // تعداد LEDها
// یک نمونه از کلاس Adafruit_NeoPixel ایجاد کنید
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// رنگ اولیه نوار LED
int valueR = 178; // از ۰ تا ۲۵۵ برای قرمز
int valueG = 27; // از ۰ تا ۲۵۵ برای سبز
int valueB = 84; // از ۰ تا ۲۵۵ برای آبی
bool showSerialData = false;
String theColorR, theColorG, theColorB;
String theColor ="ff0000";
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "dars";
const char *password = "hhhhhhhhhhh";
WebServer server(80);
void showColorPicker() {
String page = "<!DOCTYPE html>\n";
page +="<html>\n";
page +="<body>\n";
page +="<div style=\"zoom: 300%;\">\n";
page +="<h2>Robojax RGB Color picker</h2>\n";
page +="<p id=\"result\"></p>\n";
page +="<form action=\"/color\">\n";
page +=" <label for=\"favcolor\">Select your favorite color:</label>\n";
page +=" <input type=\"color\" id=\"favcolor\" name=\"favcolor\" value=\"#";
page += theColor;
page +="\"><br><br>\n";
page +=" <input type=\"submit\" value=\"Set Color\" />\n";
page +="</form> \n</div>\n";
page +="</body>\n";
page +="</html>\n";
server.send(200, "text/html", page);
}
// from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
void getColor(){
// server.send(200, "text/plain", message);
if(server.argName(0) == "favcolor")
{
String newColor = String(server.arg(0)); // آرگومان ۰ از GET را بگیرید و آن را به رشته تبدیل کنید.
theColor = newColor.substring(1); // سمبل # را از ابتدای رنگ مانند #B2a48d حذف کنید.
theColorR = newColor.substring(1, 3); // B2 را از #B2a48d برای مثال استخراج کنید
theColorG = newColor.substring(3, 5); // از #B2a48d برای مثال a4 را استخراج کنید
theColorB = newColor.substring(5, 7); // از #B2a48d برای مثال 8d را استخراج کنید
valueR = StrToHex(theColorR.c_str()); // رشته را به هگز برای R تبدیل کنید
valueG = StrToHex(theColorG.c_str()); // رشته را به HEX برای G تبدیل کنید
valueB = StrToHex(theColorB.c_str()); // رشته را به HEX برای B تبدیل کن
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker(); // مطمئن شوید که انتخابگر رنگ نمایش داده شده است.
// server.send(200, "text/plain", message);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // رنگ LED ام i را به قرمز تنظیم کنید
strip.show(); // بند LED را با رنگهای جدید بهروزرسانی کنید.
delay(10); // منتظر بمانید به مدت 100 میلیثانیه
}
}
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // رنگ LED ام i را به قرمز تنظیم کنید
strip.show(); // بند LED را با رنگهای جدید بهروزرسانی کنید.
delay(50); // منتظر بمانید به مدت 100 میلیثانیه
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // رنگ LED ام i را به قرمز تنظیم کنید
strip.show(); // بند LED را با رنگهای جدید بهروزرسانی کنید.
delay(50); // منتظر بمانید به مدت 100 میلیثانیه
}
}
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup_wifi() {
delay(10);
// ما با اتصال به یک شبکه WiFi شروع میکنیم.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// منتظر اتصال باشید
while (WiFi.status() != WL_CONNECTED) {
noConnection();
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Open: http: // ");
Serial.print(WiFi.localIP());
Serial.println(" to read temperature");
if (MDNS.begin("robojaxRGB")) {
Serial.println("MDNS responder started");
}
}
void setup(void) {
Serial.begin(115200);
strip.begin(); // نواری نئوپیکسل را راهاندازی کنید
strip.show(); // رنگ اولیه را به سیاه تنظیم کنید
setup_wifi();
server.on("/", showColorPicker); // صفحه اصلی را با انتخابگر رنگ نشان دهید.
// سرور در "/color" رنگ را تنظیم کن؛ // رنگ را روی LED RGB WS2812 تغییر میدهد
server.on("/color", HTTP_GET, getColor);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
// روباژکس.کام
while (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
server.handleClient();
// showColorPicker();
setColor();
delay(300); // اگر نیاز ندارید که به طور مکرر بخوانید، این را به یک مقدار بزرگتر (۱۰۰۰ یا بیشتر) تغییر دهید.
// شِفر (کود) Robojax.com برای ESP32 و DHT11 DHT22
}
Common Course Links
Common Course Files
منابع و مراجع
هنوز هیچ منبعی موجود نیست.
فایلها📁
هیچ فایلی موجود نیست.