Membuat Project GPS Tracker untuk Kendaraan dengan ESP32 D1 R3, NEO-6M, dan SIM800

  1. Tekno
  2. 11 jam yang lalu
  3. 7 min read

membuat-gps-tracker-kendaraan-esp32-neo6m-sim800

Membuat GPS Tracker untuk Kendaraan dengan ESP32 D1 R3, NEO-6M, dan SIM800

Pada artikel ini, kita akan membahas cara membuat GPS tracker untuk kendaraan menggunakan ESP32 D1 R3, modul GPS NEO-6M, dan modul GSM SIM800. Alat ini memungkinkan Anda untuk melacak posisi kendaraan secara real-time menggunakan koneksi GSM untuk mengirim data GPS ke server Traccar.

Alat dan Bahan yang Dibutuhkan:

  1. ESP32 D1 R3 – Mikrokontroler berbasis ESP32 dengan Wi-Fi dan Bluetooth.
  2. Modul GPS NEO-6M – Untuk menerima sinyal GPS dan menentukan lokasi kendaraan.
  3. Modul GSM SIM800 – Digunakan untuk mengirimkan data GPS ke server melalui jaringan seluler.
  4. Kabel jumper dan breadboard – Untuk menghubungkan komponen.
  5. Antena GSM dan Antena GPS – Untuk memperkuat sinyal GSM dan GPS.
  6. Power supply (5V) – Untuk memberikan daya ke semua komponen.

Langkah-Langkah Membuat Project GPS Tracker

1. Skema Koneksi Hardware

Berikut adalah skema koneksi antara ESP32 D1 R3, modul GPS NEO-6M, dan modul GSM SIM800:

  • Koneksi ESP32 ke SIM800:

    • TX (GPIO17) ke RX SIM800
    • RX (GPIO16) ke TX SIM800
    • GND ke GND
    • 5V ke VCC pada SIM800
  • Koneksi ESP32 ke NEO-6M:

    • TX (GPIO27) ke RX NEO-6M
    • RX (GPIO26) ke TX NEO-6M
    • GND ke GND
    • 3.3V atau 5V ke VCC pada NEO-6M (pastikan sesuai spesifikasi NEO-6M)

Pastikan Anda menyambungkan antena GSM ke modul SIM800 dan antena GPS ke NEO-6M untuk memastikan sinyal yang baik.

2. Instalasi Software dan Library

Sebelum menulis kode, Anda perlu memastikan bahwa Anda sudah menginstal Arduino IDE atau PlatformIO dengan library berikut:

  • TinyGSM – Untuk komunikasi dengan SIM800.
  • TinyGPSPlus – Untuk menangani data dari modul GPS NEO-6M.
  • WiFiClientSecure (jika menggunakan Wi-Fi).

Tambahkan library ini melalui Library Manager di Arduino IDE atau tambahkan ke platformio.ini jika menggunakan PlatformIO.

3. Konfigurasi Traccar Server

Anda bisa menggunakan Traccar sebagai server untuk memantau data GPS yang dikirim dari perangkat. Berikut langkah-langkah untuk mengatur Traccar:

  • Langkah 1: Unduh dan instal Traccar dari situs resmi Traccar.
  • Langkah 2: Jalankan server Traccar di mesin lokal atau server cloud Anda.
  • Langkah 3: Akses antarmuka web Traccar di http://localhost:8082 (atau IP server Anda).
  • Langkah 4: Buat akun dan tambahkan perangkat dengan ID unik (misalnya: 313001).

Anda akan menggunakan IP server dan port Traccar (misalnya: 1.1.1.1:5055) dalam kode ESP32 Anda untuk mengirim data.

4. Kode untuk Mengirim Data GPS ke Traccar

Kode untuk menghubungkan ESP32 dengan NEO-6M dan SIM800 untuk mengirim data ke Traccar sudah Anda miliki. jika belum silahkan ambil dibawah ini:

  • Koneksi GPRS melalui SIM800.
  • Pengolahan data GPS dari NEO-6M.
  • Pengiriman data GPS ke server Traccar dengan format URL yang sesuai, misalnya:
#define TINY_GSM_MODEM_SIM800  // Gunakan modem SIM800L

#include <TinyGsmClient.h>
#include <TinyGPS++.h>
#include <HardwareSerial.h>  // Gunakan HardwareSerial untuk ESP32

#define SerialMon Serial         // Serial monitor untuk debugging
#define MODEM_RST 5              // RST pin untuk SIM800L
#define MODEM_TX 27              // TX pin untuk SIM800L
#define MODEM_RX 26              // RX pin untuk SIM800L
#define GPS_TX 17                // TX pin untuk GPS NEO-6M
#define GPS_RX 16                // RX pin untuk GPS NEO-6M

