Modernine TV
ชื่อผู้แจ้ง : ชื้อผู้แจ้งข่าว admin     สถานีฯ admin      เวลาที่แจ้งข่าว แจ้งวันที่ : 31 มีนาคม 2561 เวลา 22:42:37      ถูกเปิดอ่านแล้ว 333 ครั้ง  333 / 0 ครั้ง   เพิ่มขนาดตัวอักษร เพิ่มขนาดตัวอักษร 
ประเภท : [ บทความ ]      Mini PC Control      NodeMCU      NodeMCU
ชื่อเรื่อง : การทำ NodeMCU ESP8266 เป็นเว็บเซิร์ฟเวอร์แบบง่ายๆ


ทำบทความบันทึกไว้ทบทวนตัวเอง เริ่มทำไว้ตั้งแต่พื้นฐาน ก็เราไม่ได้จบสาขาคอมพิวเตอร์ เราจบไฟฟ้า เราก็พยายามศึกษาเริ่มแต่พื้นฐานไปเรื่อยๆเน๊าะ

ESP8266 ที่ใช้กับ Arduino IDE จะสามารถนำมาทำเป็น WebServer ได้ง่ายกว่าภาษาอื่นๆ เนื่องจากโค้ดนั้นมีความง่ายมากกว่า และมีความยืดหยุ่นอย่างมาก ในบทความนี้เราจะมาลองทำ Basic WebServer ด้วย ESP8266




Code ทำ ESP8266 เป็นเซิร์ฟเวอร์
=========================================

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

// สร้างออปเจ็ค server เพิ่มเริ่มใช้งาน Web Server ที่พอร์ต 80
ESP8266WebServer server(80);

void setup(void){
  WiFi.mode(WIFI_AP); // ใช้โหมดทำตัวเป็น AP

  // เมื่อเข้ามาที่ลิ้ง /
  server.on("/", []() {
    server.send(200, "text/html", "<h1>Hello, world !</h1>");
  });

  server.begin(); // เปิดการใช้งาน Web Server
}

void loop() {
  server.handleClient(); // ตรวจสอบว่ามีคนเรียกหน้าเว็บแล้วหรือยัง (เอาไว้ในฟังก์ชั่น loop() เสมอ)
}
=========================================

แล้วกด Upload





ทดสอบการเชื่อมต่อเข้า Wi-Fi Server ของ NodeMCU ESP8266
ใช้มือถือต่อเข้า WiFi จะเห็นชื่อ ESP_291170





ใช้ Browser เข้า URL 192.168.4.1 ของ ESP8266 Server
โดยปกติ Server ที่ NodeMCU ตั้งมาจะเป็น 192.168.4.1
เมื่อเปิดเข้าไป จะมีข้อความแสดงออกมาว่า Hello, World !
ซึ่งแสดงว่า WEB Server บน ESP8266 ใช้งานได้แล้ว




      WiFi ถือเป็นหัวใจสำคัญและเป็นจุดเด่นของ ESP32 เลยก็ว่าได้ ด้วยการรวมส่วนของ WiFi มาในชิปพร้อมกับไมโครคอนโทรลเลอร์ทำให้สามารถประหยัดพื้นที่โดยรวมของระบบได้ รวมทั้งทำให้สามารถจัดการเรื่องของพลังงานได้ง่ายมากยิ่งขึ้น นอกจากนี้การใช้งาน WiFi ใน ESP32 ยังง่ายกว่าชิป WiFi ตัวอื่นมาก โดยมีคุณสมบัติพิเศษคือสามารถเลือกโหมดการใช้งาน WiFi ได้ 3 โหมด คือ โหมด AP (Access Point) โหมด STA (Station) และโหมด AP+STA ซึ่งทั้ง 3 โหมดจะมีการใช้งานที่แตกต่างกันเล็กน้อย การเลือกโหมดใช้งานจะเลือกตามลักษณะงานที่นำไปใช้เป็นหลัก

