ระบบติดตามตำแหน่งของรถ (Car Tracking System Using Esp32)

ผู้เขียนบทความ : นางสาวฟาอีส พุ่มเกื้อ COE #15

คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์

วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง

1.ความเป็นมา

      ในปัจจุบันที่เทคโนโลยีก้าวหน้าและการติดต่อสื่อสารกันทั่วไปกลายเป็นสิ่งปกติในชีวิตประจำวัน นวัตกรรมใหม่ๆก็เกิดขึ้นและเจริญก้าวหน้ากันมากยิ่งขึ้น   แต่การประยุกต์ใช้เทคโนโลยีในด้านการขนส่งและการติดตามตำแหน่งของยานพาหนะกลับมาเป็นเรื่องหนึ่งที่ได้รับความสนใจอย่างมาก

การนำเทคโนโลยีมาประยุกต์ใช้ในชีวิตประจำวันไม่เพียงแต่เพิ่มประสิทธิภาพในการใช้ชีวิตแต่ยังเป็นแรงผลักดันสำคัญในการสร้างนวัตกรรมใหม่ ๆ ที่สามารถเปลี่ยนแปลงวิถีชีวิตของเราได้อย่างมีนัยสำคัญ  โปรเจคได้ถูกนำเสนอนี้ไม่เพียงเพิ่มขีดจำกัดของการติดตามตำแหน่งของยานพาหนะในเวลาจริง แต่ยังเป็นแนวทางที่มีความยืดหยุ่นสูงในการพัฒนาต่อยอด โดยการที่ระบบนี้สามารถแสดงค่าตำแหน่งและบันทึกข้อมูลลงใน SD CARD อย่างมีประสิทธิภาพ, มันเปิดโอกาสให้เรานำข้อมูลที่ได้มาใช้ในหลายทางการทำงาน นอกจากการติดตามตำแหน่งรถ, ข้อมูลที่ได้นี้สามารถนำมาวิเคราะห์เพื่อพัฒนากลยุทธ์การเดินทาง, ปรับปรุงเส้นทางการขนส่ง, และพัฒนาระบบโลจิสติกส์ในองค์กร เป็นต้น

2.วัตถุประสงค์

2.1 เพื่อเพิ่มประสิทธิภาพในการบริการจัดการรถบัส

2.2 เพื่อเพิ่มประสิทธิภาพการให้บริการสำหรับผู้ประกอบการ

2.3 เพื่อให้ผู้ประกอบการสามารถปรับปรุงและวิเคราะห์การให้บริการจาการแจ้งเตือนในระบบได้

3.ขอบเขตการทำงาน

3.1 GPS จะส่งสัญญานเป็นตำแหน่งลองติจูด ละติดจูด

3.2 การแจ้งเตือนผ่านLine ระบบสามารถส่งข้อความของตำแหน่งไปยังแชทของผู้ใช้ใน Line

3.3 หน้าจอ LCD แสดงค่าลองติจูด ละติจูดของตำแหน่งปัจจุบัน

3.4 SD Card บันทึกข้อมูลการเดินทางทั้งหมดที่ผ่านมา

4.ประโยช์นที่คิดว่าจะได้รับ

4.1 ได้ศึกษาและเข้าใจในการเขียนโค๊ด Python เพื่อส่งตำแหน่ง GPS

4.2 สามารถพัฒนาจากโครงงานนี้ได้ในอนาคตมากยิ่งขึ้น

4.3 สามารถติดตามตำแหน่งรถได้แบบเรียลทาร์ม

5.ความรู้ที่เกี่ยวข้อง

5.1 TINYGPS++.H
            เป็นไลบรารี่สำหรับให ESP32 โดย GPS ย่อมาจาก Global Positioning System  ใช้เพื่อค้นหาตำแหน่งต่างๆบนโลก อ่านค่าเป็น ละติจูด ลองจิจูด การใช้งานโดยการเชื่อมต่อโมดูล GPS กับ ESP32 และให้แสดง ละติจูด ลองจิจูด ที่อัปเดตในหน้า ของ Line และนำข้อมูลไปใช้งานที่  Google Maps เพื่อให้แสดงรายละเอียดของตำแหน่ง ของบอร์ด ESP32

void displayInfo() {
  lcd.setCursor(5, 0);
  lcd.print("        ");
  lcd.setCursor(5, 0);
  if (gps.location.isValid()) {
    lcd.print(gps.location.lat(), 6);
    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);
  } else {
    lcd.print("INVALID");
    Serial.println("Latitude: INVALID");
  }

  lcd.setCursor(5, 1);
  lcd.print("        ");
  lcd.setCursor(5, 1);
  if (gps.location.isValid()) {
    lcd.print(gps.location.lng(), 6);
    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);
  } else {
    lcd.print("INVALID");
    Serial.println("Longitude: INVALID");
  }
}