// Inisialisasi modem dan GPS menggunakan HardwareSerial
HardwareSerial SerialAT(1);  // UART1 untuk SIM800L
HardwareSerial SerialGPS(2); // UART2 untuk GPS

TinyGsm modem(SerialAT);
TinyGPSPlus gps;

// APN, username, dan password untuk GPRS
const char apn[]  = "3gprs";   // Ganti dengan APN operator Anda
const char user[] = "";           // Kosongkan jika tidak diperlukan
const char pass[] = "";           // Kosongkan jika tidak diperlukan

// Ganti dengan server Traccar dan device ID Anda
const char* traccar_host = "1.1.1.1";  // Ganti dengan server Traccar Anda
const int traccar_port = 5055;
const char* device_id = "123456";  // Identifier unik perangkat Anda

// Interval pengiriman GPS dalam milidetik (1 menit)
const unsigned long gpsSendInterval = 20000;  // 20 detik
unsigned long lastGPSSend = 0;

// Deklarasi fungsi sendGPSToServer
void sendGPSToServer(float latitude, float longitude, float speed);
void setGPSRate(HardwareSerial &gpsSerial);
void enableSBAS(HardwareSerial &gpsSerial);

void setup() {
  // Setup serial untuk debugging dan komunikasi dengan modem serta GPS
  SerialMon.begin(115200);
  delay(1000);
  SerialAT.begin(9600, SERIAL_8N1, MODEM_RX, MODEM_TX);  // Inisialisasi SIM800L
  SerialGPS.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX);     // Inisialisasi GPS

  // Reset modem SIM800L
  pinMode(MODEM_RST, OUTPUT);
  digitalWrite(MODEM_RST, LOW);
  delay(1000);
  digitalWrite(MODEM_RST, HIGH);
  delay(3000);

  SerialMon.println("Inisialisasi modem...");

  // Cek operator jaringan dan hubungkan ke GPRS
  SerialMon.println("Cek operator jaringan...");
  modem.sendAT("+COPS?");
  modem.waitResponse();

  // Mengatur rate pembacaan GPS menjadi 5 Hz dan mengaktifkan SBAS (DGPS)
  setGPSRate(SerialGPS);     // Perintah untuk meningkatkan rate GPS menjadi 5 Hz
  enableSBAS(SerialGPS);     // Perintah untuk mengaktifkan SBAS untuk akurasi lebih baik
  
  SerialMon.println("Konfigurasi GPS berhasil.");
  
  // Hubungkan ke GPRS
  connectGPRS();
}



void loop() {
  unsigned long currentMillis = millis();

  // Membaca data GPS dari modul NEO-6M
  while (SerialGPS.available() > 4) {
    gps.encode(SerialGPS.read());
  }

  // Cek apakah sudah saatnya mengirim data GPS
  if (currentMillis - lastGPSSend >= gpsSendInterval) {
    lastGPSSend = currentMillis;
    SerialMon.println("Sudah 20 detik, memeriksa GPS...");

    if (gps.location.isValid()) {
      float latitude = gps.location.lat();
      float longitude = gps.location.lng();
      float speed = gps.speed.kmph();  // Ambil kecepatan dalam km/h

      // Cek apakah posisi berubah lebih dari batas minimum (10 meter)
      float minDistance = 0.0001;  // Perubahan sekitar 10 meter
      static float lastLatitude = 0.0;
      static float lastLongitude = 0.0;

      if (abs(latitude - lastLatitude) < minDistance && abs(longitude - lastLongitude) < minDistance) {
        SerialMon.println("Posisi tidak berubah secara signifikan, mengabaikan data.");
      } else {
        // Simpan posisi terakhir
        lastLatitude = latitude;
        lastLongitude = longitude;

        // Kirim data GPS ke server jika ada perubahan signifikan
        SerialMon.print("Lat: ");
        SerialMon.print(latitude, 6);
        SerialMon.print(" Lng: ");
        SerialMon.println(longitude, 6);
        SerialMon.print(" Speed: ");
        SerialMon.println(speed);

        // Kirim data GPS
        sendGPSToServer(latitude, longitude, speed);
      }
    } else {
      SerialMon.println("GPS belum mendapatkan lokasi yang valid...");
    }
  }
}


