วันนี้เราจะมาเรียนรู้วิธี ควบคุมอุปกรณ์อิเล็กทรอนิกส์ผ่านแอพ Android บนอินเทอร์เน็ต กันนะน้อง!
บทเรียนนี้คือการควบคุมอุปกรณ์อิเล็กทรอนิกส์ผ่านเทคโนโลยี WiFi นั่นเอง พวกเราคงเคยได้ยินชื่อบอร์ด NodeMCU ESP8266 กันมาบ้างแล้วเนอะ มีคนเขียนบทความและสอนไว้เพียบบนเน็ต ดังนั้น พี่จะโฟกัสไปที่
- การเซ็ตอัพ NodeMCU เพื่ออัปโหลดโค้ดด้วย Arduino IDE
- การเชื่อมต่อ WiFi และการได้ IP Address มา
- การควบคุมไฟ LED ผ่านแอพ Android บนอินเทอร์เน็ต
จัดไปวัยรุ่น!
ภาพรวมโปรเจค
โปรเจค "Cloud-Switch Gateway" นี้คือจุดเริ่มต้นของ IoT ที่เชื่อมต่อฮาร์ดแวร์ในบ้านเข้ากับโลกอินเทอร์เน็ต โดยใช้พลังของ NodeMCU ที่มี ESP8266 อยู่ข้างใน มันจะเปลี่ยนหลอด LED ธรรมดาให้กลายเป็นอุปกรณ์ที่สั่งงานจากที่ไหนก็ได้ในโลก ด้วยการสร้าง เว็บเซิร์ฟเวอร์เบาๆ ลงบนไมโครคอนโทรลเลอร์ ทำให้เราสามารถสั่งงานขา GPIO ผ่านคำสั่ง HTTP ที่ส่งมาจากแอพ Android ที่เราทำขึ้นเอง โปรเจคนี้จะพาน้องรู้จักกับ WiFi Station (STA) mode, IP addressing, และการจัดการ RESTful endpoint ซึ่งเป็นพื้นฐานสำคัญมาก
ขั้นตอนที่ 1: อุปกรณ์ที่ต้องใช้
- บอร์ด NodeMCU ESP8266
- สาย Micro USB สำหรับอัปโหลดโค้ด
- ตัวต้านทาน 330 โอห์ม (330r resistor)
- แอพพลิเคชัน Android
ดาวน์โหลดแอพได้จากด้านล่างนี้เลย:

IOT_light_ashrafminhaj (2).apk Download
ขั้นตอนที่ 2: การต่อขา (Pinout)

