กลับไปหน้ารวมไฟล์
iot-light-control-over-internet-arduino-or-nodemcu-esp8266-4fd9df.md

วันนี้เราจะมาเรียนรู้วิธี ควบคุมอุปกรณ์อิเล็กทรอนิกส์ผ่านแอพ 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

ดาวน์โหลดแอพได้จากด้านล่างนี้เลย:

ANdroid.IOT.apk

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
  • การทำงานของแอพ 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 ชิ้นแรกของตัวเองสำเร็จแล้ว


ปลดปล่อยของเล่นชิ้นโปรดสู่โลกกว้าง: เชื่อมต่อโลกกายภาพเข้ากับฝ่ามือดิจิทัลได้อย่างราบรื่น

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
  - "Android IOT Utility (APK provided)"
author: "ashraf_minhaj"
category: "Home & Automation"
components:
  - "1x ESP8266 ESP-01"
  - "1x NodeMCU ESP8266 Breakout Board"
  - "1x Arduino UNO"
  - "1x Micro-USB to USB Cable (Generic)"
  - "1x UTSOURCE Electronic Parts"
description: "Today, we will learn how to control electronics using Android app over the Internet."
difficulty: "Easy"
documentationLinks: []
downloadableFiles:
  - "https://github.com/ashraf-minhaj/Node-MCU-ESP8266-Setup-WiFi-Connect."
  - "https://github.com/ashraf-minhaj/Node-MCU-ESP8266-Setup-WiFi-Connect."
encryptedPayload: "U2FsdGVkX1+3rLpMR79MGob5bqmTohl5MR3kYo1B5iW2H9M9wQE+X+TsYl0SOQZ1SCnQ5QWUEFu4QuQ7OUYwK4LCYmUOTUzqeXTWu3kk2MM="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/iot-light-control-over-internet-arduino-or-nodemcu-esp8266-4fd9df_cover.jpg"
lang: "en"
likes: 1
passwordHash: "bd8e0e35fc3f10dc63b070711fee6da5001a48e4604b3e077e3e9ac3084bd3b5"
price: 450
seoDescription: "Build IoT Light Control with Arduino or NodeMCU ESP8266. Control electronics using an Android app over the Internet."
tags:
  - "iot"
  - "esp8266"
  - "home-automation"
  - "smart-home"
  - "wireless-control"
title: "เปิด-ปิดไฟผ่านเน็ตแบบ IoT ง่ายๆ ด้วย Arduino / ESP8266 (งานง่ายแต่หล่อ!)"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/xdc7gm2A0XA"
  - "https://www.youtube.com/embed/xdc7gm2A0XA"
views: 23497