اینترنت اشیا - IOTدانستنی هامطالب علمی

ساخت وب سرور با NodeMCU

گام اول اضافه کردن برد NodeMCU به IDLE آردوینو

برای آن که بتوانید بر روی این ماژول توسط IDE آردوینو برنامه نویسی کنید باید درایورها و بورد آن را بر روی نرم افزار آردوینو نصب کنید.برای این منظور وارد نرم افزار آردوینو شوید. سپس از قسمت File وارد Preferences شوید.

node-mcu-setup-arduino-ide
سپس لینک زیر را کپی کنید و در پنجره Preferences در قسمت Additional Boards Manager URLs ، لینک را paste کنید و OK را بزنید.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

node-mcu-setup-arduino-ide-2
سپس از قسمت Tools وارد Boards Manager… شوید.

arduinoesp2
سپس در لیست نمایش داده شده به دنبال esp8266 by ESP8266 Community بگردید و آن را نصب کنید.

arduinoesp3
منتظر بمانید تا عملیات نصب تکمیل شود.

arduinoesp
برای استفاده از ماژول وای فای NodeMCU باید در لیست برد ها برد NodeMCU را انتخاب کنید.

esp8266fs

گام دوم شناخت قطعات

رله چیست؟

رله نوعی کلید الکتریکی سریع یا بی‌درنگ است که با هدایت یک مدار الکتریکی دیگر باز و بسته می‌شود. روش کنترل باز و بسته شدن این کلید الکتریکی به صورتهای مختلف مکانیکی، حرارتی، مغناطیسی، الکترو استاتیک و… می‌باشد. رله را ژوزف هانری در سال ۱۸۳۵ میلادی اختراع کرد.

structure schematic of a SPDT relay

یک رله که به هیچ جایی وصل نیست را در نظر بگیرید. این حالت ، همان حالت نرمال است. در این حالت یک تکه آهن ارتجایی از که به پایه COM لحیم شده است، با پایه NC برخورد دارد. پس پایه های COM و NC در حالت نرمال به هم وصل هستند.
مدار فرمان یک سیم پیچ است که با وصل کردن ولتاژ به دو پایه فرمان و جاری شدن جریان الکتریکی در آن، تبدیل به آهنربا می شود. وقتی سیم پیچ تبدیل به آهنربا شد، رله از حالت نرمال خارج شده و تحریک می شود.

triggering schematic of a SPDT relay000

با ایجاد شدن میدان مغناطیسی ،تکه آهنی که COM را به NC وصل کرده بود به سمت آهنربا جذب می شود و به همین دلیل از NC جدا شده و به سمت آهنربا خم می شود ، طراحی این قطعه به گونه ای است که تکه آهن در زمان جذب به سمت آهنربا به پایه NO برخورد کرده و مادامی که میدان مغناطیسی برقرار است به پایانه NO فشار داده شود. پس می توان گفت در زمان تحریک شدن، پایه COM از NC قطع می شود و به NO وصل می گردد.با قطع شدن ولتاژ از پایه های فرمان ، میدان مغناطیسی هم از بین می رود و همه چیز به شکل نرمال باز می گردد.

NodeMCU چیست؟

nodemcu

NodeMCU  یک پلت فرم اوپن سورس در زمینه‌ی  IOT ( اینترنت اشیا یا به عبارت درست‌تر اینترنت چیزها)  می‌باشد. هسته‌ی NodeMCU ، چیپ ESP8266 ورژن ESP12 می‌باشد که از  WiFi پشتیبانی می‌کند و به وسیله‌ی آن می‌توان به شبکه‌ی WiFi متصل شد و اطلاعات را میان اینترنت یا سایر دستگاه‌ها جابه‌جا نمود. زبان برنامه‌نویسی این ماژول ، Lua می‌باشد. ولی از امکانات بسیار عالی این ماژول این است که می‌توان یا استفاده از IDE آردوینو  و با استفاده از دستوارات آردوینو بر روی آن به سادگی برنامه نویسی کرد.

نحوه اتصال ماژول رله به ماژول NodeMCU

image pMi8PUoeFZ

گام سوم برنامه نویسی

#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>&nbsp;<a href=\"switch1Off\"><button>OFF</button></a></p>";
  content += "<br><p  align ='center'>Switch #2 <a href=\"switch2On\"><button>ON</button></a>&nbsp;<a href=\"switch2Off\"><button>OFF</button></a></p>";
  content += "<br><p  align ='center'>Switch #3 <a href=\"switch3On\"><button>ON</button></a>&nbsp;<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 در مرورگر خود صفحه مربوط به وب سرور نمایش داده می شود.

image 6X0Qvgt0st

با وارد کردن نام کاربری و رمز عبور می توانید به صحه کنترل وارد شوید.

image Mad7yKhdge

 

نوشته های مشابه

9 دیدگاه

  1. سلام اموزش دقیق و مفیدی بود ممنون از شما یک سوالی داشتم میشه این سبستم رو از جای دیگری یا مثلا وقتی که خونه نیستی از راه دور کنترل کرد؟

  2. با سلام . ممنون از آموزش شما . من برنامه شمار آپلود میکنم کامل آپلود میشه ولی ماژول شناسایی نمیشه.

  3. سلام من کد رو آپلود کزدم و کار میکنه ولی فقط با اتصال موبایل به مودمی که ESP به آن وصل هست کار میکنه اما اگر اینترنت رو عوض کنیم (مثلا از اینترنت همراه استفاده کنیم ) نمی تونیم ماژول رو کنترل کنیم چطور این عیب رو بر طرف کنم؟؟؟

    1. ابتدا باید در مودم خودتون پورت 1000 را به پورت 80 و ip دستگاه esp فوروارد کنید در تنظیمات مودم
      بعد از شرکت سرویس دهنده اینترنت مودم خودتون درخواست کنید ip ثابت به مودم شما اختصاص بده

      بعد از اون با هر اینترنتی و هر جای دنیا ip مودم که ثابت شده و پورت 1000 را بزنید به esp دسترسی خواهید داشت
      مثلا اگر ip شما هست 125.34.56.166 باید در آدرس بار این را بزنید

      125.34.56.166:1000

  4. اول تشکر میکنم از این سورس که در اختیار ما گذاشتید، چندتا باگ سورس داره
    اول اینکه اگر احراز هویت نشده باشه با ارسال مستقیم دستورات برای روشن و خاموش شدن سوئیچ ها عمل میکنند، یعنی دسترسی عیر مجاز به راحتی اتفاق میفته یعنی شما اگر در آدرس بار 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 به کلانت باعث میشه که کلاینت در همان صفحه باقی بمونه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا