Masih dalam rangka kegatelan tangan mengoprek sesuatu yang berhubungan GeoPy dan pengolahan data lokasi, kali ini dalam 2 seri tulisan akan saya bahas mengenai Hardware GPS receiver yg umum ada pasaran elektronika di olshop. Ternyata masa lebaran ini agak beresiko kalau belanja dan kirim barang, jadi saya terpaksa kembali ke 15 tahun yang lalu ketika saya bekerja di salah satu vendor perangkat telekomunukasi CDMA. Jadi saat itu salah satu cara membedakan BTS CDMA dengan GSM adalah mencari antena berbentuk setengah bola atau kerucut yg diletakkan tidak terlalu tinggi dekat dengan shelter BTS.
Bernostalgia ke masa-masa proyek memasang antena GPS di tower, yg nilai rupiahnya bisa untuk beli HP baru belum lagi sisa kabel yang panjang kualitas jerman yg laku keras di loak...ahhhh sudahlahh...kini yang menjadi warisan di saya hanya sebuah receiver GPS USB yang dulunya digunakan untuk referensi lokasi saat melakukan drive test sinyal. Dan saat saya colokkan port USB nya ke komputer terdeteksi sebagai Usb to serial converter. Wahh ini dalemannya pasti masih berupa UART dan bisa di interfacing ke arduino !
Jadi makin semangat nih buat menyambungkannya ke Arduino. Tapi sebelumnya ada baiknya mencari referensi tentang data yg dikirim oleh si receiver. Sial nya si pembuat modul telah bangkrut dan sedikit yg bisa saya dapatkan digoogle tapi cukuplah informasi yg di dapat bahwa receiver ini berbasis NMEA yg masih umum digunakan. Dengan terminal putty dan serial baudrate 4800 layar menangkap seperti ini :
Buset dah..banyak amat tuh tulisan yg harus diparsing, dan dari yg saya baca di standar NMEA receiver ini lumayan lengkap karena bisa membaca berbagai standar GPS , jadi ada $GPRSV dan $GPRSA untuk melihat informasi satelit dan $GPGGA dan $GPRMC untuk membaca koordiat, waktu, kecepatan, ketinggian dsb. Wah saya mumet ini kalau membaca parsingan segitu banyak, dan pilihan tertuju ke google dan saya cari ada gak software gratis untuk membaca parsingan NMEA seperti diatas...dan ternyata banyak loo..ayo kita coba dan bawa keruangan terbuka agar sinyal satelitnya lebih bagus.
Pilihan saya tertuju ke software yg pertama dimana terpampang jelas parsingan NMEA nya sehingga dari data serial yg didapat seperti ini :
$GPRMC,040503.246,A,0719.6784,S,11243.4344,E,0.00,0.00,220520,,*1B
Artinya kira-kira :
040503.246 = jam 04 , Menit 05, Detik 03.246 (UTC)
A = Data Benar (V jika datanya salah )
0719.6784,S = Latitude 7' 19.6784 " South
11243.4344,E = Longitude 112' 43.4344 " East
220520 = Tanggal 22 Bulan 05 Tahun 20
Nah sudah siap nih...ayo kita siapkan bahan-bahan dan mulai menyolder modul receiver GPSnya agar bisa dihubungkan ke Arduino.
Skematik tidak akan saya bahas karena sangat gampang dicari apalagi cara koneksi LCD ke Arduino seperti apa pasti para pembaca sudah tahu, dan kalau belum ya tinggal googling aja bagaimana cara menyambungkan LCD ke arduino. Microcontroller yg pas ada disaya adalah wemos d1 r1 yang memiliki wifi berbasis ESP8266 dan nantinya akan saya proogram untuk membaca GPS secara serial dan DHT11 sebagai tambahan sensor agar sedikit berbau IOT. Tujuan akhir dari praktek ini adalah mengirimkan data sensor suhu/kelembaban beserta dengan data GPS dan nama lokasi pembacaan yg akan dikolaborasikan dengan Mqtt serta Geopy phyton. Pada part 1 ini akan difokuskan pembahasan mengenai pembacaan GPS ke LCD.
Pertanyaan besarnya adalah bagaimana cara parsing text serial secara efektif? Apakah manual saja? Secara tukang solder ini memiliki pengalaman buruk dengan parsing serial ! Teringat bahwa modul GPS receiver banyak dijual sebagai interfacing Arduino dan pastinya ada Library jadinya, dan benar saja beberapa library terpampang di sketch dan stelah mencoba beberapa kali akhirnya diputuskan untuk menggunakan library TinyGps++ . Kenapa? Karena dengan script examplenya (ada di folder lib nya) alat saya sukses membaca data GPS dengan bagus. Mari kita berkreasi dengan cara copy paste ala tukang solder ini.
#include <TinyGPS++.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
static const int RXPin = 0, TXPin = 15;
//pake RX aja hanya baca data !
static const uint32_t GPSBaud = 4800;
Seperti biasanya menggunakan board arduino versi kecil maka serial portnya harus dengan software serial. Baudrate disesuaikan yaitu 4800
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
LiquidCrystal lcd(16, 5, 4, 14, 12, 13);
Inisialisai LCD seperti biasa simple aja dan harus diperhatikan Wemos D1 R1 memiliki GPIO yang agak loncat loncat, jadi sesuaikan penamaan portnya jangan sampe salah. Gunakan Google Search jika salah.
void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
lcd.begin(20, 4);
Serial.println(F("Coba-Coba GPS"));
Serial.println(F("Menggunakan TinyGPS++ Dan GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by ahocool with respect to Lib creator Mikal Hart"));
Serial.println();
}
Function setup menyatakan bahwa serial dari wemos akan digunakan sebagai console juga untuk melihat hasil pembacaan GPS selain di LCD. keuntungan lainnya adalah memudahkan untuk debugging.
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
lcd.setCursor(0,0);
lcd.print(" ---- GPS VALID ----");
lcd.setCursor(0,1);
lcd.print("LAT :");
lcd.print(gps.location.lat(), 6);
lcd.setCursor(0,2);
lcd.print("LONG:");
lcd.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
lcd.setCursor(0,0);
lcd.print(" ---GPS INVALID --- ");
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
Pada sript diatas berfungsi sebagai tampilan GPS ke Serial dan LCD, secara umumnya dapat dilihat class yg umum digunakan :
gps.location.isValid()
gps.location.lat()
gps.location.lng()
gps.date.isValid()
gps.time.hour()
gps.time.minute()
gps.time.second()
gps.time.second()
Untuk loop utama seperti dibawah ini :
void loop()
{
// Data ditampilkan hanya setelah data selesai di olah
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("GPSMU pedot brooo! cek kabelmu."));
while(true);
}
}
Hasilnya ketika saya jalankan diluar ruangan sangat akurat apalagi saat cuaca ternag dan LED dari GPS rceiver tidak berkedip yg artinya FULLY LOCKED TO 3 SATELLITES.
Tidak terlalu sulit jika kita sudah mengetahui langkah-langkah "googling" yang sesuai untuk meng "oprek" arduino. Untung saja saya punya receiver GPS jadul kalau tidak harus keluar duit 200rb an untuk membeli modul GPS Ublox Neo.
.....TUNGGU YANG LEBIH KEREN DI TULISAN PART 2...
Selamat mencoba