// Meningkatkan rate pembacaan GPS menjadi 5 Hz
void setGPSRate(HardwareSerial &gpsSerial) {
    byte setRate[] = {
        0xB5, 0x62,             // Header UBX
        0x06, 0x08,             // Message Class and ID (CFG-RATE)
        0x06, 0x00,             // Length
        0xC8, 0x00,             // Measure Rate (200 ms untuk 5 Hz)
        0x01, 0x00,             // Navigation Rate (1 cycle)
        0x01, 0x00,             // Time Reference (0: UTC, 1: GPS time)
        0xDE, 0x6A              // Checksum (CK_A, CK_B)
    };
    gpsSerial.write(setRate, sizeof(setRate));
}
// Fungsi untuk mengaktifkan SBAS (DGPS)
void enableSBAS(HardwareSerial &gpsSerial) {
  byte enableSBAS[] = {
    0xB5, 0x62,             // Header UBX
    0x06, 0x16,             // Message Class and ID (CFG-SBAS)
    0x08, 0x00,             // Length
    0x01,                   // SBAS enabled
    0x03,                   // Enable ranging and correction
    0x00,                   // Don't use integrity information
    0x00,                   // Reserved
    0x00, 0x00, 0x00, 0x00, // Reserved
    0x20, 0xD1              // Checksum (CK_A, CK_B)
  };

  gpsSerial.write(enableSBAS, sizeof(enableSBAS));
}


void connectGPRS() {
  SerialMon.println("Menghubungkan ke GPRS...");

  if (!modem.waitForNetwork(60000)) {  // Tunggu sampai 60 detik
    SerialMon.println("Gagal terhubung ke jaringan, coba lagi...");
    delay(5000);
    return;
  }

  // Cek apakah modem terdaftar di jaringan GPRS
  SerialMon.println("Modem terdaftar di jaringan. Coba sambungkan ke GPRS...");

  // Coba sambungkan ke GPRS
  if (!modem.gprsConnect(apn, user, pass)) {
    SerialMon.println("GPRS gagal terhubung!");
  } else {
    SerialMon.println("GPRS berhasil terhubung.");
  }
}

void checkSignalQuality() {
  int signalQuality = modem.getSignalQuality();
  SerialMon.print("Kualitas sinyal GSM: ");
  SerialMon.println(signalQuality);

  // Jika sinyal terlalu lemah, beri peringatan
  if (signalQuality <= 1) {
    SerialMon.println("Sinyal sangat lemah, coba pindahkan perangkat.");
  }
}

// Fungsi untuk mengirim data GPS ke server
void sendGPSToServer(float latitude, float longitude, float speed) {
   SerialMon.println("Memeriksa status koneksi GPRS...");
   
   if (!modem.isGprsConnected()) {
       SerialMon.println("GPRS belum terhubung, mencoba menghubungkan ulang...");
       connectGPRS();  // Coba ulangi koneksi GPRS
   }

   if (!modem.isGprsConnected()) {
       SerialMon.println("GPRS belum terhubung setelah percobaan ulang, tidak dapat mengirim data.");
       return;
   }

   TinyGsmClient client(modem);
   SerialMon.println("Terhubung ke GPRS, mengirim data GPS...");

   if (client.connect(traccar_host, traccar_port, 30000)) {  // Tambah waktu timeout menjadi 30 detik
       SerialMon.println("Terhubung ke server Traccar.");

       // Format data untuk dikirim ke Traccar
       String url = "/?id=" + String(device_id) + "&lat=" + String(latitude, 6) + "&lon=" + String(longitude, 6) + "&speed=" + String(speed, 2);
       client.print(String("GET ") + url + " HTTP/1.1\r\n");
       client.print(String("Host: ") + traccar_host + "\r\n");
       client.print("Connection: close\r\n\r\n");  // Pastikan server menutup koneksi

       // Terima respons dari server
       unsigned long timeout = millis();
       bool responseReceived = false;

       while (client.connected()) {
           if (client.available()) {
               String line = client.readStringUntil('\n');
               SerialMon.println(line);

               // Jika respons dari server adalah HTTP 200 OK, anggap sukses dan tutup koneksi
               if (line.startsWith("HTTP/1.1 200 OK")) {
                   SerialMon.println("Data diterima oleh server, menutup koneksi.");
                   responseReceived = true;
                   break;
               }
           }

           // Batasi waktu menunggu respons
           if (millis() - timeout > 5000) {  // Timeout 5 detik untuk menunggu respons
               SerialMon.println("Timeout: Koneksi ke server terlalu lama.");
               break;
           }
       }
       
       // Jika tidak ada respons 200 OK, beri peringatan
       if (!responseReceived) {
           SerialMon.println("Tidak ada respons dari server, tetapi data mungkin terkirim.");
       }
       
       client.stop();  // Selalu tutup koneksi setelah selesai
       SerialMon.println("Koneksi ditutup.");
   } else {
       SerialMon.println("Gagal terhubung ke server.");
   }
}

Mau jualan Pulsa, Kuota, Token DLL terlengkap dengan Jaminan Harga Termurah & Pasti Untung kunjungi: Agen Pulsa Termurah bisa buat usaha atau untuk kebutuhan pribadi.

GPS Tracker ESP32 NEO-6M SIM800 Traccar Kendaraan
Share: