روشنایی هوشمند عنصر مورد علاقه ما برای ساخت یک خانه هوشمند است. تصور کنید تنها با در دست داشتن گوشی همراه خود قادر به روشن کردن یا حتی تنظیم سطح روشنایی قسمت های مختلف خانه خود باشید. روشنایی هوشمند فرصتی عالی هستند تا زندگی شما را کمی آسان تر کنند.
در واقع بزرگترین مزیت روشنایی هوشمند، قابلیت خودکارسازی کارهای ساده است. بطور مثال :
- 10 دقیقه قبل از اینکه زنگ ساعت شما به صدا درآید، چراغ های خاصی را در صبح روشن کنید.
- تمام چراغ های خانه را در یک ساعت مشخص یا با یک فرمان ساده در شب خاموش کنید.
- هنگام ورود به خانه یا خروج از خانه، چراغ ها را روشن یا خاموش کنید.
مقدمه
امروزه با وجود ماژول های هوشمند و قابل برنامه ریزی هر کسی به سادگی می تونه از این تکنولوژی بهره مند بشه. در این آموزش شما با صرف هزینه بسیار کم و با استفاده از ماژول ESP32 که قبل تر بصورت مفصل به معرفی امکانات و قابلیت های آن پرداخته ایم، چراغ هوشمندی که بتوان با شبکه وای فای آن را کنترل کرد خواهید ساخت. تا انتهای این آموزش همراه ما باشید.