5.2 SD.H           

เป็นไลบรารี่สำหรับให ESP32 โดยบันทึกข้อมูลการใช้งานต่าง ๆ เช่น Log File ค่าที่อ่านได้จากเซนเซอร์ ต่าง ๆ การใช้ความสามารถของ การบันทึกข้อมูลลงบน SD Card เป็นอีกทางเลือกที่เหมาะสม เพราะสามารถเก็บข้อมูลได้บริมาณมาก ต่อใช้งานง่าย

void writeGPSDataToFile() {
  if (gps.location.isValid()) {
    // Open the file for writing (append mode)
    dataFile = SD.open("/gpsdata.txt", FILE_APPEND);

    if (dataFile) {
      String latitude = String(gps.location.lat(), 6);
      String longitude = String(gps.location.lng(), 6);
      String gpsData = "Latitude: " + latitude + ", Longitude: " + longitude;

      // Write GPS data to the SD Card
      dataFile.println(gpsData);
      Serial.println("Data saved to SD Card: " + gpsData);

      // Close the file
      dataFile.close();
    } else {
      Serial.println("Failed to open file for writing");
    }
  } else {
    Serial.println("Invalid GPS Location");
  }
}

5.3 Line token

Line token เป็นรหัสผ่านหรือกุญแจที่ใช้ในการเข้าถึง API (Application Programming Interface) โดยการสุ่มรหัสtoken มาให้ เพื่อให้เชื่อมต่อเข้ากับ Line ของเรา ที่ต้องการให้แจ้งเตือนข้อมูล จะสร้างแชทเพิ่มที่มีชื่อว่า Line notify  

void sendLocationToLine() {
  if (gps.location.isValid()) {
    String latitude = String(gps.location.lat(), 6);
    String longitude = String(gps.location.lng(), 6);
    String googleMapLink = "https://www.google.com/maps/place/" + latitude + "," + longitude;
    LINE.notify(googleMapLink);
  } else {
    LINE.notify("Invalid GPS Location");
  }
}

5.4 LiquidCrystal_I2C.h

ไลบรารี LiquidCrystal_I2C.h เป็นไลบรารีที่ช่วยในการควบคุมการแสดงผล LCD ที่เชื่อมต่อผ่านทางสาย I2C (Inter-Integrated Circuit) ซึ่งเป็นโปรโตคอลสื่อสารข้อมูลระหว่างอุปกรณ์ในระยะใกล้ ไลบรารี LiquidCrystal_I2C.h ช่วยให้การใช้งาน LCD กับ Arduino ง่ายขึ้นโดยไม่ต้องใช้จำนวนขาของ Arduino มากมาย เนื่องจากการสื่อสารผ่านทาง I2C ใช้เส้นทางเดียวกันทั้งสองทิศทาง (SCL – Serial Clock Line และ SDA – Serial Data Line) ซึ่งลดจำนวนขาที่ใช้งานได้

lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Lat: ");
  lcd.setCursor(0, 1);
  lcd.print("Lng: ");

5.5 รวมการทำงานของโค๊ดทั้งหมด

#include <TinyGPS++.h>
#include <HardwareSerial.h>
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>

#define RXPin (16)
#define TXPin (17)

const char* ssid = "FewZZZ";
const char* password = "11111111";
const char* lineToken = "HwFrwc5LXLn8tLAikoclvFVjyRhrUI4XeaddHx5eSAf";
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
HardwareSerial ss(2);

// LCD configuration
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 คือ I2C address ของจอ LCD

// SD Card Pin
#define SD_CS_PIN 5

// File object for writing to the SD Card
File dataFile;

void setup() {
  Serial.begin(115200); // เริ่มต้น Serial Monitor

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  LINE.setToken(lineToken);

  ss.begin(GPSBaud, SERIAL_8N1, RXPin, TXPin, false);
  Serial.println(TinyGPSPlus::libraryVersion());

  // LCD setup
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Lat: ");
  lcd.setCursor(0, 1);
  lcd.print("Lng: ");

  // Initialize SD card
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("Card Mount Failed");
  } else {
    Serial.println("SD Card initialized");
  }
}

void loop() {
  while (ss.available() > 0) {
    if (gps.encode(ss.read())) {
      displayInfo();
      }
  }
  sendLocationToLine();
      writeGPSDataToFile(); // บันทึกข้อมูล GPS เมื่อมีการอัพเดต
      delay(30000); //ส่งอีกครั้งเมื่อครบ5นาที
}