ระวังนิดนึง! ขาที่เขียนว่า 'D' บนบอร์ด NodeMCU มันคนละขากับหมายเลข GPIO ที่ใช้ในโค้ดนะ ตรวจสอบให้ดีก่อนต่ออะไรเข้าไป เดี๋ยวไฟไม่ติดจะมานั่งงง
เราจะต่อ LED โดยให้ ขาบวก (Anode) ต่อเข้ากับขา D4 และขาลบ (Cathode) ต่อเข้ากับขา GND ของ NodeMCU
ลงลึกกันหน่อย (Technical Deep-Dive)
- ระบบ WiFi ของ ESP8266:
- STA vs. AP Mode: ในโปรเจคนี้เราเซ็ต NodeMCU ให้อยู่ในโหมด Station (STA) หมายความว่ามันจะไปต่อเป็นลูกขาย (client) กับเราเตอร์ WiFi ในบ้านเรา ซึ่งต่างจากโหมด Access Point (AP) ที่ตัวบอร์ดจะสร้างเครือข่าย WiFi ขึ้นมาเอง STA mode นี่แหละที่ทำให้เราควบคุม "ผ่านอินเทอร์เน็ต" ได้
- TCP/IP Handshaking: พอเปิดเครื่อง ตัวชิปจะทำการขอที่อยู่ IP (DHCP) จากเราเตอร์ ไลบรารี
ESP8266WiFiจะคอยจัดการการเชื่อมต่อนี้ให้เสถียร ถ้าสัญญาณขาดก็จะพยายามเชื่อมต่อใหม่ให้อัตโนมัติ
- โครงสร้าง HTTP Web Server:
- Port 80 Listening: ESP8266 จะสร้างอินสแตนซ์ของ
WiFiServerเพื่อรอรับคำสั่งที่พอร์ต 80 (พอร์ตมาตรฐานของเว็บ) - RESTful Parsing: เวลาแอพ Android ส่งคำสั่งมา มันจะอยู่ในรูปแบบของ GET request (เช่น
GET /gpio/1 HTTP/1.1) โค้ด Arduino จะใช้ฟังก์ชันreadStringUntil('\r')และindexOf()เพื่อแยกวิเคราะห์สตริงนี้ ว่าผู้ใช้ต้องการสั่งให้ขาเป็น High หรือ Low
- Port 80 Listening: ESP8266 จะสร้างอินสแตนซ์ของ
- การทำงานของแอพ Android APK:
- แอพที่เราทำขึ้นทำหน้าที่เป็น Thin Client มันไม่ประมวลผลข้อมูลซับซ้อน แค่รับค่าที่ผู้ใช้กรอก (เช่น IP) และเปลี่ยนการกดปุ่มบนหน้าจอให้เป็นแพ็กเก็ต HTTP ส่งไปหาเซิร์ฟเวอร์ นี่คือตัวอย่างว่าหน้าตา UI ที่สวยงามสามารถซ่อนความซับซ้อนของโปรโตคอลเครือข่ายจากผู้ใช้ปลายทางได้ยังไง
- ความแตกต่างของหมายเลขขา (GPIO Mapping Discrepancy):
- ข้อควรระวังสำคัญสำหรับคนใช้ NodeMCU! ตัวอักษรที่พิมพ์บนบอร์ด (D0, D1, D2...) มันไม่ตรงกับ หมายเลข GPIO ที่เราใช้เขียนโค้ดใน Arduino IDE นะ เช่น ขา D4 บนบอร์ด จริงๆ แล้วคือ GPIO2 ในโค้ด ตรวจสอบแผนภาพการต่อขา (pinout map) ให้ดีก่อนต่อสายทุกครั้ง ไม่งั้นไฟไม่ติดแน่ ห้ามช็อตนะตัวนี้!
ขั้นตอนที่ 3: ตั้งค่า Arduino IDE
วิธีอัปโหลดโค้ดลง NodeMCU ด้วย Arduino IDE
- อัปเดต Arduino IDE (แอปบนคอม) เปิดแอป Arduino ขึ้นมา > ไปที่ Files > Preferences จากนั้นวางลิงก์นี้ลงไปแล้วกด OK.
- ไปที่ Tools > Boards > Board Manager แล้วรอจนกว่ามันจะเจอคุณสมบัติของ ESP8266
- เลื่อนลงไปแล้วกด Install
- จากนั้นก็รีสตาร์ทแอป Arduino ซะ
เป็นอันเรียบร้อย! ตอนนี้เราสามารถอัปโหลดโค้ดภาษา C/C++ ลง NodeMCU ESP8266 ด้วย Arduino IDE ได้แล้ววว
วิศวะฯ และการลงมือทำ
- ตั้งค่า Board Manager: ถ้าอยากใช้ NodeMCU กับ Arduino IDE ต้องเพิ่ม JSON URL ของ ESP8266 ลงใน "Additional Boards Manager" ก่อน มันจะไปดาวน์โหลดเครื่องมือ (คอมไพเลอร์และไลบรารี) ที่จำเป็นสำหรับการคอมไพล์โค้ด C++ ให้กับโปรเซสเซอร์ Xtensa L106 มาให้เอง
- ขั้นตอนดีบั๊กผ่าน Serial: โปรเจกต์นี้เน้นใช้ Serial Monitor ความเร็ว 115200 Baud เป็นพิเศษ เพราะนี่คือทางเดียวที่จะ "เห็น" IP Address ที่ถูกกำหนดให้กับบอร์ด ซึ่งจำเป็นมากสำหรับการตั้งค่าแอป Android ถ้าข้ามขั้นตอนดีบั๊กนี้ไป ก็เหมือนทำงานแบบมืดบอดเลยล่ะน้อง
- การป้องกันทางกล: ถ้าจะติดตั้งเป็นระบบสมาร์ทโฮมถาวร รุ่นพี่แนะนำให้หาตู้/กล่องที่ไม่นำไฟฟ้ามาใส่ NodeMCU ด้วย เพราะบอร์ดนี้ใช้คลื่นวิทยุความถี่สูง (2.4GHz) อย่าเอาไปใส่กล่องโลหะเชียวนะ มันจะกลายเป็นกรงฟาราเดย์ไปซะงั้น บล็อกสัญญาณหมดจด
- ขยายไปใช้กับไฟแรงสูง: แม้ว่าโปรเจกต์นี้จะใช้ LED เพื่อความปลอดภัย แต่ตรรกะการควบคุมมันเหมือนกันเป๊ะกับการควบคุม ไฟบ้าน AC ผ่าน โมดูลรีเลย์ แค่เปลี่ยนจากตัวต้านทาน 330 โอห์มกับ LED เป็นรีเลย์ 5V แอปเดียวกันนี้ก็สามารถควบคุมพัดลม ปั๊มน้ำ หรือไฟห้องได้แล้ว เอาไปต่อยอดเป็นระบบออโตเมชันเต็มรูปแบบได้สบายๆ
ขั้นตอนที่ 4: โค้ด:
ให้อัปโหลดโค้ดนี้เพื่อเช็ค IP Address (Internet Protocol) แล้วเปิด Serial Monitor ดู
/* Node MCU ESP8266 IOT wifi dev. Board wifi connectivity test code by Ashraf Minhaj.
Tutorial on blog www.youtube.com/c/fusebatti
for any quory mail at ashraf_minhaj@yahoo.com
Consider subscribing my youTube channel www.youtube.com/c/fusebatti */
#include //declare ESP8266 library
const char* ssid="Your wifi name"; //Put your wifi network name here
const char* password = "Password"; //Put your wifi password here
void setup() { Serial.begin(115200); //initial Serial communication for serial monitor Note:115200 depends on your board
Serial.println();
Serial.print("Wifi connecting to ");
Serial.println( ssid ); WiFi.begin(ssid,password); Serial.println(); Serial.print("Connecting"); while( WiFi.status() != WL_CONNECTED ) //while loop runs repeatedly unless condition is false { //it'll keep trying unless wifi is connected delay(500); Serial.print("."); } Serial.println(); Serial.println("Wifi Connected Success!");
Serial.print("NodeMCU IP Address : "); //Shows the IP (Internet Protocol) number of your NodeMcu
Serial.println(WiFi.localIP() ); //Gets the IP address of your Board }void loop() //In our case we don't need this but still it needs to be there.
{ // put your main code here, to run repeatedly:}
ทีนี้ ถึงโค้ดหลัก สำหรับควบคุมไฟในโปรเจกต์เรา ให้อัปโหลดโค้ดนี้แทน....
โค้ดนี้ก็มีอยู่ในตัวอย่างของ Arduino ด้วยนะ รุ่นพี่แถมสร้างแอปให้มันทำงานร่วมกันได้อีกตะหาก
#include
const char* ssid = "Wifi name";const char* password = PassWordl";
// Create an instance of the server// specify the port to listen on as an argumentWiFiServer server(80);
void setup() { Serial.begin(115200); delay(10);
// prepare GPIO2 pinMode(2, OUTPUT); digitalWrite(2, 0);
// Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);
WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected");
// Start the server server.begin(); Serial.println("Server started");
// Print the IP address Serial.println(WiFi.localIP());}
void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; }
// Wait until the client sends some data Serial.println("new client"); while (!client.available()) { delay(1); }
// Read the first line of the request String req = client.readStringUntil('\\r'); Serial.println(req); client.flush();
// Match the request int val; if (req.indexOf("/gpio/0") != -1) { val = 0; } else if (req.indexOf("/gpio/1") != -1) { val = 1; } else { Serial.println("invalid request"); client.stop(); return; }
// Set GPIO2 according to the request digitalWrite(2, val);
client.flush();
// Prepare the response String s = "HTTP/1.1 200 OK\\r\
Content-Type: text/html\\r\
\\r\
\\r\
\\r\
GPIO is now "; s += (val) ? "high" : "low"; s += "
\
";
// Send the response to the client client.print(s); delay(1); Serial.println("Client disonnected");
// The client will actually be disconnected // when the function returns and 'client' object is detroyed}
อัพโหลดโค้ดไปเลยจ้า
ขั้นตอนที่ 5: ควบคุมผ่านแอป
หลังจากอัพโหลดโค้ดเสร็จแล้ว ให้ดาวน์โหลดแอปมา แล้วอย่าลืมเชื่อมต่อมือถือกับอินเทอร์เน็ตหรือ WiFi ด้วยนะ
ทีนี้ก็แค่กรอก IP Address ของ NodeMCU ของเราเข้าไป แล้วก็กดปุ่ม ON ไฟก็จะติด ส่วนจะปิดก็กด OFF โลด
ยินดีด้วย! น้องเพิ่งสร้างโปรเจค IoT ชิ้นแรกของตัวเองสำเร็จแล้ว