Modernine TV
ชื่อผู้แจ้ง : ชื้อผู้แจ้งข่าว admin     สถานีฯ admin      เวลาที่แจ้งข่าว แจ้งวันที่ : 10 เมษายน 2561 เวลา 00:06:17      ถูกเปิดอ่านแล้ว 20 ครั้ง  20 / 0 ครั้ง   เพิ่มขนาดตัวอักษร เพิ่มขนาดตัวอักษร 
ประเภท : [ บทความ ]      Mini PC Control      NodeMCU      NodeMCU
ชื่อเรื่อง : ESP8266 ใช้งาน AutoConnect WiFi อ่านและเขียนใส่ EEPROM


สรุปไว้ให้ศึกษา ทบทวนตัวเอง ไม่อยากข้ามขั้นตอนไปนะ
ในหัวข้อนี้เป็นการเขียน CODE ที่มีสาระสำคัญ 2 แบบ คือ

   1. การ Strat Auto Connect WiFi and Connect AP Server

   2. การอ่านและเขียนข้อมูล เก็บไว้ใน EEPROM

      เป็นการใช้งาน AutoConnect WiFi ค้นหา WiFi และมีการอ่านและเขียนข้อมูล SSID และ Password ของ WiFi บันทึกใส่ใน EEPROM ของ NodeMCU ESP8266 โดยมีการทำงานดังนี้

- ป้อนไฟเข้า จะ Start และเชื่อมต่อ WiFi ทันที

- เมื่อไม่สามารถ Connect WiFi ได้  ESP ก็จะเข้าสู่โหมด Server AP

- จะปล่อย Server WiFi จาก ESP8266 มี IP = 192.168.4.1

- เมื่อต่อ WiFi Server ESP เข้าไปได้ จะทำการ SCAN  หาชื่อ WiFi

- ผู้ใช้งานทำการบันทึก SSID และ Password ของ WiFi ที่ต้องการ
   จดจำไว้ใน EEPROM และเรียกออกมาใช้งานได้ครั้งต่อไป


ที่มาจาก




Code AutoConnect WiFi อ่านและเขียนใส่ EEPROM

=============================================

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>

MDNSResponder mdns;
ESP8266WebServer server(80);


const char* ssid = "ESP_Server_WiFi";
const char* passphrase = "12345678";
String st;
String content;

void setup() {
  Serial.begin(115200);
  EEPROM.begin(512);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.println("Startup");
  // read eeprom for ssid and pass
  Serial.println("Reading EEPROM ssid");
  String esid;
  for (int i = 0; i < 32; ++i)
    {
      esid += char(EEPROM.read(i));
    }
  Serial.print("SSID: ");
  Serial.println(esid);
  Serial.println("Reading EEPROM pass");
  String epass = "";
  for (int i = 32; i < 96; ++i)
    {
      epass += char(EEPROM.read(i));
    }
  Serial.print("PASS: ");
  Serial.println(epass);  
  if ( esid.length() > 1 ) {
      // test esid 
      WiFi.begin(esid.c_str(), epass.c_str());
      if (testWifi()) { 
          launchWeb(0);
          return;
      }
  }
  setupAP(); 
}

bool testWifi(void) {
  int c = 0;
  Serial.println("Waiting for Wifi to connect");  
  while ( c < 20 ) {
    if (WiFi.status() == WL_CONNECTED) { return true; } 
    delay(500);
    Serial.print(WiFi.status());    
    c++;
  }
  Serial.println("");
  Serial.println("Connect timed out, opening AP");
  return false;

void launchWeb(int webtype) {
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
  Serial.print("SoftAP IP: ");
  Serial.println(WiFi.softAPIP());
  if (!mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("Error setting up MDNS responder!");
    while(1) { 
      delay(1000);
    }
  }
  Serial.println("mDNS responder started"); 
  createWebServer(webtype);
  // Start the server
  server.begin();
  Serial.println("Server started"); 
}

void setupAP(void) {
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
    Serial.println("no networks found");
  else
  {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i)
     {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
      delay(10);
     }
  }
  Serial.println(""); 
  st = "<ol>";
  for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      st += "<li>";
      st += WiFi.SSID(i);
      st += " (";
      st += WiFi.RSSI(i);
      st += ")";
      st += (WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*";
      st += "</li>";
    }
  st += "</ol>";
  delay(100);
  WiFi.softAP(ssid);
  Serial.println("softap");
  launchWeb(1);
  Serial.println("over");
}