void displayInfo() {
  lcd.setCursor(5, 0);
  lcd.print("        ");
  lcd.setCursor(5, 0);
  if (gps.location.isValid()) {
    lcd.print(gps.location.lat(), 6);
    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);
  } else {
    lcd.print("INVALID");
    Serial.println("Latitude: INVALID");
  }

  lcd.setCursor(5, 1);
  lcd.print("        ");
  lcd.setCursor(5, 1);
  if (gps.location.isValid()) {
    lcd.print(gps.location.lng(), 6);
    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);
  } else {
    lcd.print("INVALID");
    Serial.println("Longitude: INVALID");
  }
}

void writeGPSDataToFile() {
  if (gps.location.isValid()) {
    // Open the file for writing (append mode)
    dataFile = SD.open("/gpsdata.txt", FILE_APPEND);

    if (dataFile) {
      String latitude = String(gps.location.lat(), 6);
      String longitude = String(gps.location.lng(), 6);
      String gpsData = "Latitude: " + latitude + ", Longitude: " + longitude;

      // Write GPS data to the SD Card
      dataFile.println(gpsData);
      Serial.println("Data saved to SD Card: " + gpsData);

      // Close the file
      dataFile.close();
    } else {
      Serial.println("Failed to open file for writing");
    }
  } else {
    Serial.println("Invalid GPS Location");
  }
}

void sendLocationToLine() {
  if (gps.location.isValid()) {
    String latitude = String(gps.location.lat(), 6);
    String longitude = String(gps.location.lng(), 6);
    String googleMapLink = "https://www.google.com/maps/place/" + latitude + "," + longitude;
    LINE.notify(googleMapLink);
  } else {
    LINE.notify("Invalid GPS Location");
  }
}

6.ผลการดำเนินงาน

โดยในโครงงานนี้ได้ออกแบบระบบการติดตามตำแหน่งของรถด้วย GPS Module และส่งค่าไปยัง NodeMCU ESP32 ที่เป็นตัวประมวลตามที่ได้โปรแกรมไว้ เมื่อตรงตามเงื่อนไข จะแสดงค่าลองติจูดและละติจูดของตำแหน่งรถไปยัง application LINE ส่งแบบ Google link GPS และบันทึกค่าที่ได้ผ่าน SD CARD Module ดังนั้น NodeMCU ESP32 จะเชื่อมต่อกับอินเทอร์เน็ตผ่านสัญญานไวไฟ (WiFi) ภายในรถ เพื่อรับคำสั่งการทำงานตามโปรแกรมได้

ผลการทดลอง

ส่วนนี้จะกล่าวถึงการทดลองการทำงานของระบบ 1.การประมวลผลและส่งข้อมูลตำแหน่งผ่าน Line

2.การทดสอบตัวSD Card เพื่อทำงานตามเงื่อนไขที่กำหนด ถูกแบ่งออกเป็น 2 ส่วนดังนี้

7.1 การประมวลผลและส่งข้อมูลตำแหน่งผ่าน Line           

ทดลองโดยการนั่งรถมอเตอร์ไซต์ไปริมทะเลเพื่อดูการแสดงการเปลี่ยนแปลงของตำแหน่ง GPS และแจ้งเตือน ผ่าน LINE ดังภาพ

ตารางผลการทดลอง

7.2 การบันทึกข้อมูลใน SD Card            

การบันทึกตำแหน่งเข้า SD Card data

8.สรุปการทดลอง

จากการทดลองระบบติดตามตำแหน่งรถผ่าน Line และบันทึกข้อมูลเข้า SD Card ทำงานได้อย่างมีประสิทธิภาพตามที่ตั้งเงื่อนไขไว้ ได้แก่

            1.การส่งตำแหน่ง ส่งได้ถูกต้องตามความดีเลย์และตำแหน่งถูกต้อง

           2.ตัวสวิชต์มีการเปิดปิดได้ดี            

3.การแจ้งเตือนไลน์ แจ้งเตือนตลอดตามเงื่อนไขที่วาง

9.เอกสารอ้างอิง

[1] Robotsiam (2562)โปรเจค ESP32 แสดงตำแหน่งจาก GPS Module ด้วย Google Maps สืบค้นจาก https://www.robotsiam.com/article/78/

[2] allnewstep (2557)สอน วิธีใช้งาน SD Card Module ใช้งานได้ภายใน 3 นาที สืบค้นจาก https://www.allnewstep.com/article/9/

วิดีโอการทำงานของระบบติดตามตำแหน่งรถ

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *