สร้างระบบติดตามรถยนต์แบบเรียลไทม์ (GPS Tracker) ทะลุขีดจำกัด WiFi ด้วย ESP32 และ 4G LTE!

ESP32 4G LTE GPS Tracker

จากข้อจำกัดของ 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):

  1. โมดูล GPS อ่านข้อมูลพิกัดจากดาวเทียม
  2. บอร์ด ESP32 รับข้อมูลมาถอดรหัส (Parse NMEA data)
  3. โมดูล SIM7600 เชื่อมต่ออินเทอร์เน็ตผ่านซิม 4G
  4. ESP32 ส่งข้อมูล (Publish) ขึ้นไปยังเซิร์ฟเวอร์ MQTT Broker
  5. หน้า Web Dashboard ดึงข้อมูล (Subscribe) จาก Topic ที่ตั้งไว้
  6. แสดงตำแหน่งรถยนต์เคลื่อนที่บนแผนที่แบบเรียลไทม์!

เทคโนโลยีหลักที่อยู่เบื้องหลัง: เราใช้บอร์ด 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 ข้อ:

  1. ต่อสายไฟโมดูลฮาร์ดแวร์ทั้งหมดเข้าด้วยกัน
  2. ใส่ซิมการ์ด 4G ที่มีอินเทอร์เน็ตเข้าไปในโมดูล
  3. อัปโหลดเฟิร์มแวร์ลงบอร์ด ESP32
  4. เปิด Serial Monitor เพื่อเช็คการเชื่อมต่อ MQTT
  5. อัปโหลดไฟล์ 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 ไปประกอบร่างอยู่ใช่ไหม? แวะมาพูดคุยและหาอุปกรณ์กับเราได้เลย!

คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา โปรดอ้างอิงการต่อวงจรและการตั้งค่าเครือข่ายอย่างละเอียดจากต้นฉบับ
อ้างอิงจาก (References):

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี