จากข้อจำกัดของ WiFi สู่โลกแห่งการติดตามจริง
ในยุคที่ระบบขนส่งและโลจิสติกส์เติบโตแบบก้าวกระโดด "การติดตามยานพาหนะแบบเรียลไทม์" กลายเป็นสิ่งจำเป็นมากๆ ครับ ไม่ว่าจะเป็นการจัดการรถบรรทุกส่งของ, การติดตามรถโรงเรียน หรือแม้แต่ระบบกันขโมย
ปัญหาคือ โปรเจกต์ IoT สำหรับมือใหม่ส่วนใหญ่มักจะพึ่งพาสัญญาณ WiFi ซึ่งในโลกความเป็นจริง รถยนต์ไม่ได้วิ่งอยู่ในรัศมีของเราเตอร์ตลอดเวลา! เพื่อทลายข้อจำกัดนี้ โปรเจกต์นี้จึงถูกสร้างขึ้นมาเพื่อเป็น ระบบติดตาม GPS แบบใส่ซิมการ์ด (SIM-based) โดยใช้บอร์ด ESP32 คู่กับโมดูล SIM7600 4G LTE ส่งข้อมูลผ่านโปรโตคอล MQTT ไปแสดงผลบน Web Dashboard สดๆ แบบไม่ต้องง้อ WiFi เลยครับ!
-
ทำไมถึงต้องสร้างโปรเจกต์นี้?
- เพื่อสร้างระบบติดตามที่เป็นอิสระจาก WiFi อย่างแท้จริง
- เพื่อสาธิตสถาปัตยกรรม IoT ระดับอุตสาหกรรม (Cellular IoT) ที่ใช้งานได้จริงบนถนน
- เพื่อเรียนรู้การใช้โปรโตคอล MQTT (Publish/Subscribe) ที่ประหยัดแบนด์วิดท์สุดๆ
- เพื่อสร้างระบบที่รองรับการขยายตัว (Scalable) สำหรับการติดตามรถหลายคันพร้อมกัน
สถาปัตยกรรมของระบบและการไหลของข้อมูล
การทำงานของระบบนี้ถูกออกแบบมาเป็นทอดๆ อย่างเป็นระเบียบครับ (GPS Module → ESP32 → SIM7600 4G LTE → MQTT Broker → Web Dashboard)
การไหลของข้อมูล (Data Flow):
- โมดูล GPS อ่านข้อมูลพิกัดจากดาวเทียม
- บอร์ด ESP32 รับข้อมูลมาถอดรหัส (Parse NMEA data)
- โมดูล SIM7600 เชื่อมต่ออินเทอร์เน็ตผ่านซิม 4G
- ESP32 ส่งข้อมูล (Publish) ขึ้นไปยังเซิร์ฟเวอร์ MQTT Broker
- หน้า Web Dashboard ดึงข้อมูล (Subscribe) จาก Topic ที่ตั้งไว้
- แสดงตำแหน่งรถยนต์เคลื่อนที่บนแผนที่แบบเรียลไทม์!
เทคโนโลยีหลักที่อยู่เบื้องหลัง: เราใช้บอร์ด ESP32, SIM7600, NEO-6M, โปรโตคอล MQTT, และใช้ไลบรารีอย่าง TinyGSM, PubSubClient, TinyGPSPlus สำหรับฝั่งบอร์ด ส่วนหน้าเว็บใช้ Leaflet.js คู่กับแผนที่ OpenStreetMap ครับ
อุปกรณ์ฮาร์ดแวร์ที่ต้องใช้ (Hardware Components)
เตรียมของให้พร้อม แล้วมาลุยกันเลย:
- บอร์ดพัฒนา ESP32 Development Board
- โมดูลเครือข่าย SIM7600 4G LTE Module
- โมดูลจีพีเอส NEO-6M GPS Module
- หน้าจอแสดงผล SH1106 128x64 OLED Display
- ซิมการ์ด 4G (ที่มีเน็ต), เสาอากาศ LTE, เสาอากาศ GPS
-
แหล่งจ่ายไฟ 5V 2A ที่เสถียร (⚠️ สำคัญมาก: โมดูล SIM7600 กินกระแสไฟสูงตอนจับคลื่น ต้องใช้แหล่งจ่ายไฟแยก 5V 2A เท่านั้น ห้ามดึงไฟจาก ESP32 โดยตรงครับ)
💡 ทริคแนะนำ: หากคุณกำลังมองหาบอร์ด ESP32, โมดูล 4G LTE, โมดูล GPS หรืออยากสั่งปรินต์เคส 3D เท่ๆ ไว้ใส่ในรถ สามารถเข้าไปสั่งซื้อและใช้บริการได้ที่ https://openlink.co/globalbyte เลยครับ มีครบจบในที่เดียว!
การต่อสายไฟและการตั้งค่าเครือข่าย
การเชื่อมต่อฮาร์ดแวร์ (Hardware Connections):
-
LTE Module → ESP32: TX ต่อเข้า GPIO 16 / RX ต่อเข้า GPIO 17
-
GPS Module → ESP32: TX ต่อเข้า GPIO 27 / RX ต่อเข้า GPIO 14 (แนะนำให้เอาเสา GPS ไปวางไว้ในที่โล่งเพื่อรับสัญญาณดาวเทียมให้ชัดที่สุด)
-
OLED Display → ESP32: SDA ต่อเข้า GPIO 33 / SCL ต่อเข้า GPIO 32
การตั้งค่าเครือข่าย (Network Configuration): ในโค้ดโปรแกรม เราจะตั้งค่า APN ตามเครือข่ายมือถือที่ใช้ (ในโค้ดตัวอย่างใช้ airtelgprs.com) / MQTT Broker ใช้ของฟรีอย่าง broker.emqx.io พอร์ต 1883 / ส่วนหัวข้อส่งข้อมูล (Topic) จะตั้งเป็น device/SL001/gps ซึ่งโครงสร้างนี้รองรับการเปลี่ยนชื่อ Device_ID เพื่อให้ติดตามรถได้หลายคันพร้อมกันครับ
หลักการทำงานของโค้ดและหน้าแดชบอร์ด
เฟิร์มแวร์ทำงานยังไง? ตัวโปรแกรมจะเริ่มจากการเปิดโมดูล LTE -> เชื่อมต่อเน็ตมือถือ -> เชื่อมต่อ MQTT -> อ่านค่า GPS ตลอดเวลา -> นำข้อมูลมาแพ็กเป็นก้อน JSON -> ส่งขึ้นคลาวด์ทุกๆ 5 วินาที -> อัปเดตหน้าจอ OLED -> และมีระบบ Auto Reconnect หากเน็ตหลุดครับ
หน้าตาข้อมูล JSON ที่ส่งออกไป: {"lat":26.8565, "lng":80.9462, "speed":32.5, "sat":9, "altitude":125.0, "direction":180.0}
หน้า Web Dashboard สดๆ: หน้าเว็บจะต่อกับ MQTT ผ่าน WebSocket พอดึงข้อมูลพิกัดมาได้ มันจะแสดงหมุดวิ่งไปมาบนแผนที่ ลากเส้นทางให้ดูสดๆ บอกความเร็วและทิศทาง แถมยังรองรับการเปิดบนมือถือ (Mobile responsive) ได้แบบสวยงามครับ
View more (ดู Source Code สำหรับบอร์ด ESP32 และกด Copy Code)
คุณสามารถใช้โปรแกรม Arduino IDE ในการอัปโหลดโค้ดด้านล่างนี้ลงบอร์ด ESP32 ได้เลยครับ:
#define TINY_GSM_MODEM_SIM7600 #define TINY_GSM_RX_BUFFER 1024 #include <TinyGsmClient.h> #include <PubSubClient.h> #include <TinyGPSPlus.h> #include <Wire.h> #include <U8g2lib.h> // ================= PIN DEFINITIONS ================= #define MODEM_RX 16 #define MODEM_TX 17 #define GPS_RX 27 #define GPS_TX 14 #define OLED_SDA 33 #define OLED_SCL 32 // ================= NETWORK CONFIG ================= const char apn[] = "airtelgprs.com"; const char user[] = ""; const char pass[] = ""; const char* broker = "broker.emqx.io"; const int port = 1883; const char* gpsTopic = "device/SL001/gps"; // ================= OBJECTS ================= HardwareSerial SerialAT(2); HardwareSerial gpsSerial(1); TinyGsm modem(SerialAT); TinyGsmClient gsmClient(modem); PubSubClient mqtt(gsmClient); TinyGPSPlus gps; U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); unsigned long lastPublish = 0; // ================= DIRECTION FUNCTION ================= String getDirection(float deg) { const char* directions[] = {"N","NE","E","SE","S","SW","W","NW"}; int index = round(deg / 45.0) % 8; return directions[index]; } // ================= GPRS CONNECT ================= bool connectGPRS() { Serial.println("Checking Network..."); if (!modem.waitForNetwork()) { Serial.println("Network Failed"); return false; } Serial.println("Connecting GPRS..."); if (!modem.gprsConnect(apn, user, pass)) { Serial.println("GPRS Failed"); return false; } Serial.println("GPRS Connected"); return true; } // ================= MQTT CONNECT ================= bool connectMQTT() { String clientID = "ESP32_" + String(random(10000)); if (mqtt.connect(clientID.c_str())) { Serial.println("MQTT Connected"); return true; } Serial.println("MQTT Failed"); return false; } // ================= OLED UPDATE ================= void updateOLED(float lat, float lng, float speed, float alt, float course, int sat) { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_6x12_tr); char buffer[32]; u8g2.drawStr(0,10,"SL001 GPS TRACKER"); sprintf(buffer,"Lat: %.5f", lat); u8g2.drawStr(0,22,buffer); sprintf(buffer,"Lng: %.5f", lng); u8g2.drawStr(0,32,buffer); sprintf(buffer,"Spd: %.1f kmh", speed); u8g2.drawStr(0,42,buffer); sprintf(buffer,"Alt: %.0f m", alt); u8g2.drawStr(0,52,buffer); String dir = getDirection(course); u8g2.drawStr(90,22,dir.c_str()); sprintf(buffer,"Sat:%d", sat); u8g2.drawStr(90,32,buffer); u8g2.sendBuffer(); } // ================= SETUP ================= void setup() { Serial.begin(115200); SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); gpsSerial.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX); Wire.begin(OLED_SDA, OLED_SCL); u8g2.begin(); u8g2.clearBuffer(); u8g2.drawStr(20,30,"Starting..."); u8g2.sendBuffer(); modem.restart(); connectGPRS(); mqtt.setServer(broker, port); connectMQTT(); Serial.println("SYSTEM READY"); } // ================= LOOP ================= void loop() { while (gpsSerial.available()) { gps.encode(gpsSerial.read()); } if (!mqtt.connected()) { connectGPRS(); connectMQTT(); } mqtt.loop(); if (gps.location.isValid()) { float lat = gps.location.lat(); float lng = gps.location.lng(); float speed = gps.speed.kmph(); float altitude = gps.altitude.meters(); float course = gps.course.deg(); int sat = gps.satellites.value(); updateOLED(lat, lng, speed, altitude, course, sat); if (millis() - lastPublish > 5000) { String payload = "{"; payload += "\"lat\":" + String(lat,6) + ","; payload += "\"lng\":" + String(lng,6) + ","; payload += "\"speed\":" + String(speed,1) + ","; payload += "\"sat\":" + String(sat) + ","; payload += "\"altitude\":" + String(altitude,1) + ","; payload += "\"direction\":" + String(course,1); payload += "}"; mqtt.publish(gpsTopic, payload.c_str()); Serial.println("Published:"); Serial.println(payload); lastPublish = millis(); } } }
ขั้นตอนการประกอบ และไอเดียต่อยอด
สรุปสเตปการสร้างง่ายๆ 5 ข้อ:
- ต่อสายไฟโมดูลฮาร์ดแวร์ทั้งหมดเข้าด้วยกัน
- ใส่ซิมการ์ด 4G ที่มีอินเทอร์เน็ตเข้าไปในโมดูล
- อัปโหลดเฟิร์มแวร์ลงบอร์ด ESP32
- เปิด Serial Monitor เพื่อเช็คการเชื่อมต่อ MQTT
- อัปโหลดไฟล์ Dashboard ขึ้น Hosting แล้วเปิด URL เพื่อดูรถวิ่งสดๆ ได้เลย!
โปรเจกต์นี้นำไปใช้งานจริงที่ไหนได้บ้าง?
สายโลจิสติกส์สามารถเอาไปใช้จัดการรถบรรทุกส่งของได้, โรงเรียนสามารถใช้ติดตามรถรับส่งนักเรียน, ทำเป็นระบบกันขโมยรถยนต์, ใช้ติดตามเครื่องจักรในโรงงาน หรือแม้กระทั่งควบคุมอุณหภูมิในรถขนส่งอาหารแช่แข็ง (Cold Chain Logistics) ก็ทำได้หมดครับ
ไอเดียสำหรับพัฒนาต่อยอดในอนาคต (Future Improvements):
- เพิ่มความปลอดภัยในการส่งข้อมูลด้วย Secure MQTT (SSL/TLS)
- เชื่อมต่อเข้ากับระบบคลาวด์ใหญ่อย่าง AWS IoT Core หรือบันทึกข้อมูลย้อนหลังลง Firebase
- ทำระบบสร้างรั้วเสมือน (Geofencing) เพื่อแจ้งเตือนเมื่อรถวิ่งออกนอกพื้นที่
- เพิ่มแผงควบคุม (Admin Panel) สำหรับดูรถหลายคันพร้อมกัน
- เด็ดสุด! เพิ่มรีเลย์เพื่อตรวจจับการสตาร์ทเครื่อง และสั่งตัดการทำงานเครื่องยนต์ได้จากระยะไกล
ผู้พัฒนาและบทสรุป
โปรเจกต์ที่ทั้งเจ๋งและใช้งานได้จริงนี้ พัฒนาโดย Mr. Abhishek Maurya ผู้ก่อตั้ง Yarana IoT Guru ครับ (สามารถเข้าไปติดตามผลงานได้ที่ Website หรือ GitHub Repository ได้เลยครับ) โค้ดและหน้าแดชบอร์ดฉบับเต็มก็อยู่ใน GitHub นี้นะครับ
สรุปส่งท้าย: โปรเจกต์นี้แสดงให้เห็นถึงสถาปัตยกรรมการติดตามรถยนต์แบบเรียลไทม์ (SIM-based) ด้วยการใช้ MQTT ร่วมกับ ESP32 ได้อย่างสมบูรณ์แบบ มันต่างจากโปรเจกต์ IoT เบื้องต้นที่พึ่งพาแต่ WiFi เพราะนี่คือระบบที่พร้อมขยายสเกลและนำไปใช้งานจริงในภาคอุตสาหกรรมครับ!
พร้อมสร้างระบบ IoT ระดับอุตสาหกรรมของคุณเองหรือยัง?
อยากทำโปรเจกต์ติดตามรถแบบนี้ใช้เอง หรือกำลังหาบอร์ด ESP32 และโมดูล 4G ไปประกอบร่างอยู่ใช่ไหม? แวะมาพูดคุยและหาอุปกรณ์กับเราได้เลย!
คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา โปรดอ้างอิงการต่อวงจรและการตั้งค่าเครือข่ายอย่างละเอียดจากต้นฉบับ