ทำไมต้องสั่งงานผ่าน 4G LTE?
ระบบสมาร์ทโฮม (Home Automation) ส่วนใหญ่มักจะพึ่งพาสัญญาณ WiFi ภายในบ้านใช่ไหมครับ? แต่ถ้าเราอยากเอาไปใช้ในพื้นที่ห่างไกลอย่างฟาร์มเกษตร บ่อบาดาล หรือโรงงานที่ไม่มีเน็ตบ้านล่ะ จะทำยังไง?
คำตอบคือการใช้ "ระบบ 4G LTE" ครับ! โปรเจกต์นี้จะสอนคุณสร้างระบบ IoT อัตโนมัติแบบไม่ง้อ WiFi โดยใช้บอร์ดไมโครคอนโทรลเลอร์ ESP32 เชื่อมต่อกับโมดูล 4G LTE ทำให้คุณสามารถสั่งเปิด-ปิดรีเลย์ (Relay) ผ่านระบบคลาวด์ได้แบบเรียลไทม์จากทุกที่บนโลกที่มีสัญญาณมือถือ!
💡 ทริคเพิ่มเติม: หากคุณกำลังมองหาบอร์ด ESP32, โมดูลซิม 4G LTE, โมดูล Relay หรือต้องการสั่งทำเคสด้วย 3D Printing เพื่อนำไปประกอบใช้งานจริง สามารถเข้าไปเลือกซื้อและใช้บริการได้ที่ https://openlink.co/globalbyte เลยครับ!
การเตรียมฐานข้อมูลและ Backend (Database & PHP)
ในการทำให้ระบบนี้ทำงานได้ เราต้องมีเซิร์ฟเวอร์สำหรับเก็บค่าสถานะของรีเลย์แต่ละตัวก่อนครับ เราจะเริ่มจากการสร้างตารางในฐานข้อมูล (Database) และเขียนไฟล์ PHP เพื่อเป็นตัวกลาง (API) ให้บอร์ด ESP32 เข้ามาอ่านและอัปเดตข้อมูล
View more (ดูโค้ด SQL และ PHP / Copy Code)
1. โค้ด SQL สำหรับสร้างตารางและใส่ค่าเริ่มต้น (Relay 4 ตัว):
CREATE TABLE relay_control ( id INT PRIMARY KEY AUTO_INCREMENT, r1 INT DEFAULT 0, r2 INT DEFAULT 0, r3 INT DEFAULT 0, r4 INT DEFAULT 0 ); /* Insert initial row: */ INSERT INTO relay_control (r1, r2, r3, r4) VALUES (0, 0, 0, 0);
2. ไฟล์ getRelayState.php (สำหรับให้ ESP32 อ่านสถานะ):
<?php $conn = new mysqli("localhost", "user", "pass", "database"); $result = $conn->query("SELECT * FROM relay_control WHERE id=1"); $row = $result->fetch_assoc(); echo "R1=".$row['r1'].",R2=".$row['r2'].",R3=".$row['r3'].",R4=".$row['r4']; ?>
3. ไฟล์ updateRelay.php (สำหรับอัปเดตสถานะจากหน้าเว็บควบคุม):
<?php $conn = new mysqli("localhost", "user", "pass", "database"); $r1 = $_GET['r1']; $r2 = $_GET['r2']; $r3 = $_GET['r3']; $r4 = $_GET['r4']; $conn->query("UPDATE relay_control SET r1=$r1,r2=$r2,r3=$r3,r4=$r4 WHERE id=1"); echo "Updated"; ?>
การสื่อสารด้วย AT Command กับโมดูล LTE
ในการสั่งให้โมดูล 4G เชื่อมต่ออินเทอร์เน็ต เราต้องคุยกับมันด้วยภาษาเครื่องที่เรียกว่า "AT Command" ครับ ลองมาดูขั้นตอน (Flow) พื้นฐานกัน:
-
Step 1: Check Communication ส่งคำสั่ง
AT (คาดหวังผลลัพธ์คือ OK)
-
Step 2: Check SIM ส่งคำสั่ง
AT+CPIN? (คาดหวังผลลัพธ์คือ READY)
-
Step 3: Network Registration ส่งคำสั่ง
AT+CREG? (คาดหวังผลลัพธ์คือ 0,1 แปลว่าลงทะเบียนเข้าเครือข่ายสำเร็จ)
-
Step 4: Set APN ส่งคำสั่ง
AT+CGDCONT=1,"IP","airtelgprs.com" (เปลี่ยนชื่อ APN ตามเครือข่ายมือถือของคุณ)
-
Step 5: Activate PDP ส่งคำสั่ง
AT+CGATT=1 ตามด้วย AT+CGACT=1,1 หลังจากนี้โมดูลจะได้ IP Address และพร้อมใช้อินเทอร์เน็ตครับ
ลอจิกการทำงานของ ESP32 (Firmware Logic)
ตัวบอร์ด ESP32 จะทำหน้าที่เป็นเหมือนผู้จัดการวงครับ วงจรการทำงานหลัก (Main Loop) จะเป็นดังนี้:
- เริ่มต้นเปิดระบบ LTE (Initialize LTE)
- เชื่อมต่อเข้ากับเครือข่ายโทรศัพท์
- ส่งคำขอแบบ HTTP GET ไปยังเซิร์ฟเวอร์ที่เราเตรียมไว้
- อ่านและแกะข้อมูล (Parse) ที่ตอบกลับมา
- สั่งเปิด-ปิด รีเลย์ตามค่าที่ได้
- หน่วงเวลา 3-5 วินาที แล้ววนซ้ำไปข้อ 3 ใหม่เรื่อยๆ
View more (ดูโครงสร้างโค้ดพื้นฐาน ESP32 และการดึงข้อมูล HTTP)
โครงสร้างโค้ดแบบพื้นฐานสำหรับการสั่งงาน AT Command บน ESP32 (ผ่าน Serial2 พิน 16, 17):
#include <HardwareSerial.h> HardwareSerial sim(2); void setup() { Serial.begin(115200); sim.begin(115200, SERIAL_8N1, 16, 17); } void loop() { sim.println("AT"); delay(1000); while(sim.available()){ Serial.write(sim.read()); } delay(5000); }
ตัวอย่างคำสั่ง HTTP Request (ฝั่งโมดูล SIM7600):
AT+HTTPINIT AT+HTTPPARA="URL","http://yourdomain.com/getRelayState.php" AT+HTTPACTION=0 AT+HTTPREAD
ตัวอย่างการอัปเดต Relay: สมมติว่าเซิร์ฟเวอร์ตอบกลับมาเป็นข้อความ R1=1,R2=0,R3=1,R4=0 บอร์ด ESP32 จะเช็คข้อความแล้วสั่งงาน GPIO แบบนี้ครับ:
digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(18, HIGH); digitalWrite(19, LOW);
โค้ดฉบับเต็มพร้อมใช้งาน (Full Source Code)
เพื่อไม่ให้เสียเวลา คุณสามารถนำโค้ดด้านล่างนี้ไปปรับใช้กับบอร์ด ESP32 ใน Arduino IDE ของคุณได้เลยครับ เพียงแค่แก้ชื่อ yourdomain.com ให้เป็นเซิร์ฟเวอร์ของคุณ และเช็คพินให้ตรงกับที่ต่อวงจรไว้ครับ
View more (ดูโค้ด ESP32 ฉบับเต็ม / Copy Code)
#include <HardwareSerial.h> HardwareSerial sim(2); // Relay Pins #define R1 4 #define R2 5 #define R3 18 #define R4 19 String serverURL = "http://yourdomain.com/getRelayState.php"; String apn = "airtelgprs.com"; void sendAT(String cmd, int waitTime = 2000) { sim.println(cmd); delay(waitTime); while (sim.available()) { Serial.write(sim.read()); } } void setup() { Serial.begin(115200); sim.begin(115200, SERIAL_8N1, 16, 17); pinMode(R1, OUTPUT); pinMode(R2, OUTPUT); pinMode(R3, OUTPUT); pinMode(R4, OUTPUT); digitalWrite(R1, LOW); digitalWrite(R2, LOW); digitalWrite(R3, LOW); digitalWrite(R4, LOW); Serial.println("Initializing LTE Module..."); sendAT("AT"); sendAT("ATE0"); // Echo off sendAT("AT+CPIN?"); sendAT("AT+CREG?"); sendAT("AT+CGATT=1"); // Set APN sendAT("AT+CGDCONT=1,\"IP\",\"" + apn + "\""); sendAT("AT+CGACT=1,1"); Serial.println("LTE Initialization Complete"); } void fetchRelayState() { Serial.println("Fetching Relay State..."); sendAT("AT+HTTPTERM",1000); sendAT("AT+HTTPINIT"); sendAT("AT+HTTPPARA=\"CID\",1"); sendAT("AT+HTTPPARA=\"URL\",\"" + serverURL + "\""); sendAT("AT+HTTPACTION=0",5000); sendAT("AT+HTTPREAD",3000); String response = ""; while (sim.available()) { response += (char)sim.read(); } Serial.println("Response:"); Serial.println(response); // Parse Response Example: R1=1,R2=0,R3=1,R4=0 if (response.indexOf("R1=1") != -1) digitalWrite(R1, HIGH); else digitalWrite(R1, LOW); if (response.indexOf("R2=1") != -1) digitalWrite(R2, HIGH); else digitalWrite(R2, LOW); if (response.indexOf("R3=1") != -1) digitalWrite(R3, HIGH); else digitalWrite(R3, LOW); if (response.indexOf("R4=1") != -1) digitalWrite(R4, HIGH); else digitalWrite(R4, LOW); sendAT("AT+HTTPTERM"); } void loop() { fetchRelayState(); delay(5000); // 5 sec polling interval }
ทริคความเสถียร, การประยุกต์ใช้งาน และไอเดียต่อยอด
การเพิ่มความเสถียรให้ระบบ (Stability Features):
เพื่อไม่ให้ระบบค้างเมื่อเจอปัญหาหน้างานจริง แนะนำให้เขียนลอจิกดักจับข้อผิดพลาดไว้ด้วยครับ เช่น ถ้ายิง HTTP ไม่ผ่านให้ลองใหม่, ถ้าสัญญาณเน็ตหลุดให้เชื่อมต่อ PDP ใหม่, ถ้าหาซิมไม่เจอให้หยุดการทำงานของรีเลย์เพื่อความปลอดภัย, และเมื่อเครื่องเปิดใหม่ รีเลย์ทุกตัวควรอยู่ในสถานะปิด (OFF) เสมอ
นำไปใช้งานจริงที่ไหนได้บ้าง? (Real World Applications):
ระบบนี้เหมาะมากสำหรับนำไปสั่งเปิด-ปิดมอเตอร์สูบน้ำบาดาล, ระบบตั้งเวลาไฟถนน, ควบคุมอินเวอร์เตอร์โซลาร์เซลล์ระยะไกล, ควบคุมเครื่องจักรในโรงงาน หรือแม้แต่ระบบรดน้ำอัจฉริยะในฟาร์มเกษตรครับ
ไอเดียพัฒนาต่อในอนาคต (Possible Improvements):
ถ้าใครอยากให้ระบบเก่งขึ้น ลองพัฒนาให้ส่งข้อมูลผ่าน HTTPS (เพื่อความปลอดภัย), เปลี่ยนจาก HTTP ไปใช้ MQTT แทน (เพื่อประหยัดดาต้าและเร็วขึ้น), ทำระบบอัปเดตเฟิร์มแวร์ไร้สาย (OTA), หรือเชื่อมต่อกับระบบเช็คการใช้พลังงานดูครับ!
ผู้พัฒนาโปรเจกต์: Mr. Abhishek Maurya ผู้ก่อตั้ง Yarana IoT Guru (เยี่ยมชมเว็บไซต์ได้ที่ yaranaiotguru.in)
สรุปทิ้งท้าย: โปรเจกต์นี้เป็นการนำเสนอระบบ Automation แบบครบวงจร (End-to-End) ตั้งแต่การต่อฮาร์ดแวร์ การเขียน API บนเซิร์ฟเวอร์ ไปจนถึงการจัดการคำสั่ง AT Command ทั้งหมดนี้ทำงานผ่านเครือข่ายมือถือ ทำให้มันกลายเป็นโซลูชันที่เพอร์เฟกต์มากสำหรับงานอุตสาหกรรมหรืองานในพื้นที่ห่างไกลครับ!
พร้อมสร้างระบบ IoT ระดับอุตสาหกรรมของคุณเองหรือยัง?
ถ้าคุณอยากหลุดจากกรอบของ WiFi และต้องการทำระบบควบคุมผ่าน 4G LTE แวะมาหาอุปกรณ์และพูดคุยกับเราได้เลยครับ!
คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา โปรดอ้างอิงข้อมูลโค้ดอย่างละเอียดจากต้นฉบับ