ساخت وب سرور با 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 در مرورگر خود صفحه مربوط به وب سرور نمایش داده می شود.
با وارد کردن نام کاربری و رمز عبور می توانید به صحه کنترل وارد شوید.
برای خواندن مطالب بیشتر در مورد esp8266 و NodeMCU به شاخه ماژول های مخابراتی در الکترولب مراجعه کنید.
سلام و عرض خسته نباشید, من یه برد wemos lolin32 دارم که هسته مرکزیش esp wroom 32 است,چطور میتونم از software Serial در این سری برد ها بهرهمند شوم؟؟؟ 🙂
چون software serial مربوط به uno با این سری برد ها همخوانی ندارد,لطفا کمک کنید…
سلام . رضا هستم . من اکثر سایتهای مربوطه رو چک کردم . اما هیچکدوم درباره کتابخانه های ماژول esp8266 توضیح کاملی نداده اند . سوال من اینه که چند تا کتابخانه مفید برای ارتباط بین ماژول های esp8266 وجود داره ؟ هم برای ارتباط عادی و هم برای ارتباط از طریق اینترنت ؟ و اینکه متن ها و دستورات مربوط به این کتابخانه ها را از کجا میتونیم دانلود کنیم ؟ من که هر چی توی اینترنت جستجو کردم موفق نشدم . به نظر میرسه که عمدا نمیخان دانش خودشونو به بقیه یاد بدن و همه این سایتها فقط نکات ابتدایی و مقدماتی رو ارائه میکنند . اگه لطف کنید و کمک کنید ممنون میشم .
سلام ممنون بابت این مطلب مفید
امکانش هست کمک کنید بابت استفاده از این کد برای ماژول esp8266 12E چه تغییراتی نیاز هست چون همین کد را که به ماژول میفرستم تو قسمت مانیتورینگ وصل نمیشه و اون ip را به من نیمیده
باتشکر
شما فریم ور Nodemcu رو روی esp-12e نصب کردید؟
سلام وقتی با نت ایرانسل میخام بش وصل بشم صفحه بالا نمیاد
ولی وقتی با مودمی که esp8266 بهش وصله به IP متصل میشم بالا میاره
مشکل از چیه؟
خوب به اینترنت وصل نیست که باید با شبکه داخلی که ماژول بهش وصل هستش با ماژول ارتیاط برقرار کنید
متوجه منظورتون نمیشم باید هر دو به یک شبکه وصل باشه به یک مودم به یک هات اسپات و …
سلام جناب مهندس عزتی. وقت بخیر
با تشکر و خداقوت به شما دوست بزرگوار
بنده سرمست هستم از اصفهان…در زمینه خانه های هوشمند فعلیت میکنم و به صورت اتفاقی با مطالب آموزنده شما آشنا شدم.بسیار عالی و جای بسی تقدیر هست.
یک سِوال از حضورتون داشتم…بنده با ماژول های ESP01 قصد راه اندازی یک سیستم هوشمند خانگی رو دارم اما تنها موردی که هست اینه که نمیخوام SSID و PASS شبکه وایفای رو داخل برنامه ESP بنویسم و میخوام یوزر از طریق یک Browser یا اپلیکیشن مشخص کنه . اما چون ماژول های ESP01 دارای مرورگر نیستن ، اینکار مشکل هستش….. راهی به نظر شما میرسه ؟
ممنونم.سامان
سلام با ID تلگرام @panda1nic در ارتباط باشید
سلام. ممنون از آموزش خوبتون اما چطوری میشه به SD card وصل کرد و فایل Html رو از روی اون خوند چون فایل Html می تونه پیشتر از 100 خط هم باشه بخوایم بیایم یه کتابخونه درست کنیم داخلش یک متغیر از نوع char و بصورت ارایه بزاریم. هم یه مشکل داره.
اما استفاده از SD card کلی کمک میکنه مثل نمایش عکس یا بارگذاری عکس از کوشی داخل صفحه وبی که از روی سروری که ما ساختیم. بی زحمت میشه توضح بدین چگونه میشه با SD کارت این کار رو کرد
بسیار عالی از ارائه ارزشمند است لطفا پروژه های دیگر نیز ارائه گردد سپاسگزارم
سلام. سوالی داشتم از خدمتتون
برد esp8266 خریدم و دقیقا گام به گام پیش میرم. ولی برنامه روی برد آپلود نمیشه. خطای time out … میدهد. لطفا راهنمایی کنید