โหมด AP
      AP ย่อมาจาก Access Point เป็นโหมดที่จะใช้ ESP32 เป็นตัวปล่อยสัญญาณ WiFi ออกไป เพื่อให้อุปกรณ์ต่าง ๆ มาเชื่อมต่อด้วย ทั้งนี้ ESP32 จะรองรับอุปกรณ์ที่มาเชื่อมต่อด้วยเพียง 1 ตัวเท่านั้น เหมาะสำหรับงานที่ไม่ต้องการใช้งานอินเตอร์เน็ตหรือติดต่อกับอุปกรณ์อื่นในวงแลน นอกจากนี้โหมดนี้ยังเหมาะกับการนำไปควบคุมอุปกรณ์ต่าง ๆ ผ่าน WiFi อีกด้วย ซึ่งงานควบคุมที่สามารถย้ายที่ได้ และไม่ต้องใช้งานผ่านอินเตอร์เน็ตจะเหมาะกับการใช้งาน ESP32 ในโหมด AP มาก

โหมด STA
      STA ย่อมาจาก Station เป็นโหมดที่จะใช้ ESP32 ไปเชื่อมต่อกับอุปกรณ์ปล่อยสัญญาณอื่น ๆ เช่น เร้าเตอร์ โทรศัพท์มือถือที่เปิดฮอตสปอต การใช้งานในโหมดนี้นิยมใช้กับงานที่ต้องการเชื่อมต่ออินเตอร์เน็ต หรือมีการสื่อสารกับอุปกรณ์หลาย ๆ ในวงแลน ในงานด้าน IoT Smart Home และ Smart Farm มักใช้งานในโหมดนี้เพื่อส่งข้อมูลจากเซ็นเซอร์ขึ้นไปบนระบบคลาวด์และใช้โหมดนี้เพื่อเชื่อมต่อกับระบบคลาวด์รับคำสั่งมีสั่งอุปกรณ์ต่าง ๆ ให้ทำงานผ่านอินเตอร์เน็ต

โหมด AP+STA
      เป็นโหมดที่จะให้โมดูล WiFi ภายใน ESP32 ทำงานทั้ง 2 โหมด นั่นคือ AP และ STA ร่วมกัน ข้อดีของการใช้โหมดนี้คืออุปกรณ์ภายนอกสามารถเชื่อมต่อเข้ามาที่ ESP32 ได้ และ ESP32 สามารถไปเชื่อมต่อกับอุปกรณ์ภายนอกได้ ในโหมดนี้มักใช้กับงานที่ต้องการใช้งานอินเตอร์เน็ตและมีการเคลื่อนย้ายบ่อย ๆ หรือสามารถเปลี่ยนสถานที่ใช้งานได้ โดยในโหมด AP จะทำให้อุปกรณ์ต่าง ๆ สามารถเข้ามาตั้งค่าการเชื่อมต่อ WiFi กับเร้าเตอร์หรืออุปกรณ์อื่นๆ ได้ ในโหมด STA ก็จะนำค่าที่ตั้งไว้มาใช้เชื่อมต่อกับเร้าเตอร์ หรืออุปกรณ์อื่น ๆ ที่ได้ตั้งค่าไว้

ฟังก์ชั่นที่เกี่ยวข้องกับการใช้งาน WiFi
ในการจัดการ WiFi จะมีฟังก์ชั่นต่าง ๆ ที่สามารถเรียกใช้เพื่อกำหนดค่าต่าง ๆ ของ WiFi ได้ โดยหลังการกำหนดค่าไปครั้งแรกแล้วจะมีการจดจำค่านั้นไว้ หากไม่มีการเปลี่ยนแปลงโดยใช้ฟังก์ชั่นตั้งค่าใหม่ ตัว ESP32 จะยึดการตั้งค่านั้นไว้ทุกครั้ง

การตั้งโหมดใช้งาน WiFi
ใช้ฟังก์ชั่น WiFi.mode() ในการตั้งโหมด มีรูปแบบการใช้งานดังนี้

      void WiFi.mode(wifi_mode_t mode);


มีค่าพารามิเตอร์ตัวเดียว ดังนี้

