Modul GPS NEO-6M menerima sinyal satelit dan ESP32 mengirim lokasinya ke Klenik sebagai tautan Google Maps yang bisa langsung dibuka, lengkap dengan kecepatan dan jumlah satelit. Dasar untuk pelacak motor, sepeda, atau hewan ternak.
GPS menghitung posisinya dari waktu tempuh sinyal beberapa satelit. Minimal 4 satelit dibutuhkan untuk posisi yang baik. Modul NEO-6M mengirim hasilnya lewat serial (UART) sebagai kalimat teks NMEA, misalnya $GPRMC,..., beberapa kali per detik. ESP32 punya port serial kedua (Serial2) di pin RX2/TX2, jadi Serial utama tetap bebas untuk Serial Monitor.
Pustaka TinyGPSPlus membaca kalimat NMEA huruf demi huruf (gps.encode()) dan menyediakan hasilnya: lintang, bujur, kecepatan, ketinggian, dan jumlah satelit. Lokasi dikirim sebagai tautan maps.google.com/?q=lat,lon, yang bisa diketuk di Text Log untuk membuka peta.
Pertama kali menyala, GPS butuh 1-5 menit di tempat terbuka (cold start) sebelum mendapat posisi. Di dalam gedung, sinyal satelit biasanya tidak tembus.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| GPS NEO-6M GYNEO6MV2 Module + EEPROM + Antena Ar | 1 | Rp60.800 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 4 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp139.300 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| GPS NEO-6M + antena VCC | → | 3V3 | merah |
| GPS NEO-6M + antena RX | → | TX2 | kuning |
| GPS NEO-6M + antena TX | → | RX2 | biru |
| GPS NEO-6M + antena GND | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p144.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Text Log Lokasi (ketuk untuk peta) | ichibot/KODE/p144/lokasi | menampilkan teks masuk |
| Indikator Boolean Sinyal GPS | ichibot/KODE/p144/status | ON = 1 “TERKUNCI”, OFF = 0 |
| Gauge Satelit | ichibot/KODE/p144/satelit | 0–12 |
| Gauge Kecepatan | ichibot/KODE/p144/kecepatan | 0–80 km/j |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), TinyGPSPlus (Mikal Hart). Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 144 - Pelacak Lokasi GPS
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <TinyGPSPlus.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_SATELIT = "ichibot/budi1234/p144/satelit";
const char* TOPIK_STATUS = "ichibot/budi1234/p144/status";
const char* TOPIK_LOKASI = "ichibot/budi1234/p144/lokasi";
const char* TOPIK_KECEPATAN = "ichibot/budi1234/p144/kecepatan";
const char* TOPIK_KETINGGIAN = "ichibot/budi1234/p144/ketinggian";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
TinyGPSPlus gps;
unsigned long terakhir = 0;
void langganan() {}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
Serial2.begin(9600, SERIAL_8N1, 16, 17); // RX2 = GPIO16 (dari TX GPS), TX2 = GPIO17
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
while (Serial2.available()) gps.encode(Serial2.read()); // GPS mengirim kalimat NMEA terus-menerus
if (millis() - terakhir < 5000) return;
terakhir = millis();
mqtt.publish(TOPIK_SATELIT, String(gps.satellites.value()).c_str());
if (!gps.location.isValid() || gps.location.age() > 10000) {
mqtt.publish(TOPIK_STATUS, "0");
return; // belum dapat posisi (di dalam ruangan / baru menyala)
}
mqtt.publish(TOPIK_STATUS, "1");
String lat = String(gps.location.lat(), 6), lon = String(gps.location.lng(), 6);
mqtt.publish(TOPIK_LOKASI, ("https://maps.google.com/?q=" + lat + "," + lon).c_str());
mqtt.publish(TOPIK_KECEPATAN, String(gps.speed.kmph(), 1).c_str());
mqtt.publish(TOPIK_KETINGGIAN, String(gps.altitude.meters(), 0).c_str());
}Langkah 4: Pahami kodenya
- Kabel serial selalu disilang: TX GPS ke RX ESP32, RX GPS ke TX ESP32. NEO-6M bawaan berkomunikasi pada 9600 baud.
- Semua huruf yang datang diberikan ke pustaka. Jangan ada
delay()panjang, atau data GPS akan menumpuk dan hilang. - Lokasi hanya dikirim kalau valid dan diperbarui dalam 10 detik terakhir.