Lab 6
การเชื่อมต่อ NodeMCU กับเครือข่าย WiFi
VDO Link : https://www.youtube.com/watch?v=Gug6Zc2hBXI
ระดับความยากง่าย
● ง่าย
ประมาณเวลาที่ใช้เรียนรู้ + ลงมือปฏิบัติตาม
● 30 นาที – 1 ชั่วโมง
Prerequisite ต้องผ่านหัวข้อหรือใบงานกิจกรรมใดมาก่อน
● Module NETPIE on NodeMCU/ESP8266 Lab 1 ติดตั้ง Arduino IDE และทดสอบการทำงานเบื้องต้นของ NodeMCUESP8266 (https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/chapter1.html)
● Module NETPIE on NodeMCU/ESP8266 Lab 3 การติดต่อ Digital Input (https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/lab-3.html)
วัตถุประสงค์
- เพื่อให้รู้วิธีเขียนโปรแกรมให้ NodeMCU/ESP8266 เชื่อมต่อกับเครือข่าย WiFi ได้
- เพื่อให้รู้วิธีเขียนโปรแกรมให้ NodeMCU/ESP8266 เชื่อมต่อกับเครือข่าย WiFi แบบ SmartConfig ได้
อุปกรณ์ที่ใช้ในการทดลอง
1.บอร์ด NodeMCU ESP8266 (ESP-12E)
2.Breadboard
3.สายไฟเชื่อมต่อ (Male to Female)
4.สวิตช์กดติดปล่อยดับ (Tact switch) สามารถหาซื้อได้ที่ร้านอิเล็กทรอนิกส์ทั่วไป
เนื้อหาเชิงทฤษฎี
ในแล็บนี้แบ่งการทดลองออกเป็น 2 ส่วน ส่วนแรกคือการเขียนโปรแกรมให้บอร์ด NodeMCU/ESP8266 ซึ่งรองรับการเชื่อมต่อเครือข่ายมาตรฐาน IEEE 802.11b/g/n ให้สามารถเชื่อมต่อ กับเครือข่าย WiFi ได้เพื่อให้บอร์ดเชื่อมต่อกับอินเทอร์เน็ตต่อไป ส่วนที่สองเป็นการทำให้บอร์ด NodeMCU/ESP8266 เชื่อมต่อกับเครือข่าย WiFi แบบ SmartConfig ข้อดีของโหมด SmartConfig คือผู้ใช้งานบอร์ดไม่ต้องระบุ SSID (ชื่อของเครือข่าย WiFi) และ Password ในลงในโปรแกรมเหมือนกับในการทดลองส่วนแรก เพราะบอร์ด NodeMCU/ESP8266 จะทำหน้าที่เป็น Access Point ให้เราสามารถตั้งค่าเครือข่ายให้กับบอร์ด NodeMCU/ESP8266 ได้โดยตรงผ่านเบราว์เซอร์ในอุปกรณ์สื่อสารไร้สายที่มีโมดูล WiFi หลังเสร็จสิ้นการตั้งค่า บอร์ด NodeMCU/ESP8266 จะทำการ Restart เราสามารถตั้งค่าได้ล่วงหน้าว่าหลัง Restart แล้วจะให้บอร์ดกลับสู่โหมดทำงานตามปกติ หรืออยู่โหมด SmartConfig หรือ จะทำงานแบบปกติได้อีกด้วย โดยการกดปุ่มที่ได้ตั้งค่าไว้ในตัวโปรแกรมเพื่อเลือกโหมดการทำงานนั้นเอง
คุณสมบัติด้าน WiFi ของ NodeMCU/ESP8266
เนื่องจาก NodeMCU/ESP8266 นั้นสายอากาศในตัว จึงทำให้สามารถเชื่อมต่อ WiFi ได้โดยไม่ต้องต่ออุปกรณ์หรือสายอากาศเพิ่มเติม และคุณสมบัติทางเทคนิคที่สำคัญของโมดูล WiFi บน NodeMCU/ESP8266 มีดังนี้
● รองรับมาตรฐาน IEEE802.11 b/g/n
● รองรับการทำงานแบบ WiFi Direct (P2P) และ SoftAP
● TCP/IP Stack
● วงจรสวิตช์ TR, สายอากาศที่มี Balun, LNA หรือวงจรขยายสัญญาณรบกวนต่ำ, วงจรขยายกำลังและแมตชิ่งเน็ตเวิร์กเพื่อการรับคลื่นวิทยุอย่างมีประสิทธิภาพ
● วงจรเฟสล็อกลูปและวงจรควบคุมสัญญาณออสซิลเลเตอร์แบบดิจิตอล (DCXO) เพื่อช่วยบริหารจัดการด้านความถี่
● วงจรบริหารกำลังไฟฟ้าและวงจรควบคุมไฟเลี้ยงคงที่ เพื่อช่วยให้วงจร WiFi ใช้กำลังได้อย่างเหมาะสม โดยปกติต้องการกระแสไฟฟ้า 0.9 mA ในขณะแสตนด์บาย, 135-215 mA ขณะส่งข้อมูล, 60 mA เมื่อรับข้อมูล, 1 mA ในโหมดประหยัดพลังงาน และ 0.5 μA ในขณะปิด
● กำลังส่ง +19.5dBm เมื่อทำงานในโหมด 802.11b
ฟังก์ชั่นของโปรแกรมที่ควรทราบ
● serial.begin
serial.begin เป็นฟังก์ชั่นที่ใช้ในการตั้งค่าความเร็วในการส่งข้อมูลของพอร์ต serial ที่เชื่อมต่อระหว่างบอร์ดกับคอมพิวเตอร์
Syntax:
serial.begin(speed)
Parameter:
speed: ความเร็วในการรับส่งข้อมูล หน่วยเป็นบิตต่อวินาที (baud)
● serial.print
serial.print เป็นฟังก์ชั่นเพื่อให้บอร์ดส่งค่าข้อมูลออกไปพิมพ์ทางพอร์ต serial
Syntax:
serial.print(val)
serial.print(val, format)
Parameter:
val: ค่าข้อมูลที่ต้องการพิมพ์ จะเป็นชนิดใดก็ได้
format: ใช้ในกรณีตัวเลข และต้องการระบุฐานของตัวเลข หรือจำนวนทศนิยม เช่น BIN, DEC, HEX, 1 (ทศนิยม 1 หลัก)
● serial.println
serial.println เป็นฟังก์ชั่นที่ทำงานเหมือนกับ serial.print ต่างกันตรงที่เมื่อใช้คำสั่ง serial.println จะขึ้นต้นบรรทัดใหม่เมื่อพิมพ์ค่าข้อมูลเสร็จ
Syntax:
serial.println(val)
serial.println(val, format)
Parameter:
val: ค่าข้อมูลที่ต้องการพิมพ์ จะเป็นชนิดใดก็ได้
format: ใช้ในกรณีตัวเลข และต้องการระบุฐานของตัวเลข หรือจำนวนทศนิยม เช่น BIN, DEC, HEX, 1 (ทศนิยม 1 หลัก)
● WiFi.begin
WiFi.begin เป็นฟังก์ชั่นเพื่อเตรียมการ WiFi Library และตั้งค่าเครือข่าย ให้ผลลัพธ์เป็นค่าสถานะ
Syntax:
WiFi.begin()
WiFi.begin(ssid)
WiFi.begin(ssid,pass)
Parameter:
ssid: ชื่อเครือข่าย WiFi ที่ต้องการเชื่อมต่อ
pass: รหัสผ่านในกรณีเครือข่ายที่เข้ารหัส WPA
Return:
WL_CONNECTED: เมื่อเชื่อมต่อสำเร็จ
WL_IDLE_STATUS: เมื่อเปิดอยู่แต่ยังไม่ได้เชื่อมต่อ
● WiFi.status
WiFi.status เป็นฟังก์ชั่นเพื่อตรวจสอบสถานะการเชื่อมต่อเครือข่าย WiFi
Syntax:
WiFi.begin()
Return:
WL_CONNECTED: เชื่อมต่อสำเร็จ
WL_NO_SHIELD: ไม่พบ WiFi Shield
WL_IDLE_STATUS: บอร์ดเปิดอยู่แต่ยังไม่ได้เชื่อมต่อ เป็นสถานะชั่วคราวขณะความพยายามเชื่อมต่อ
WL_NO_SSID_AVAIL: ไม่มี SSID ใดๆ ให้เชื่อมต่อ
WL_SCAN_COMPLETED: การสำรวจเครือข่ายเสร็จสิ้น
WL_CONNECT_FAILED: การเชื่อมต่อล้มเหลว
WL_CONNECTION_LOST: การเชื่อมต่อขาดหลุด
WL_DISCONNECTED: ยกเลิกการเชื่อมต่อ
การทดลองที่ 1 การเชื่อมต่อ NodeMCU/ESP8266 กับเครือข่าย WiFi
1.1 เปิดโปรแกรม Arduino IDE แล้วไปที่เมนู File -> New File
1.2 เขียนโค้ดลงไปในโปรแกรมดังนี้
#include <ESP8266WiFi.h>
const char* ssid = "Your WiFi SSID";
const char* password = "Your Password";
void setup()
{
Serial.begin(115200);
Serial.println("Starting...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(250);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
}
คำอธิบายโปรแกรม
การกำหนด #include เป็นการประกาศเรียกใช้ไลบรารี่ WiFi ของ ESP8266 (ESP8266WiFi.h) แล้วกำหนดค่า SSID และรหัสผ่านของเครือข่าย WiFi ที่ต้องการเชื่อมต่อเก็บไว้ที่ตัวแปร ssid และ password ตามลำดับ
ส่วนภายในฟังก์ชั่น setup() เริ่มจากตั้งค่าความเร็วเริ่มต้นของ Serial ที่ 115,200 bits/s เมื่อตั้งความเร็วสายแล้ว สั่งพิมพ์คำว่า Starting… ออกที่หน้าจอคอมพิวเตอร์ และเริ่มทำการเชื่อมต่อกับเครือข่าย WiFi ด้วยคำสั่ง WiFi.begin จากนั้นคอยวนตรวจสอบว่าเชื่อมต่อสำเร็จหรือไม่ด้วยคำสั่ง WiFi.status หากยังไม่เชื่อมต่อให้หน่วงเวลา 250 ms และแสดงจุดออกมาที่หน้าจอคอมพิวเตอร์ หากมีการเชื่อมต่อเรียบร้อยแล้ว ให้แสดงคำว่า WiFi connected และแสดงหมายเลข IP Address ของ NodeMCU/ESP82266 ที่ได้รับมาโดยใช้คำสั่ง WiFi.localIP
1.3 คลิกที่ปุ่ม เพื่อคอมไพล์โค้ด แล้วทำการบันทึกไฟล์เป็น “Connect_Ethernet” ไว้บน Desktop หากไม่มีข้อผิดพลาด ทำการอัพโหลดโดยคลิกปุ่ม เมื่อเสร็จเรียบร้อยแล้วจะปรากฏข้อความ “Done uploading” ขึ้นดังภาพ
1.4 คลิกที่ปุ่ม (Serial monitor) และทำการกดสวิตช์ค้างไว้ สังเกตผลลัพธ์บนจอดังภาพ
การทดลองที่ 2 การเชื่อมต่อ NodeMCU/ESP8266 กับเครือข่าย WiFi ในโหมด SmartConfig
ในการทดลองนี้ ผู้ศึกษาจะได้เรียกใช้ไลบรารี่ WiFiManager เพื่อเชื่อมต่อบอร์ด NodeMCU/ESP8266 ในโหมด SmartConfig หรือโหมด Access Point โดยการทำงานของไลบรารี่มีดังนี้
I) เมื่อบอร์ดเริ่มต้นทำงาน จะเข้าสู่โหมดปกติหรือ Station และจะพยายามเชื่อมต่อกับเครือข่าย WiFi ที่บันทึกไว้เดิม
II) หากเชื่อมต่อไม่สำเร็จ บอร์ดจะเปลี่ยนเข้าสู่โหมด SmartConfig หรือ Access Point โดยมี Web Server ที่มี Default IP 192.168.4.1 และ DNS Server ที่จะนำทราฟฟิกทั้งหมดของอุปกรณ์ที่มาต่อกับบอร์ดไปยัง Default Webserver
III) เมื่อนำอุปกรณ์สื่อสารที่มี WiFi Module มาเชื่อมต่อกับบอร์ดในโหมด SmartConfig เมื่อเปิดเว็บเบราว์เซอร์จะปรากฎ Captive Portal ให้ใส่ SSID และ Password ของเครือข่าย WiFi ที่ต้องการตั้งให้บอร์ดเชื่อมต่อ และทำการบันทึกเอาไว้
IV) บอร์ดจะ Reboot และเข้าสู่โหมด Station ตามปกติ วนกลับไปสู่ข้อ I) เราจะผสมผสานความรู้ที่ได้จาก Module NETPIE on NodeMCU/ESP8266 Lab 3 การติดต่อ Digital Input โดยออกแบบให้มีปุ่มกดเพื่อบังคับให้บอร์ดเข้าสู่โหมด SmartConfig หลังจากเริ่มทำงานทันที
ขั้นตอนการทดลอง
2.1 ต่อสวิตช์ดังภาพ สวิตช์ตัวนี้จะถูกโปรแกรมให้เป็นปุ่มเลือกโหมดของบอร์ดดังที่กล่าวมาข้างต้น
2.2 เพิ่มไลบรารี่ WiFi Manager ใน Arduiono IDE โดยไปที่เมนู Sketch -> Include Library -> Manage Libraries
2.3 พิมพ์ WiFi Manager ในช่องค้นหาดังรูปข้างล่าง เมื่อผลการค้นปรากฏ ให้คลิกที่ WiFiManager จากนั้นคลิก Install.
2.4 เขียนโค้ดลงในโปรแกรมดังนี้
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
// set pin numbers:
#define D0 16 // USER LED Wake
#define ledPin D0 // the number of the LED pin
#define D1 5
#define ConfigWiFi_Pin D1
#define ESP_AP_NAME "ESP8266 Config AP"
void setup()
{
// initialize pin D0 as an output.
pinMode(ledPin, OUTPUT);
pinMode(ConfigWiFi_Pin,INPUT_PULLUP);
Serial.begin(115200);
digitalWrite(ledPin,LOW);//Turn on the LED
//WiFiManager
//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;
if(digitalRead(ConfigWiFi_Pin) == LOW) // Press button
{
//reset saved settings
wifiManager.resetSettings(); // go to ip 192.168.4.1 to config
}
//fetches ssid and password from EEPROM and tries to connect
//if it does not connect, it starts an access point with the specified name
//and goes into a blocking loop awaiting configuration
wifiManager.autoConnect(ESP_AP_NAME);
while (WiFi.status() != WL_CONNECTED)
{
delay(250);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
digitalWrite(ledPin,HIGH);
}
void loop()
{
digitalWrite(D0, HIGH); // turn off the LED
delay(2000); // wait for two seconds
digitalWrite(D0, LOW); // turn on the LED
delay(2000); // wait for two seconds
}
คำอธิบายโปรแกรม
การกำหนด #include เป็นส่วนการประกาศเรียกใช้ไลบรารี่ WiFi ของ ESP8266 (ESP8266WiFi.h), ไลบรารี่ที่เกี่ยวข้องกับการจัดการ DNS Server (DNSServer.h) , ไลบรารี่ที่เกี่ยวข้องกับการจัดการ Web Server บน ESP8266 (ESP8266WebServer.h) และไลบรารี่ที่เกี่ยวข้องกับการจัดการ WiFi เพื่อให้ ESP8266 ส่งสัญญาณเป็น Access point (WiFiManager.h)
การกำหนด #define เริ่มจากการกำหนดให้ขา 16 ของ ESP8266 เป็นขา D0 บน NodeMCU และกำหนดให้เรียกขา D0 ของ NodeMCU ซึ่งต่อกับ LED บนบอร์ดว่า ledPin ต่อมากำหนดให้ขา 5 ของ ESP8266 เป็นขา D1 แล้วให้เรียกขา D1 ว่า ConfigWiFi_Pin เนื่องจากเราใช้ขานี้ต่อกับสวิตช์กดเลือกโหมดในข้อที่ 2.1 ในโหมด SmartConfig ซึ่งบอร์ดทำงานเป็น WiFi Access Point จึงกำหนดชื่อให้เป็น ESP8266 Config AP
ส่วนภายในฟังก์ชั่น setup() กำหนดให้ขา ledPin ทำงานในโหมด Output และขา ConfigWiFi_Pin ทำงานในโหมด Input Pullup ตั้งค่าความเร็วของพอร์ต Serial ที่ 115,200 บิตต่อวินาที และสั่งให้เขียนลอจิก Low ไปยังขา ledPin เพื่อเปิดหลอด LED ซึ่งเป็นตัวบ่งชี้ว่าบอร์ดกำลังอยู่ในช่วงตั้งค่าและติดต่อเครือข่าย WiFi จากนั้นประกาศ Object WiFiManager เพื่อเริ่มต้นเรียกใช้ไลบรารี่ WiFi Manager แล้วอ่านค่าลอจิกจากขา ConfigWiFi_Pin หากมีการกด (ลอจิก Low) ให้รีเซ็ตค่าเครือข่ายที่เคยบันทึกไว้ เป็นการบังคับให้บอร์ดเข้าสู่โหมดการทำงานแบบ SmartConfig หากไม่มีการกดปุ่ม บอร์ดจะเริ่มต้นจากโหมด Station ตามปกติตามลำดับขั้นตอนการทำงานที่บรรยายไว้ในตอนต้น หลังจากตั้งค่าและบันทึกเรียบร้อย บอร์ดจะพยายามเชื่อมต่อ จึงมีคำสั่งวนลูปเพื่อตรวจสอบสถานะการเชื่อมต่อด้วยคำสั่ง WiFi.status หากยังไม่เชื่อมต่อให้หน่วงเวลา 250 ms และแสดงจุดออกมาที่หน้าจอคอมพิวเตอร์ หากมีการเชื่อมต่อเรียบร้อยแล้ว ให้แสดงคำว่า WiFi connected และแสดงหมายเลข IP Address ของ NodeMCU/ESP82266 ที่ได้รับมา โดยคำสั่ง WiFi.localIP และส่งลอจิก High ไปยังขา ledPin เพื่อปิดหลอด LED เป็นการบ่งชี้ว่าขั้นตอนการเชื่อมต่อสิ้นสุดและสำเร็จ
ส่วนภายในฟังก์ชั่น loop() เริ่มจากส่งลอจิก HIGH ไปยังขา ledPin เพื่อปิดหลอดไฟ LED แล้วหน่วงเวลา 2 วินาที จากนั้นส่งลอจิก LOW ไปยังขา ledPin เพื่อเปิดหลอดไฟ LED แล้วหน่วงเวลาอีก 2 วินาที จากนั้นกลับไปยังคำสั่งแรกในฟังก์ชั่น วนลูปซ้ำเช่นนี้ไปเรื่อยๆ
2.5 คลิกปุ่ม เพื่อคอมไพล์โค้ด แล้วทำการบันทึกไฟล์เป็น “Relay” ไว้บน Desktop (ดังภาพตัวอย่างด้านล่าง เมื่อคอมไพล์เสร็จสิ้นและไม่มีข้อผิดพลาด ทำการอัพโหลดโดยคลิกปุ่ม
2.6 ถอดสาย USB ออก แล้วกดสวิตช์ที่ต่อกับขา D1 ค้างไว้ และเสียบสาย USB กลับเข้าไปใหม่อีกครั้ง จะเห็นหลอดไฟ LED บนบอร์ดติดค้าง (หลังจากนี้สามารถปล่อยปุ่มสวิตช์ได้)
2.7 นำ Smart phone มาตั้งค่าเครือข่าย WiFi โดยเลือกเครือข่ายชื่อ “ESP8266 Config AP” เพื่อเชื่อมต่อกับบอร์ด NodeMCU/ESP8266
2.8 เปิดเว็บเบราว์เซอร์บน Smart Phone ในหน้า Portal ให้เลือกเครือข่าย WiFi ที่ต้องการให้บอร์ด NodeMCU/ESP8266 เชื่อมต่อด้วย โดยในรูปตัวอย่าง เลือกเครือข่ายที่มี SSID ชื่อ “Anoney Potter WiFi” จากนั้นกดปุ่ม Save บอร์ด NodeMCU/ESP8266
2.9 บอร์ด NodeMCU/ESP8266 จะ Reboot ตัวเองและเชื่อมต่อกับเครือข่าย WiFi ที่ผู้ศึกษาเลือก เมื่อเชื่อมต่อสำเร็จ หลอดไฟ LED จะดับไปชั่วครู่ และกลับมากระพริบ
สรุปผล
ในแล็บนี้ เราทำการทดลองสองส่วน ส่วนแรกคือการทดลองการเขียนโปรแกรมเพื่อให้บอร์ด NodeMCU/ESP8266 เชื่อมต่อกับเครือข่าย WiFi ด้วยวิธีฝังค่าเครือข่ายลงในโปรแกรม ส่วนที่สอง ผู้ศึกษาได้ใช้ไลบรารี่ WiFiManager ในการตั้งค่าเครือข่าย WiFi ให้กับบอร์ดในโหมด SmartConfig ผ่าน Web Portal โดยบอร์ด NodeMCU/ESP8266 ทำงานเป็น WiFi Access Point นอกจากนี้ยังผสานความรู้ในการใช้งาน Digital Input เพื่อสร้างปุ่มกดเลือกโหมดการทำงานของบอร์ดได้ การใช้ไลบรารี่ WiFiManager เหมาะกับการใช้งานในสภาพแวดล้อมที่เปลี่ยนแปลงบ่อยๆ เช่นนำบอร์ดไปใช้ต่างสถานที่ การตั้งค่าเครือข่ายในโปรแกรมในกรณีดังกล่าว ทำให้จะต้องเปลี่ยนค่าในโปรแกรม และอัพโหลดโค้ดใหม่ทุกครั้งอยู่เรื่อยๆ เป็นความไม่สะดวก
แบบฝึกหัดทดสอบความเข้าใจ
- เขียนคำสั่งเชื่อมต่อบอร์ดกับเครือข่ายชื่อ netpie_lab และรหัสผ่าน example
- เขียนคำสั่งเพื่อตรวจสอบสถานะว่าเชื่อมต่อกับ สัญญาณ WiFi อยู่หรือไม่
- ถ้าต้องการตั้งค่าเครือข่าย WiFi ให้กับบอร์ด NodeMCU/ESP8266 ในโหมด SmartConfig ต้องเพิ่มและเรียกใช้ไลบรารี่ใด
- ในโหมด SmartConfig บอร์ด NodeMCU/ESP8266 ทำหน้าที่เป็นอะไร มีค่าเริ่มต้นหมายเลข IP Address เป็นอะไร
เฉลย-แบบฝึกหัดทดสอบความเข้าใจ
- WiFi.begin(netpie_lab, example);
- WiFi.status();
- WiFiManager.h
- Access Point , 192.168.4.1
VDO Link : https://www.youtube.com/watch?v=Gug6Zc2hBXI