(wifi_mode_t) mode -> เลือกโหมดที่ต้องการกำหนด ซึ่งสามารถเป็นไปได้ดังนี้
  - WIFI_AP -> ใช้งานในโหมด AP
  - WIFI_STA -> ใช้งานในโหมด STA
  - WIFI_AP_STA -> ใช้งานในโหมด AP+STA
  - WIFI_OFF -> ปิดการใช้งาน WiFi
     และไม่มีค่าตอบกลับ

ฟังก์ชั่นใช้งาน WiFi ในโหมด AP
ฟังก์ชั่นที่เกี่ยวข้องมีอยู่หลายตัวด้วยกัน ดังนี้

กำหนดค่า WiFi ในโหมด AP ->ใช้ฟังก์ชั่น WiFi.softAP() มีรูปแบบใช้งานดังนี้

      void WiFi.softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0);

มีรายละเอียดของพารามิเตอร์ดังนี้

(const char*) ssid -> ชื่อของ WiFi ที่ต้องการตั้ง เมื่อใช้อุปกรณ์อื่นค้นหาจะแสดงชื่อนี้
(const char*) passphrase -> รหัสผ่านที่ต้องการตั้ง กรณีต้องการให้มีรหัสผ่านต้องมีตัวอักษรที่ตั้งอย่างน้อย 8 ตัว 
    มีค่าเริ่มต้นเป็น NULL หรือไม่มีรหัสผ่าน
(int) channel -> ช่องสัญญาณ WiFi ที่ต้องการ มีค่าเริ่มต้นเป็นช่องที่ 1
(int) ssid_hidden -> ซ่อนจากการค้นหา
และไม่มีค่าตอบกลับ ค่าพารามิเตอร์ที่มีค่าเริ่มต้นอยู่แล้วสามารถไม่กำหนดค่าได้

กำหนดค่า IP ในโหมด AP -> ในโหมด AP จะสามารถกำหนดค่าทาง IP ได้โดยใช้ฟังก์ชั่นต่อไปนี้

      void WiFi.softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);


มีรายละเอียดของค่าพารามิเตอร์ดังนี้

(IPAddress) local_ip -> กำหนดค่า IP ให้กับ ESP32 เมื่อมีอุปกรณ์อื่น ๆ มีเชื่อมต่อกับ ESP32 จะเห็น IP ของ ESP32 ตามค่าพารามิเตอร์ที่กำหนดนี้
(IPAddress) gateway -> กำหนด IP ของ Gateway ให้กับ ESP32
(IPAddress) subnet -> กำหนด IP ของ Subnet ให้กับ ESP32
และไม่มีค่าตอบกลับ หากไม่มีการเรียกใช้ฟังก์ชั่นนี้เพื่อกำหนดค่า ค่าเริ่มต้นของ ESP32 จะมีหมายเลข IP เป็น 192.168.4.1

เรียกดู IP ในโหมด AP – สามารถใช้ฟังก์ชั่น WiFi.softAPIP() เพื่อเรียกดูได้ ซึ่งมีรูปแบบการใช้งานดังนี้

      IPAddress WiFi.softAPIP();

ไม่มีค่าพารามิเตอร์ แต่มีการส่งกลับข้อมูลในรูปแบบ IPAddress

ฟังก์ชั่นใช้งาน WiFi ในโหมด STA
การใช้งาน WiFi ในโหมด STA จะมีฟังก์ชั่นต่าง ๆ ที่เกี่ยวข้องกับการเชื่อมต่ออยู่หลายตัว เพื่อความเข้าใจที่ตรงกันจึงขอเรียกอุปกรณ์ที่จะไปเชื่อมต่อด้วย เช่น เร้าเตอร์ มือถือ ว่า Access Point

เชื่อมต่อกับ Access Point – ใช้ฟังก์ชั่น WiFi.begin() ซึ่งมีรูปแบบการใช้งานดังนี้

      void WiFi.begin(char *ssid, char *passphrase = NULL);


มีรายละเอียดของพารามิเตอร์แต่ละตัวดังนี้

(char*) ssid -> ชื่อของ WiFi ที่ต้องการให้ไปเชื่อมต่อด้วย
(char*) passphrase -> รหัสผ่านของ WiFi ที่ต้องการเชื่อมต่อ ค่าเริ่มต้นเป็น NULL หรือไม่มีรหัสผ่าน
และไม่มีการส่งค่ากลับ

ตรวจสอบสถานะการเชื่อมต่อกับ Access Point – สามารถใช้งานได้หลายฟังก์ชั่น ซึ่งการตรวจสอบสถานะปัจจุบันนิยมใช้ฟังก์ชั่น WiFi.status() ซึ่งมีรูปแบบการใช้งานดังนี้

      wl_status_t WiFi.status();

ไม่มีค่าพารามิเตอร์ มีค่าที่ตอบกลับมาได้ดังนี้

WL_IDLE_STATUS -> กำลังเริ่มต้นการเชื่อมต่อ
WL_NO_SSID_AVAIL -> ไม่พบชื่อ WiFi ที่ต้องการเชื่อมต่อในพื้นที่
WL_SCAN_COMPLETED -> ค้นหา WiFi เสร็จสิ้นแล้ว (ใช้กรณีเรียกฟังก์ชั่นค้นหา WiFi)
WL_CONNECTED -> เชื่อมต่อกับ Access Point สำเร็จ
WL_CONNECT_FAILED -> เชื่อมต่อกับ Access Point ไม่สำเร็จ
WL_CONNECTION_LOST -> หลุดจากการเชื่อมต่อกับ Access Point และจะมีการเชื่อมต่อใหม่อัตโนมัติ
WL_DISCONNECTED -> ไม่ได้เชื่อมต่อกับ Access Point ใด ๆ
นอกจากนี้ยังนิยมใช้งานฟังก์ชั่น WiFi.isConnected() ด้วย ซึ่งมีรูปแบบการใช้งานดังนี้

      bool WiFi.isConnected();

ไม่มีพารามิเตอร์ และมีข้อมูลที่ตอบกลับเป็นชนิด bool หากกำลังเชื่อมต่อกับ Access Point จะให้ค่าเป็นจริง (True) และหากเป็นสถานะอื่น ๆ จะให้ค่าเป็นเท็จ (False)

รอเชื่อมต่อกับ Access Point สำเร็จ -> ในหลากตัวอย่างมักใช้ฟังก์ชั่น WiFi.status() วนตรวจสอบสถานะจนกว่าจะเชื่อมต่อสำเร็จ แต่ในบางโค้ดตัวอย่างก็มีการเลือกใช้ฟังก์ชั่นรอเชื่อมต่อโดยเฉพาะ นั่นคือ WiFi.waitForConnectResult() มีรูปแบบการใช้งานดังนี้

      wl_status_t WiFi.waitForConnectResult();

ไม่มีค่าพารามิเตอร์ และจะตอบกลับผลการรอเชื่อมต่อออกมา ซึ่งค่าที่เป็นไปได้เหมือนกับค่าที่ได้ในฟังก์ชั่น WiFi.status() ทั้งนี้ฟังก์ชั่น WiFi.waitForConnectResult() จะรอเชื่อมต่อกับ Access Point เพียง 10 วินาทีเท่านั้น หากเกิน 10 วินาทีจะยกเลิกการรอแล้วการทำงานจะหลุดออกจากฟังก์ชั่น

เชื่อมต่อกับ Access Point ใหม่อีกครั้ง -> ใช้ฟังก์ชั่น WiFi.reconnect() ซึ่งมีรูปแบบการใช้งานดังนี้

      void WiFi.reconnect();

ไม่มีค่าพารามิเตอร์ และค่าที่ตอบกลับ แต่โดยปกติแล้ว ESP32 เมื่อการเชื่อมต่อจาก Access Point หลุด มักจะมีการเชื่อมต่อใหม่ให้อัตโนมัติอยู่แล้ว

ยกเลิกเชื่อมต่อกับ Access Point – ใช้ฟังก์ชั่น WiFi.disconnect() ซึ่งมีรูปแบบการใช้งานดังนี้

      void WiFi.disconnect(bool wifioff = false);