قطعات مورد نیاز برای شروع
-
ESP32 NodeMCU
-
USB Type C cable (کابل یو اس بی تایپ C)
-
20W 12V DC LED همراه با (heat-sink) گرماگیر آلومینیومی
-
NPN BD-139 transistor (ترانزیستور BD139) جهت کنترل روشنایی یا از نظر فنی کنترل ولتاژ LED
-
مقاومت 70 اهم برای پایه BD-139 و دیود IN4007 برای محافظت از مدار در برابر هر گونه ولتاژ معکوس از منبع تغذیه 12 ولت.
-
برد بورد
-
سیم
در این پروژه کاربردی قصد داریم یک لامپ هوشمند و قابل کنترل از طریق وای فای داخلی رو راه اندازی کنیم. برای شبکه داخلی نیازی به اتصال اینترنت نیست، درواقع همه چیز با همون اتصال وای فای قابل کنترل هست. از اونجایی که قدرت LED زیاد هست نمی تونیم مستقیماً توسط ESP32 اونو کنترل کنیم، پس به یک مدار اضافی نیاز داریم.
نصب کتابخانه مربوط به کنترل هوشمند LED
برای کدنویسی ESP32 به یک محیط توسعه یکپارچه (IDE) نیاز داریم. ما از نرم افزار Arduino IDE استفاده می کنیم. Arduino IDE یک برنامه چند پلتفرمی است که به زبان جاوا نوشته شده و به زبان C/C++ با قوانین خاصی کدگذاری شده است.
آموزش نصب کتابخانه در Arduino IDE
برای اضافه کردن کتابخانه بورد ESP32 به نرم افزار Arduino، لینک زیر رو داخل قسمت File> Preferences وارد می کنیم.
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
بعد از انجام اینکار به قسمت Tools > Board > Boards Manager مراجعه و اسم ESP32 را سرچ کنید. پس از پیدا شدن کتابخانه آنرا نصب می کنیم.
حالا از منوی tools بورد را روی ESP32 wrover module قرار میدیم و بقیه مشخصات را مطابق تصویر زیر تنظیم می کنیم.
حالا می تونیم متصل شویم و کد هارو آپلود کنیم
سیم کشی و اتصالات
با توجه به تصویر زیر اتصالات مدار رو انجام دهید.در مدار، ولتاژ بیس ترانزیستور BD139 با استفاده از پین 21 ESP32 تامین می شود. ولتاژ بیس، جریان بین کلکتور و امیتر BD139 را کنترل می کند. این یک کاربرد ترانزیستور در یک ناحیه تقویت کننده (خطی) است. اکنون میتوانیم ولتاژ و در نتیجه روشنایی یک LED را کنترل کنیم.
توجه داشته باشید که در ESP32 شماره پین های ورودی-خروجی عمومی (GPIO) در پشت آن ذکر شده است. همچنین می توانید برای اطلاعات دقیق تر کاربرد و معرفی پین های ESP32 را مطالعه کنید.
ESP32 را با استفاده از منبع تغذیه 5 ولت (حداکثر تا 500 میلی آمپر)، یا مستقیماً با کمک USB یا پاوربانک وصل کنید. LED بسته به نیاز آن تغذیه می شود – برخی از آنها 12 ولت هستند، در حالی که برخی دیگر 5 ولت هستند.
تمام کابل های زمین باید یکی باشند.
کد نویسی
کد زیر را در کتابخانه Arduino IDE کپی کنید. قبل از اپلود کد یکسری تغییرات باید در کد ایجاد کنید که باهم مرورشون می کنیم.
#include <WiFi.h> // This library contains the Wifi function to run on ESP-32 #define LEDC_CHANNEL_0 0 // In these 4 lines we have defined the PWM details for LED #define LEDC_TIMER_13_BIT 13 #define LEDC_BASE_FREQ 5000 #define LED_PIN 21 #define min(a,b) ((a)<(b)?(a):(b)); // Defining Min Function const char* ssid = "electronicsforu"; const char* password = "efygroup"; WiFiServer server(80); #include "soc/soc.h" // Use this line only if your ESP-32 has Brownout Error #include "soc/rtc_cntl_reg.h" // Use this line only if your ESP-32 has Brownout Error int brightness = 0; void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) // function for analogWrite in Arduino { uint32_t duty = (8191 / valueMax) * min(value, valueMax); ledcWrite(channel, duty); } void setup() { Serial.begin(115200); //Baud Rate of ESP-32 delay(10); WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Use this line only if your ESP-32 has Brownout Errorc 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()); server.begin(); // Start the server ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT); // PWM setup ledcAttachPin(LED_PIN, LEDC_CHANNEL_0); } int value = 0; void loop(){ WiFiClient client = server.available(); // listen for any incoming client if (client) { // if you get any client, Serial.println("New Client."); // print a message on the serial monitor String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) // loop while the client's connected { if (client.available()) // if there's bytes to read from the client { char c = client.read(); // read a byte, then Serial.write(c); // print it out on the serial monitor if (c == '\n') // if the byte is a newline character { if (currentLine.length() == 0) // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: { client.println("HTTP/1.1 200 OK"); // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) client.println("Content-type:text/html"); // and a content-type so the client knows what's coming, client.println(); // then a blank line: // the content of the HTTP response follows the header: client.print("<a href=\"/A\">OFF</a><br>"); client.print("<a href=\"/B\">Level 1</a><br>"); client.print("<a href=\"/C\">Level 2</a><br>"); client.print("<a href=\"/D\">Level 3</a><br>"); client.print("<a href=\"/E\">Level 4</a><br>"); client.print("<a href=\"/F\">Level 5 Full</a><br>"); client.println(); // The HTTP response ends with another blank line: break; // break out of the while loop: } else { currentLine = ""; // if you got a newline, then clear currentLine: } } else if (c != '\r') // if you got anything else but a carriage return character, { currentLine += c; // add it to the end of the currentLine } if (currentLine.endsWith("GET /A")) // Check to see if the client request was "GET /A" or "GET /B" and so on...: { brightness = 0; } if (currentLine.endsWith("GET /B")) { brightness = 50; } if (currentLine.endsWith("GET /C")) { brightness = 100; } if (currentLine.endsWith("GET /D")) { brightness = 150; } if (currentLine.endsWith("GET /E")) { brightness = 200; } if (currentLine.endsWith("GET /F")) { brightness = 255; } ledcAnalogWrite(LEDC_CHANNEL_0, brightness); // the analog value of brightness is written on the pin } } client.stop(); // close the connection: Serial.println("Client Disconnected."); } }
در قسمت Wi-Fi باید اسم شبکه و همچنین پسورد را بر اساس شبکه خودتون ست کنید.
در صورتی که برد ESP خطای Brownout نداشته باشد، این سه خط قابل حذف هستند.
توضیحات کد نوشته شده
در کد نوشته شده دستور include# به Arduino IDE کمک می کند تا عملکردهای ESP32 را اجرا کند. این کتابخانه شامل تمام توابع Wi-fi.xxxx استفاده شده در کد می باشد.
متأسفانه، ESP ها تابع analogWrite ندارند. بنابراین، خودمون باید این تابع را ایجاد کنیم. در اینجا، ledcAnalogWrite را ساختیم و مقادیری را که در آن تابع استفاده خواهند شد، تعریف کردیم.
دستور (){}void setup، تمام تنظیمات مورد نیاز برای اجرای برنامه اصلی مانند باود ریت (baud rate) در ()Serial.begin، مقداردهی اولیه Wi-Fi، تنظیم حالت پین، تنظیم تابع روشنایی و راه اندازی سرور از ()Server.begin را انجام می دهد.
در قسمت ()void loop برنامه اصلی وجود دارد.
هدف ما ایجاد یک صفحه وب بر روی سرور می باشد که بتوانیم با ایجاد دکمه های مختلف اون ها رو متصل کنیم. برای ایجاد این امکان باید از کد HTML در دستورات آردوینو مانند تصویر زیر استفاده کنیم.
اینکار باعث بوجود آمدن دکمه هایی در صفحه وب خواهد شد که با استفاده از آن ها می توان روشنایی LED را کنترل کرد.
بعد از تنظیم مقادیر حالا می توانیم مقادیر زیر را که در analogWrite برای ESP32 نوشته بودیم، اضافه کنیم.
client.stop(); Serial.println("Client Disconnected."); }
در نهایت کد را ذخیره کنید.
سپس به آدرس Tools>Boards Manager>ESP32 Dev Module مراجعه کنید. سپس به مسیر Tools>Upload Speed>115200 رفته و در آنجا پورت COM را انتخاب کنید.
بعد از انجام مراحل بالا کد را آپلود کنید.
اتصال به وب سرور
بعد از آپلود کد به مسیر Tools>Serial Monitor مراجعه کنید. در اینجا ESP32 با اتصال به Wi-Fi، آدرس IP خودشو در Arduino serial monitor نمایش میده.
پس از اطمینان از روشن بودن و اتصال به مودم وای فای مشترک، آدرس IP نمایش داده شده در Arduino serial monitor قسمت جستجو مرورگر خود وارد کنید. صفحه ای مانند عکس زیر برای شما به نمایش در میاد که حالا قادر هستید با استفاده از دکمه های موجود در صفحه وب، روشنایی LED را کنترل کنید.
جمع بندی
در این آموزش ابتدا با طراحی یک مدار امکان اتصال آن به ماژول ESP32 را فراهم می کنیم. مرحله بعد در محیط نرم افزار Arduino IDE کد های مربوطه و همچنین مشخصات شبکه داخلی را وارد می کنیم. در نهایت با اتصال ESP32 به شبکه وای فای قادر به کنترل LED از طریق مرورگر خود هستیم. شما می توانید روشنایی هوشمند را به همین سادگی در خانه خود در مقیاس های بزرگتر پیاده سازی کنید و از آن لذت ببرید.