void createWebServer(int webtype)
{
  // Check for any mDNS queries and send responses
  mdns.update();
  
  if ( webtype == 1 ) {
    server.on("/", []() {
        IPAddress ip = WiFi.softAPIP();
        String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
        content = "<!DOCTYPE HTML>\r\n<html>Hello from ESP8266 at ";
        content += ipStr;
        content += "<p>";
        content += st;
        content += "</p><form method='get' action='setting'><label>SSID: </label><input name='ssid' length=32><input name='pass' length=64><input type='submit'></form>";
        content += "</html>";
        server.send(200, "text/html", content);  
    });
    server.on("/setting", []() {
        String qsid = server.arg("ssid");
        String qpass = server.arg("pass");
        if (qsid.length() > 0 && qpass.length() > 0) {
          Serial.println("clearing eeprom");
          for (int i = 0; i < 96; ++i) { EEPROM.write(i, 0); }
          Serial.println(qsid);
          Serial.println("");
          Serial.println(qpass);
          Serial.println("");
            
          Serial.println("writing eeprom ssid:");
          for (int i = 0; i < qsid.length(); ++i)
            {
              EEPROM.write(i, qsid[i]);
              Serial.print("Wrote: ");
              Serial.println(qsid[i]); 
            }
          Serial.println("writing eeprom pass:"); 
          for (int i = 0; i < qpass.length(); ++i)
            {
              EEPROM.write(32+i, qpass[i]);
              Serial.print("Wrote: ");
              Serial.println(qpass[i]); 
            }    
          EEPROM.commit();
          content = "<!DOCTYPE HTML>\r\n<html>";
          content += "<p>saved to eeprom... reset to boot into new wifi</p></html>";
        } else {
          content = "Error";
          Serial.println("Sending 404");
        }
        server.send(200, "text/html", content);
    });
  } else {
    server.on("/", []() {
      server.send(200, "text/plain", "this works as well");
    });
    server.on("/setting", []() {
      server.send(200, "text/plain", "setting.");
    });
    server.on("/cleareeprom", []() {
      content = "<!DOCTYPE HTML>\r\n<html>";
      content += "<p>Clearing the EEPROM</p></html>";
      server.send(200, "text/html", content);
      Serial.println("clearing eeprom");
      for (int i = 0; i < 96; ++i) { EEPROM.write(i, 0); }
      EEPROM.commit();
    });
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  server.handleClient();
}





จะมาเล่าต่อในคราวหน้า เด้อ...





ป้อนไฟ ESP8266 เครื่องจะทำการเชื่อมต่อ WiFi ใน สนง. เอง





เมื่อทำการ UPLOAD Code เข้าไปเสร็จแล้ว
จะสามารถเปิดดูการแสดงผลใน Serial Monitor ได้
ซึ่งยังไม่มีข้อมูล ssid และ pass ใน EEPROM
ค่าใน ssid และ pass จะว่างอยุ่นะ
และเมื่อ ESP8266 เชื่อมต่อ WiFi ไม่ได้
ตัว ESP8266 จะเข้าโหมด AP มี Server IP 192.168.4.1






ใช้มือถือเปิดดูชื่อ WiFi จะค้นพบ WiFi ชื่อ ESP_Server_WiFi





เชื่อมต่อมือถือ เข้า WiFi ชื่อ ESP_Server_WiFi





เข้า URL ชื่อ IP = 192.168.4.1
จะเห็นชื่อ WiFi ที่ ESP8266 สแกนไว้
และมีช่องสำหรับใส่ป้อนชื่อ SSID และ รหัส WiFi
เพื่อนำไปบันทึกลงใน EEPROM





ป้อนชื่อ WiFi และ Password เข้า แล้วกดส่ง
ผลที่ได้ Saved to eeprom.....
ถ้าเราไม่ใส่รหัสผ่าน Password ก็จะเกิด Error
หาก WiFi ไม่มีรหัสผ่าน ก็ใส่มั่วๆลงไปก่อน





ใน Serial Monitor จะแสดงผลการทำงานของ Code





ใน Serial Monitor จะแสดงผลการบันทึกข้อมูลลง EEPROM





หลังจากป้อนรหัส WiFi ใหม่ ต้องรีบูตระบบ
กดปุ่มรีสตาร์ท ที่ RST บน ESP8266





- เมื่อเปิดเครื่อง EPS8266  ใน Serial Monitor จะแสดงผลใน EEPROM
- จะมีชื่อ SSID และ Passwrod WiFi บันทึกเข้าไปแล้ว
- และเครื่อง EPS8266  สามารถเชื่อมต่อ WiFi ชื่อ tom_wifi ได้แล้ว
- EPS8266 จะมีชื่อ IP = 192.168.72.26 นั่นเอง





เชื่อมต่อ WiFi ในสำนักงาน ชื่อ tom_wifi
แล้วเข้า URL ตาม IP ชื่อ 192.168.72.26
จะแสดงหน้า WEB ว่า this work as well
ซึ่งหมายความว่า มีการใช้งาน WEB Server 192.168.72.26 ได้แล้ว





เมื่อเข้าไปดูชื่อ WiFi จะเห็นชื่อ ESP_Server_WiFi
ซึ่งเป็นของ ESP8266 โหมด AP ปล่อย WiFi Server อยู่
และมี IP Web Server = 192.168.4.1
สามารถเชื่อมต่อ WiFi สนง. ได้แล้ว จึงไม่ต้องป้อน SSID และ Password อีก




คลิกที่รูปเพื่อดูรูปใหญ่

ตัวอย่างแผนผังระบบ Auto Connect WiFi ที่เราออกแบบไว้





ตัวอย่าง Code สำหรับอ่านข้อมูลจาก EPROM





ตัวอย่าง Code ที่ใช้สำหรับเขียนบันทึกข้อมูลใส่ EEPROM
ลองเอาไปศึกษาดู...





นำ Code มาดัดแปลงเพื่อทำระบบควบคุมผ่าน WiFi ด้วยมือถือ

   เป็นตัวอย่างในการพัฒนาโครงงาน NodeMCU ESP8266 เรียนรู้เอาไว้ศึกษา Code สำหรับใช้เขียน EEPROM บันทึกรหัสผ่าน, User, ID Line, TOKEN, Gateway,  Subnet, DNS ฯลฯ เพื่อทำให้ผู้ใช้งานสามารถป้อนค่า แก้ไข เปลี่ยนแปลงข้อมูล ในระบบควบคุมได้เอง

     หากจะทำโครงงาน ก็ต้องออกแบบระบบให้ผู้ใช้งานคลิกกดปุ่มง่ายๆ ผ่านหน้า WEB Browser เข้าไปป้อนข้อมูลได้ง่ายๆ ไม่ซับซ้อน เราต้องออกแบบระบบที่เชื่อมต่อข้อมูล ที่จำเป็นสำหรับผู้ใช้งานเท่านั้น และทำให้โครงงานเราเป็นระบบอัตโนมัติ เป็นเครื่องที่เปิดใช้งานและทำงานได้ด้วยตัวเอง ผู้ใช้ก็ปรับแต่งตั้งค่าการทำงานต่างๆได้เอง





เอา Code ไปดัดแปลงใส่จอ LCD1602A เพื่อแสดงผล จะเห็น IP ที่ใช้เชื่อมต่อ WiFi

การติดตั้งจอ LCD 1602A ใส่ ESP8266




จัดทำโดย คณะเจ้าหน้าที่บริษัท อสมท จำกัด ( มหาชน ) ผู้มีโอกาสเข้าร่วมอบรมเทคโนโลยีดิจิตอล ณ ประเทศญี่ปุ่น