มีค่าพารามิเตอร์ 1 ตัว คือ

(bool) wifioff -> ตั้งโหมดใช้งาน WiFi เป็นปิดใช้งาน
และไม่มีค่าที่ส่งกลับมา

เรียกดูหมายเลข IP ที่ได้จาก Access Point – ใช้ฟังก์ชั่น WiFi.localIP() ในการเรียกดู มีรายละเอียดการใช้งานดังนี้

      IPAddress WiFi.localIP();

ไม่มีค่าพารามิเตอร์ และมีข้อมูลที่ตอบกลับชนิด IPAddress

ฟังก์ชั่นที่ใช้ค้นหา WiFi ที่เชื่อมต่อได้
สำหรับ ESP32 สามารถใช้เพื่อค้นหา WiFi รวมถึงบอกได้ว่าชื่อ WiFi หรือ Access Point นั้น ๆ มีความแรงของสัญญาณเท่าไร และสามารถบอกได้ว่ามีรหัสผ่านหรือไม่ ซึ่งฟังก์ชั่นที่ใช้มีดังนี้

ค้นหา WiFi -> ใช้ฟังก์ชั่น WiFi.scanNetworks() มีรูปแบบการใช้งานดังนี้

      int WiFi.scanNetworks();

ไม่มีค่าพารามิเตอร์ และหากเรียกใช้โปรแกรมจะติดอยู่ในฟังก์ชั่นนี้จนกว่าจะค้นหาเสร็จ แล้วส่งค่ากลับมาเป็นข้อมูลชนิด int ซึ่งเป็นจำนวนของชื่อ WiFi ทั้งหมดที่ค้นหาพบ

ดึงรายละเอียด WiFi ที่ค้นหาพบ -> หลังจากใช้ฟังก์ชั่น WiFi.scanNetworks() ค้นหาไปแล้ว และได้จำนวน WiFi ที่ค้นหาพบมา ต่อมาคือการดึงข้อมูลเหล่านั้นออกมาใช้ ฟังก์ชั่นที่ใช้ดึงชื่อ WiFi ออกมามีรูปแบบการใช้งานดังนี้

      String WiFi.SSID(int networkItem);

มีค่าพารามิเตอร์ 1 ตัว คือ

(int) networkItem -> ลำดับของ WiFi ที่ค้นพบ
และตอบกลับมาเป็นชื่อ WiFi

ฟังก์ชั่นที่ใช้ดึงค่าความแรงของสัญญาณมีรูปแบบดังนี้

      long WiFi.RSSI(int networkItem);

มีค่าพารามิเตอร์ 1 ตัว คือ

(int) networkItem – ลำดับของ WiFi ที่ค้นพบ
และตอบกลับมาเป็นข้อมูลความแรงของสัญญาณชนิด long

ฟังก์ชั่นที่ใช้ดึงข้อมูลว่ามีรหัสผ่านหรือไม่ มีรูปแบบการใช้งานดังนี้

      wifi_auth_mode_t encryptionType(int networkItem);

มีค่าพารามิเตอร์ 1 ตัว คือ

(int) networkItem -> ลำดับของ WiFi ที่ค้นพบ
และมีการตอบกลับมาเป็นข้อมูลชนิด wifi_auth_mode_t มีความเป็นไปได้ดังนี้

WIFI_AUTH_OPEN -> ไม่มีรหัสผ่าน
WIFI_AUTH_WEP -> มีรหัสผ่าน และเข้ารหัสแบบ WEP
WIFI_AUTH_WPA_PSK -> มีรหัสผ่าน และเข้ารหัสแบบ WPA PSK
WIFI_AUTH_WPA2_PSK -> มีรหัสผ่าน และเข้ารหัสแบบ WPA2 PSK
WIFI_AUTH_WPA_WPA2_PSK -> มีรหัสผ่าน และเข้ารหัสแบบ WPA/WPA2 PSK
WIFI_AUTH_WPA2_ENTERPRISE -> มีรหัสผ่าน และเข้ารหัสแบบ WEP




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