نمایش نتایج: از 1 به 6 از 6
Like Tree6 لایک
  • 4 Post By masoudamirian
  • 1 Post By magmagmary
  • 1 Post By masoudagha

موضوع: راه اندازی یک وب سرور ساده با آردوینو و ماژول esp8266-01

  1. #1
    Member
    تاریخ عضویت
    Apr 2015
    نوشته ها
    39

    راه اندازی یک وب سرور ساده با آردوینو و ماژول esp8266-01

    دوستان سلام. بالاخره موفق شدم یه سمپل نصفه و نیمه گیر بیارم که بشه باهاش یه وب سرور راه انداخت که میتونه یه پیج HTML رو نمایش بده.گفتم بدنباشه اینجا بذارم، شاید به کار دوستان هم بیاد. یه مشکل وجود داره و اون اینکه stable نیست. یعنی بعد از چندبار، برنامه کرش میکنه. دارم روش کار میکنم. سعی میکنم بهشCSS هم اضافه کنم که در ادامه اینجا قرار میدم. شما هم یه حرکتی بزنید! به منطق open source احترام بذارید!

    کد:
    /*
    Arduino Due - ESP 8266 WiFi Module
    Serial (Tx/Rx) communicate to PC via USB
    Serial3 (Tx3/Rx3) connect to ESP8266
    Tx3 - ESP8266 Rx
    Rx3 - ESP8266 Tx
    ESP8266 CH_PD Connect to ESP8266 VCC
    */
    #include <SoftwareSerial.h>
    
    SoftwareSerial ESP8266(2, 3);
    #define ASCII_0 48
    
    String SSID = "اسم اکسس پوینت";
    String PASSWORD = "پسورد اکسس پوینت";
    
    int LED = 13;
    
    boolean FAIL_8266 = false;
    
    String strHTML = "<!doctype html>\
    <html>\
    <head>\
    <title>in the name of god</title>\
    </head>\
    <body>\
    <H1>thanks to aftab rayaneh. special thanks to magmagmary.</H1>\
    </body>\
    </html>";
    
    #define BUFFER_SIZE 128
    char buffer[BUFFER_SIZE];
    
    void setup() {
      pinMode(LED, OUTPUT);
      
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
    
      do{
        Serial.begin(9600);
        ESP8266.begin(9600);
      
        //Wait Serial Monitor to start
        while(!Serial);
        Serial.println("--- Start ---");
    
        ESP8266.println("AT+RST");
        delay(1000);
        if(ESP8266.find("OK"))
        {
          Serial.println("Module is ready");
          ESP8266.println("AT+CWMODE=1");
          delay(2000);
          
          //Quit existing AP, for demo
          Serial.println("Quit AP");
          ESP8266.println("AT+CWQAP");
          delay(1000);
          
          clearESP8266SerialBuffer();
          if(cwJoinAP())
          {
            Serial.println("CWJAP Success");
            FAIL_8266 = false;
            
            delay(3000);
            clearESP8266SerialBuffer();
            //Get and display my IP
            sendESP8266Cmdln("AT+CIFSR", 1000);  
            //Set multi connections
            sendESP8266Cmdln("AT+CIPMUX=1", 1000);
            //Setup web server on port 80
            sendESP8266Cmdln("AT+CIPSERVER=1,80",1000);
            
            Serial.println("Server setup finish");
          }else{
            Serial.println("CWJAP Fail");
            delay(500);
            FAIL_8266 = true;
          }
        }else{
          Serial.println("Module have no response.");
          delay(500);
          FAIL_8266 = true;
        }
      }while(FAIL_8266);
      
      digitalWrite(LED, HIGH);
    }
    
    void loop(){
      int connectionId;
      
      if(ESP8266.readBytesUntil('\n', buffer, BUFFER_SIZE)>0)
      {
        Serial.println("Something received");
        Serial.println(buffer);
        if(strncmp(buffer, "+IPD,", 5)==0){
          Serial.println("+IPD, found");
          sscanf(buffer+5, "%d", &connectionId);
          Serial.println("connectionId: " + String(connectionId));
          delay(1000);
          clearESP8266SerialBuffer();
          
          sendHTTPResponse(connectionId, strHTML);
          
          //Close TCP/UDP
          String cmdCIPCLOSE = "AT+CIPCLOSE="; 
          cmdCIPCLOSE += connectionId;
          sendESP8266Cmdln(cmdCIPCLOSE, 1000);
        }
      }
    }
    
    void sendHTTPResponse(int id, String content)
    {
      String response;
      response = "HTTP/1.1 200 OK\r\n";
      response += "Content-Type: text/html; charset=UTF-8\r\n"; 
      response += "Content-Length: ";
      response += content.length();
      response += "\r\n";
      response +="Connection: close\r\n\r\n";
      response += content;
    
      String cmd = "AT+CIPSEND=";
      cmd += id;
      cmd += ",";
      cmd += response.length();
      
      Serial.println("--- AT+CIPSEND ---");
      sendESP8266Cmdln(cmd, 1000);
      
      Serial.println("--- data ---");
      sendESP8266Data(response, 1000);
    }
    
    boolean waitOKfromESP8266(int timeout)
    {
      do{
        Serial.println("wait OK...");
        delay(1000);
        if(ESP8266.find("OK"))
        {
          return true;
        }
    
      }while((timeout--)>0);
      return false;
    }
    
    boolean cwJoinAP()
    {
      String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\"";
      ESP8266.println(cmd);
      return waitOKfromESP8266(10);
    }
    
    //Send command to ESP8266, assume OK, no error check
    //wait some time and display respond
    void sendESP8266Cmdln(String cmd, int waitTime)
    {
      ESP8266.println(cmd);
      delay(waitTime);
      clearESP8266SerialBuffer();
    }
    
    //Basically same as sendESP8266Cmdln()
    //But call ESP8266.print() instead of call ESP8266.println()
    void sendESP8266Data(String data, int waitTime)
    {
      ESP8266.print(data);
      delay(waitTime);
      clearESP8266SerialBuffer();
    }
    
    //Clear and display Serial Buffer for ESP8266
    void clearESP8266SerialBuffer()
    {
      Serial.println("= clearESP8266SerialBuffer() =");
      while (ESP8266.available() > 0) {
        char a = ESP8266.read();
        Serial.write(a);
      }
      Serial.println("==============================");
    }

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,937
    با تشکر فراوووون از شما
    لایک کردن

  3. #3
    Member
    تاریخ عضویت
    Apr 2015
    نوشته ها
    39
    سلام. یه سوال؟ کتابخانه ای به اسم ESP8266WiFi.h داریم که فکر کنم برای پروگرم کردن ماژول های وای فای با هسته 8266 به کار میره. حالا خواستم ببینم میشه از این کتابخونه برای ماژول های متصل به آردوینو استفاده کرد؟؟

  4. #4
    Member
    تاریخ عضویت
    Apr 2015
    نوشته ها
    39
    سلام. پروژه ای که دارم انجام میدم، اینه که اطلاعات رو از یه کارت rfid میخونه و بعد اطلاعات رو از طریق این ماژول وارد سرور و بعد در یه دیتابیس ذخیره میکنه. تا اینجا مشکلی نیست. منتها وقتی تعداد کلاینت ها (که ماژول های rfid به همراه این ماژول) هستند، زیاد میشه (حدود 30 تا)، اگه همزمان کارت ها رو بخونیم، حالت کانفلیکت پیدا میکنه. به نظرتون چه راهکاری میاد؟؟
    راستی، یه مشکل، وقتی uid rfid رو میفرستم، فقط 3 رقم آخرش خونده میشه. دلیلش چیه؟

  5. #5
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,937
    نقل قول نوشته اصلی توسط masoudamirian نمایش پست ها
    سلام. پروژه ای که دارم انجام میدم، اینه که اطلاعات رو از یه کارت rfid میخونه و بعد اطلاعات رو از طریق این ماژول وارد سرور و بعد در یه دیتابیس ذخیره میکنه. تا اینجا مشکلی نیست. منتها وقتی تعداد کلاینت ها (که ماژول های rfid به همراه این ماژول) هستند، زیاد میشه (حدود 30 تا)، اگه همزمان کارت ها رو بخونیم، حالت کانفلیکت پیدا میکنه. به نظرتون چه راهکاری میاد؟؟
    راستی، یه مشکل، وقتی uid rfid رو میفرستم، فقط 3 رقم آخرش خونده میشه. دلیلش چیه؟
    سلام
    الان دو تا مشکل مطرح شده .
    برای حل مشکل اول میتونید برای هر کلاینت یه اسم بزارید .
    و هر کلاینتی وقتی مخواد داده بفرسته واسه سرور اول یه ریکوئست بده اگه اکسپت شد داده رو بفرسته . یه مقدار تاخیر ارسالش زیاد میشه اما خب دیگه داده ای از دست نمیره .

    در مورد مشکل دومتون هم خود esp نمتونه کل آیدی رو بخونه یا موقع ارسالش به سرور مشکل دارید

  6. #6
    Junior Member
    تاریخ عضویت
    Jul 2017
    نوشته ها
    6

    مشکل برنامه

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

    کد:
    /*
    Arduino Due - ESP 8266 WiFi Module
    Serial (Tx/Rx) communicate to PC via USB
    Serial3 (Tx3/Rx3) connect to ESP8266
    Tx3 - ESP8266 Rx
    Rx3 - ESP8266 Tx
    ESP8266 CH_PD Connect to ESP8266 VCC
    */
    
    #define ASCII_0 48
    
    String SSID = "SSID";
    String PASSWORD = "PASS";
    
    int LED = 13;
    
    boolean FAIL_8266 = false;
    
    String stroffHTML = "<!doctype html>\
    <html>\
    <head>\
    <title>in the name of god</title>\
    </head>\
    <body>\
    <H1>LED Current State : off</H1>\
    </body>\
    </html>";
    
    String stronHTML = "<!doctype html>\
    <html>\
    <head>\
    <title>in the name of god</title>\
    </head>\
    <body>\
    <H1>LED Current State : on</H1>\
    </body>\
    </html>";
    
    #define BUFFER_SIZE 128
    char buffer[BUFFER_SIZE];
    
    void setup() {
      pinMode(LED, OUTPUT);
      
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
      delay(300);
      digitalWrite(LED, HIGH);
      delay(200);
      digitalWrite(LED, LOW);
    
      do{
        Serial.begin(9600);
        //ESP8266.begin(9600);
        Serial1.begin(9600);
        
        //Wait Serial Monitor to start
        while(!Serial);
        Serial.println("--- Start ---");
    
        //ESP8266.println("AT+RST");
        Serial1.println("AT+RST");
        delay(1000);
        if(Serial1.find("OK"))
        {
          Serial.println("Module is ready");
          Serial1.println("AT+CWMODE=1");
          delay(2000);
          
          //Quit existing AP, for demo
          Serial.println("Quit AP");
          Serial1.println("AT+CWQAP");
          delay(1000);
          
          clearESP8266SerialBuffer();
          if(cwJoinAP())
          {
            Serial.println("CWJAP Success");
            FAIL_8266 = false;
            
            delay(3000);
            clearESP8266SerialBuffer();
            //Get and display my IP
            sendESP8266Cmdln("AT+CIFSR", 1000);  
            //Set multi connections
            sendESP8266Cmdln("AT+CIPMUX=1", 1000);
            //Setup web server on port 80
            sendESP8266Cmdln("AT+CIPSERVER=1,80",1000);
            
            Serial.println("Server setup finish");
          }else{
            Serial.println("CWJAP Fail");
            delay(500);
            FAIL_8266 = true;
          }
        }else{
          Serial.println("Module have no response.");
          delay(500);
          FAIL_8266 = true;
        }
      }while(FAIL_8266);
      
      digitalWrite(LED, HIGH);
    }
    
    
    void loop(){
      if(Serial1.available()){
        Serial.println("Something received");
        delay(1000);
        if(Serial1.find("+IPD,")){
          String action;
          Serial.println("+IPD, found");
          int connectionId = Serial1.read()-48;
          Serial.println("connectionId: " + String(connectionId));
          Serial.println("--------------- DEBUG ----------------A");
          char temp = char(Serial1.read());
          while ((temp != '/') && (Serial1.available())){
            Serial.print(temp);
            temp = char(Serial1.read());
          }
          Serial.println("\n--------------- END DEBUG ----------------");
          boolean isFound = Serial1.find("len=");
          Serial.print("is Found : ");
          Serial.println(isFound);
          char s = Serial1.read();
          if(s=='0'){
            action = "LED is OFF";
            digitalWrite(LED, LOW);
            sendHTTPResponse(connectionId, stroffHTML);
          }else if(s=='1'){
            action = "LED is ON";
            digitalWrite(LED, HIGH);
            sendHTTPResponse(connectionId, stronHTML);
          }else {
            action = "led=?";
          }
          Serial.println(action);
          //sendHTTPResponse(connectionId, action);
          
        }
      }
    }
    
    
    void sendHTTPResponse(int id, String content)
    {
      String response;
      response = "\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
      response += "<body align=center>";
      response += "<p>";
      response += "<a href=\"http://192.168.1.110/len=1\">Turn On LED</a><p>";
      response += "<a href=\"http://192.168.1.110/len=0\">Turn Off LED</a><p>";
      response += content;
      response += "</body></html>\n";
      String cmd = "AT+CIPSEND=";
      cmd += id;
      cmd += ",";
      cmd += response.length();
      Serial.println("--- AT+CIPSEND ---");
      sendESP8266Cmdln(cmd, 1000);
      Serial.println("--- data ---");
      sendESP8266Data(response, 1000);
      /*
      String response;
      response = "HTTP/1.1 200 OK\r\n";
      response += "Content-Type: text/html; charset=UTF-8\r\n"; 
      response += "Content-Length: ";
      response += content.length();
      response += "\r\n";
      response +="Connection: close\r\n\r\n";
      response += content;
    
      String cmd = "AT+CIPSEND=";
      cmd += id;
      cmd += ",";
      cmd += response.length();
      
      Serial.println("--- AT+CIPSEND ---");
      sendESP8266Cmdln(cmd, 1000);
      
      Serial.println("--- data ---");
      sendESP8266Data(response, 1000);
      */
    }
    
    
    
    boolean waitOKfromESP8266(int timeout)
    {
      do{
        Serial.println("wait OK...");
        delay(1000);
        if(Serial1.find("OK"))
        {
          return true;
        }
    
      }while((timeout--)>0);
      return false;
    }
    
    boolean cwJoinAP()
    {
      String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASSWORD + "\"";
      Serial1.println(cmd);
      return waitOKfromESP8266(10);
    }
    
    //Send command to ESP8266, assume OK, no error check
    //wait some time and display respond
    void sendESP8266Cmdln(String cmd, int waitTime)
    {
      Serial1.println(cmd);
      delay(waitTime);
      clearESP8266SerialBuffer();
    }
    
    //Basically same as sendESP8266Cmdln()
    //But call ESP8266.print() instead of call ESP8266.println()
    void sendESP8266Data(String data, int waitTime)
    {
      Serial1.print(data);
      delay(waitTime);
      clearESP8266SerialBuffer();
    }
    
    //Clear and display Serial Buffer for ESP8266
    void clearESP8266SerialBuffer()
    {
      Serial.println("= clearESP8266SerialBuffer() =");
      while (Serial1.available() > 0) {
        char a = Serial1.read();
        Serial.write(a);
      }
      Serial.println("==============================");
    }
    با آپلود کد بالا و رفتن به آدرس هایی که در ارتباط سریال به نمایش در میاد میتونید LED متصل به پایه 13 را کنترل کنید.
    به عنوان مثال برای من آدرس به صورت زیر بود
    کد:
    http://192.168.1.110/len=1
    با رفتن به آدرس فوق LED روشن و در صورتی که به آدرس زیر بروید LED خاموش میگردد. مد نظرتون باشه میتوانید از لینک های موجود در خود صفحه HTML برای روشن و خاموش کردن استفاده کنید
    کد:
    http://192.168.1.110/len=0
    ویرایش توسط masoudagha : 01-22-2018 در ساعت 09:02 AM
    لایک کردن

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO