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:
- ESP32 D1 R3 – Mikrokontroler berbasis ESP32 dengan Wi-Fi dan Bluetooth.
- Modul GPS NEO-6M – Untuk menerima sinyal GPS dan menentukan lokasi kendaraan.
- Modul GSM SIM800 – Digunakan untuk mengirimkan data GPS ke server melalui jaringan seluler.
- Kabel jumper dan breadboard – Untuk menghubungkan komponen.
- Antena GSM dan Antena GPS – Untuk memperkuat sinyal GSM dan GPS.
- 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.");
}
}