ساخت وب سرور با NodeMCU
گام اول اضافه کردن برد NodeMCU به IDLE آردوینو
برای آن که بتوانید بر روی این ماژول توسط IDE آردوینو برنامه نویسی کنید باید درایورها و بورد آن را بر روی نرم افزار آردوینو نصب کنید.برای این منظور وارد نرم افزار آردوینو شوید. سپس از قسمت File وارد Preferences شوید.
سپس لینک زیر را کپی کنید و در پنجره Preferences در قسمت Additional Boards Manager URLs ، لینک را paste کنید و OK را بزنید.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
سپس از قسمت Tools وارد Boards Manager… شوید.
سپس در لیست نمایش داده شده به دنبال esp8266 by ESP8266 Community بگردید و آن را نصب کنید.
منتظر بمانید تا عملیات نصب تکمیل شود.
برای استفاده از ماژول وای فای NodeMCU باید در لیست برد ها برد NodeMCU را انتخاب کنید.
گام دوم شناخت قطعات
رله چیست؟
رله نوعی کلید الکتریکی سریع یا بیدرنگ است که با هدایت یک مدار الکتریکی دیگر باز و بسته میشود. روش کنترل باز و بسته شدن این کلید الکتریکی به صورتهای مختلف مکانیکی، حرارتی، مغناطیسی، الکترو استاتیک و… میباشد. رله را ژوزف هانری در سال ۱۸۳۵ میلادی اختراع کرد.
یک رله که به هیچ جایی وصل نیست را در نظر بگیرید. این حالت ، همان حالت نرمال است. در این حالت یک تکه آهن ارتجایی از که به پایه COM لحیم شده است، با پایه NC برخورد دارد. پس پایه های COM و NC در حالت نرمال به هم وصل هستند.
مدار فرمان یک سیم پیچ است که با وصل کردن ولتاژ به دو پایه فرمان و جاری شدن جریان الکتریکی در آن، تبدیل به آهنربا می شود. وقتی سیم پیچ تبدیل به آهنربا شد، رله از حالت نرمال خارج شده و تحریک می شود.
با ایجاد شدن میدان مغناطیسی ،تکه آهنی که COM را به NC وصل کرده بود به سمت آهنربا جذب می شود و به همین دلیل از NC جدا شده و به سمت آهنربا خم می شود ، طراحی این قطعه به گونه ای است که تکه آهن در زمان جذب به سمت آهنربا به پایه NO برخورد کرده و مادامی که میدان مغناطیسی برقرار است به پایانه NO فشار داده شود. پس می توان گفت در زمان تحریک شدن، پایه COM از NC قطع می شود و به NO وصل می گردد.با قطع شدن ولتاژ از پایه های فرمان ، میدان مغناطیسی هم از بین می رود و همه چیز به شکل نرمال باز می گردد.
NodeMCU چیست؟
NodeMCU یک پلت فرم اوپن سورس در زمینهی IOT ( اینترنت اشیا یا به عبارت درستتر اینترنت چیزها) میباشد. هستهی NodeMCU ، چیپ ESP8266 ورژن ESP12 میباشد که از WiFi پشتیبانی میکند و به وسیلهی آن میتوان به شبکهی WiFi متصل شد و اطلاعات را میان اینترنت یا سایر دستگاهها جابهجا نمود. زبان برنامهنویسی این ماژول ، Lua میباشد. ولی از امکانات بسیار عالی این ماژول این است که میتوان یا استفاده از IDE آردوینو و با استفاده از دستوارات آردوینو بر روی آن به سادگی برنامه نویسی کرد.
نحوه اتصال ماژول رله به ماژول NodeMCU
گام سوم برنامه نویسی
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> MDNSResponder mdns; const char* ssid = "none"; // your connection name const char* password = "none"; // your connection password ESP8266WebServer server(80); int gpio1_pin = 2; // D4 of nodemcu int gpio2_pin = 13; // D7 of nodemcu int gpio3_pin =14; // D5 of nodemcu //Check if header is present and correct bool is_authentified(){ Serial.println("Enter is authentified"); if (server.hasHeader("Cookie")){ Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); if (cookie.indexOf("ESPSESSIONID=1") != -1) { Serial.println("Authentification Successful"); return true; } } Serial.println("Authentification Failed"); return false; } //login page, also called for disconnect void handleLogin(){ String msg; if (server.hasHeader("Cookie")){ Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); } if (server.hasArg("DISCONNECT")){ Serial.println("Disconnection"); server.sendHeader("Location","/login"); server.sendHeader("Cache-Control","no-cache"); server.sendHeader("Set-Cookie","ESPSESSIONID=0"); server.send(301); return; } if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){ if (server.arg("USERNAME") == "admin" && server.arg("PASSWORD") == "root" ) // enter ur username and password you want { server.sendHeader("Location","/"); server.sendHeader("Cache-Control","no-cache"); server.sendHeader("Set-Cookie","ESPSESSIONID=1"); server.send(301); Serial.println("Log in Successful"); return; } msg = "Wrong username/password! try again."; Serial.println("Log in Failed"); } String content = "<html><body style='background-color:MediumAquaMarine'><form action='/login' method='POST'><p align ='center' style='font-size:300%;'><u><b><i> Log In </i></b></u></p><br>"; content += " <p align ='center' style='font-size:160%'><b> UserName:<input type='text' name='USERNAME' placeholder='user name' required></b></p><br>"; content += "<p align ='center' style='font-size:160%'><b>Password:<input type='password' name='PASSWORD' placeholder='password' required></b></p><br>"; content += "<p align ='center' style='font-size:160%'><input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "</p><br> </body></html>"; server.send(200, "text/html", content); } //root page can be accessed only if authentification is ok void handleRoot(){ Serial.println("Enter handleRoot"); String header; if (!is_authentified()){ server.sendHeader("Location","/login"); server.sendHeader("Cache-Control","no-cache"); server.send(301); return; } String content = "<body style='background: #80c6f7'><h1 align ='center'><b><u><i><strong>HOME AUTOMATION</strong></i></u></b></h1><br><p align ='center'>Switch #1 <a href=\"switch1On\"><button>ON</button></a> <a href=\"switch1Off\"><button>OFF</button></a></p>"; content += "<br><p align ='center'>Switch #2 <a href=\"switch2On\"><button>ON</button></a> <a href=\"switch2Off\"><button>OFF</button></a></p>"; content += "<br><p align ='center'>Switch #3 <a href=\"switch3On\"><button>ON</button></a> <a href=\"switch3Off\"><button>OFF</button></a></p>"; content += "<br><p><marquee direction='right'>Developed by RUCHIR SHARMA </marquee></p>"; content += "<br><br><br><br> <footer><p>Posted by: Ruchir Sharma</p><p><a href=\"mailto:someone@example.com\">ruchir1677@gmail.com</a>.</p></footer></body>"; if (server.hasHeader("User-Agent")){ content += "the user agent used is : " + server.header("User-Agent") + "<br><br>"; } content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>"; server.send(200, "text/html", content); } //no need authentification 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(void){ // preparing GPIOs pinMode(gpio1_pin, OUTPUT); digitalWrite(gpio1_pin, LOW); pinMode(gpio2_pin, OUTPUT); digitalWrite(gpio2_pin, LOW); pinMode(gpio3_pin, OUTPUT); digitalWrite(gpio3_pin, LOW); delay(1000); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); if (mdns.begin("esp8266", WiFi.localIP())) { Serial.println("MDNS responder started"); } server.on("/", handleRoot); server.on("/login", handleLogin); server.on("/inline", [](){ server.send(200, "text/plain", "this works without need of authentification"); }); server.onNotFound(handleNotFound); //here the list of headers to be recorded const char * headerkeys[] = {"User-Agent","Cookie"} ; size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*); //ask server to track these headers server.collectHeaders(headerkeys, headerkeyssize ); server.on("/",[](){ // }); server.on("/switch1On", [](){ // digitalWrite(gpio1_pin, HIGH); delay(1000); }); server.on("/switch1Off", [](){ // digitalWrite(gpio1_pin, LOW); delay(1000); }); server.on("/switch2On", [](){ // digitalWrite(gpio2_pin, HIGH); delay(1000); }); server.on("/switch2Off", [](){ // digitalWrite(gpio2_pin, LOW); delay(1000); }); server.on("/switch3On", [](){ digitalWrite(gpio3_pin, HIGH); delay(1000); }); server.on("/switch3Off", [](){ digitalWrite(gpio3_pin, LOW); delay(1000); }); server.begin(); Serial.println("HTTP server started"); } void loop(void){ server.handleClient(); }
برای اتصال به شبکه Wifi باید نام شبکه و رمز آن را در برنامه در قسمت زیر وارد کنید.
MDNSResponder mdns; const char* ssid = "none"; // your connection name const char* password = "none"; // your connection password
برای دسترسی به وب سرور نیاز به نام کاربری و رمز دارید که آن ها را هم می توانید در این قسمت از برنامه تغییر دهید.
if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){ if (server.arg("USERNAME") == "admin" && server.arg("PASSWORD") == "root" ) // enter ur username and password you want { server.sendHeader("Location","/"); server.sendHeader("Cache-Control","no-cache"); server.sendHeader("Set-Cookie","ESPSESSIONID=1"); server.send(301); Serial.println("Log in Successful"); return; }
و به جای admin و root نام کاربری و رمز مورد نظر خود را وارد کنید. بعد از آپلود کد بر روی NodeMCU با بازکردن سریال مانیتور برنامه آردوینو ip اختصاص یافته به برد Nodemcu را مشاهده میکنید
با وارد کردن این IP در مرورگر خود صفحه مربوط به وب سرور نمایش داده می شود.
با وارد کردن نام کاربری و رمز عبور می توانید به صحه کنترل وارد شوید.
سلام اموزش دقیق و مفیدی بود ممنون از شما یک سوالی داشتم میشه این سبستم رو از جای دیگری یا مثلا وقتی که خونه نیستی از راه دور کنترل کرد؟
میشه، باید آی پی استاتیک داشته باشید یا P2P درست کنید
سلام
واسه سریال مانیتور باید چه دستوری رو Send کنیم؟؟؟
سلام
لطفا سوالات علمی خود را در انجمن مطرح کنید
با سلام . ممنون از آموزش شما . من برنامه شمار آپلود میکنم کامل آپلود میشه ولی ماژول شناسایی نمیشه.
سلام
میشه از همین کدها برای برد wemos d1mini استفاده کرد؟
سلام من کد رو آپلود کزدم و کار میکنه ولی فقط با اتصال موبایل به مودمی که ESP به آن وصل هست کار میکنه اما اگر اینترنت رو عوض کنیم (مثلا از اینترنت همراه استفاده کنیم ) نمی تونیم ماژول رو کنترل کنیم چطور این عیب رو بر طرف کنم؟؟؟
ابتدا باید در مودم خودتون پورت 1000 را به پورت 80 و ip دستگاه esp فوروارد کنید در تنظیمات مودم
بعد از شرکت سرویس دهنده اینترنت مودم خودتون درخواست کنید ip ثابت به مودم شما اختصاص بده
بعد از اون با هر اینترنتی و هر جای دنیا ip مودم که ثابت شده و پورت 1000 را بزنید به esp دسترسی خواهید داشت
مثلا اگر ip شما هست 125.34.56.166 باید در آدرس بار این را بزنید
125.34.56.166:1000
اول تشکر میکنم از این سورس که در اختیار ما گذاشتید، چندتا باگ سورس داره
اول اینکه اگر احراز هویت نشده باشه با ارسال مستقیم دستورات برای روشن و خاموش شدن سوئیچ ها عمل میکنند، یعنی دسترسی عیر مجاز به راحتی اتفاق میفته یعنی شما اگر در آدرس بار ip دستگاه را بعلاوه /switch1On/ برنید بدون داشتن یوزر و پسورد سوئیچ یک روشن میشود، مورد دوم وقتی کلید ها در صفحه اصلی جهت تغییر وضعیت زده میشه صفحه اصلی از بین میره و وارد صفحه دیگه ای میشه و باید بعد از هر بار استفاده از کلیدها دکمه back مرورگر رو بزنید، برای رفع این مشکل میتونید بخش زیر را به شکل جدیدی که من مینویسم اصلاح کنید..
server.on(“/switch1On”, [](){
//
digitalWrite(gpio1_pin, HIGH);
delay(1000);
});
حالت جدید
server.on(“/switch1On”, [](){
if (is_authentified()){
digitalWrite(gpio1_pin, HIGH);
server.send(204);
}
});
این روش باعث میشه احراز هویت بررسی بشه و در صورت تایید حالت سوئیچ تغییر کنه و ارسال کد 204 به کلانت باعث میشه که کلاینت در همان صفحه باقی بمونه