Pemilihan Jenis GPS
Membuat Logger GPS yang baik, tentu faktor utama nya adalah pemilihan jenis GPS yang akan kita gunakan. Akurasi GPS nya, kesetabilan pembacaan kordinate atau dari segi dimensi GPS itu sendiri.
Saya secara pribadi sudah mencoba beberapa jenis GPS, seperti
- Ublox Neo-6M, Neo-7M, dan Neo-8M
- Quectel L80 dan Quectel L86
Dari semua jenis itu, yang terbaik menurut saya adalah Quectel L86, karena pembacaan GPS nya stabil, beda dengan yang lain, pembacaan GPS nya berpindah pindah. Dari sisi Akurasi juga hampir 3-4m dari titik sebenar nya.
Struktur nya juga bagus karena include antenna dalam board. Jika memerlukan antenna tambahan juga bisa di tambah. Baca-baca datasheet nya, ketika antenna external di tambah maka auto switch ke antenna external
Membaca GPS dengan Arduino
Sebelum membaca data GPS dari Quectel L86, kita akan lihat rangkaian dari GPS logger yang kita design ini
Pada Rangkaian sangat jelas terlihat, GPS_RXD terhubung ke GPIO16 dari ESP32, dan GPS_TXD terhubung ke GPIO17.
Selanjut nya adalah tambah library berikut ke arduino, Download di link berikut ini,
Setelah di add library nya ke arduino IDE, langkah selanjut nya adalah membuat program seperti di bawah ini,
#include <TinyGPS++.h> TinyGPSPlus gps; // The serial connection to the GPS device //SoftwareSerial ss(RXPin, TXPin); #define ss Serial1 #define rst 32 String str_lat=""; String str_lon=""; String str_date=""; String str_time=""; void setup() { Serial.begin(115200); pinMode(rst, OUTPUT); ss.begin(9600, SERIAL_8N1, 17, 16); delay(100); digitalWrite(rst, LOW);delay(500); //digitalWrite(rst, HIGH);delay(500); //digitalWrite(rst, LOW);delay(500); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (ss.available() > 0) if (gps.encode(ss.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } } void displayInfo() { String str_buf_lat = ""; String str_buf_lon = ""; String str_buf_date = ""; String str_buf_time = ""; Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); str_buf_lat = String(gps.location.lat(), 6); str_buf_lat = String(gps.location.lng(), 6); str_lat = str_buf_lat; str_lon = str_buf_lon; } else { Serial.print(F("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()); str_buf_date = String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()); str_date = str_buf_date; } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { str_buf_time = String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()); str_time = str_buf_time; Serial.print(str_time); } else { Serial.print(F("INVALID")); } Serial.println(); }
Buka Serial monitor dan lihat titik GPS yang terdeteksi.
Akses SD Card Untuk Logger
Setelah GPS terdeteksi dengan baik, maka langkah selanjut nya adalah akses SD Card untuk penyimpanan data GPS dan timestamp ke dalam memory SD Card. Seperti di atas, kita check rangkaian nya dulu
Perhatikan rangkaian di atas, pin SD card terhubung ke GPIO ESP32, untuk mengkases SD card nya kita akan menggunakan HSPI dari ESP32, Program nya adalah sebagai berikut,
Pastikan SD card sudah terhubung ke SD card holder,
#include "FS.h" #include "SD.h" #include "SPI.h" SPIClass spiSD(HSPI); #define SD_CS 13 #define SDSPEED 27000000 File root; unsigned long cur_time, old_time ; bool stateLed = 0; void setup() { Serial.begin(115200); pinMode(23, OUTPUT); spiSD.begin(14, 2, 15, 13); //SCK,MISO,MOSI,ss // инициализируем HSPI1 while (!SD.begin( SD_CS, spiSD, SDSPEED)) { // if(!SD.begin()){ Serial.println("Card Mount Failed"); delay(1000); } Serial.println("found SD card"); root = SD.open("/"); printDirectory(root, 0); Serial.println("SD card Done"); } void loop() { cur_time= millis(); if(cur_time - old_time &gt;= 1000){ Serial.print("led millis: "); Serial.println(stateLed); stateLed = !stateLed; digitalWrite(23, stateLed); old_time = cur_time; } } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files break; } for (uint8_t i = 0; i &lt; numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // files have sizes, directories do not Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } }
Perhatikan Serial Monitor, jika sd card sudah terhubung dengan baik, maka akan terlihat seperti gambar di bawah ini
Logger GPS To SD Card
Sekarang saat nya kita logging data GPS ke SD card per 5 detik, yuk, gimana cara nya
#include "FS.h" #include "SD.h" #include "SPI.h" SPIClass spiSD(HSPI); #define SD_CS 13 #define SDSPEED 27000000 File root; unsigned long cur_time, old_time; unsigned long cur_time_log, old_time_log; unsigned long cur_time_read, old_time_read; bool stateLed = 0; #include <TinyGPS++.h> TinyGPSPlus gps; #define ss Serial1 String str_lat = ""; String str_lon = ""; String str_date = ""; String str_time = ""; bool flag_gps, flag_date, flag_time = 0; byte flag_sd_read = 0; void setup() { Serial.begin(115200); ss.begin(9600, SERIAL_8N1, 17, 16); pinMode(23, OUTPUT); spiSD.begin(14, 2, 15, 13); //SCK,MISO,MOSI,ss // инициализируем HSPI1 while (!SD.begin( SD_CS, spiSD, SDSPEED)) { // if(!SD.begin()){ Serial.println("Card Mount Failed"); Serial.println("please insert sd card"); delay(1000); } delay(10000); Serial.println("read sd card log"); //deleteFile(SD, "/logGps.csv"); } void loop() { cur_time = millis(); if (cur_time - old_time >= 1000) { stateLed = !stateLed; digitalWrite(23, stateLed); read_gps(); old_time = cur_time; } cur_time_log=millis(); if (cur_time_log - old_time_log >= 5000) { log_sd(); old_time_log = cur_time_log; } } void read_gps() { while (ss.available() > 0) if (gps.encode(ss.read())) get_gps(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } } void get_gps() { String str_buf_lat = ""; String str_buf_lon = ""; String str_buf_date = ""; String str_buf_time = ""; Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); str_buf_lat = String(gps.location.lat(), 6); str_buf_lon = String(gps.location.lng(), 6); str_lat = str_buf_lat; str_lon = str_buf_lon; flag_gps = 1; } else { Serial.print(F("INVALID")); flag_gps = 0; } 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()); str_buf_date = String(gps.date.month()) + "/" + String(gps.date.day()) + "/" + String(gps.date.year()); str_date = str_buf_date; flag_date = 1; } else { flag_date = 0; Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { str_buf_time = String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()); str_time = str_buf_time; Serial.print(str_time); flag_time = 1; } else { Serial.print(F("INVALID")); flag_time = 0; } flag_sd_read = flag_gps + flag_date + flag_time; Serial.print(", flag_sd: "); Serial.println(flag_sd_read); } void log_sd(){ char chr_log[100]; String str_log = ""; if(flag_sd_read == 3){ str_log = str_time + ", " + str_date + "," + str_lat + "," + str_lon + "\n"; str_log.toCharArray(chr_log, str_log.length()+1); Serial.print("chr: "); Serial.println(chr_log); appendFile(SD, "/logGps.csv", chr_log); readFile(SD, "/logGps.csv"); } } void appendFile(fs::FS &fs, const char * path, const char * message){ Serial.printf("Appending to file: %s\n", path); File file = fs.open(path, FILE_APPEND); if(!file){ Serial.println("Failed to open file for appending"); return; } if(file.print(message)){ Serial.println("Message appended"); } else { Serial.println("Append failed"); } file.close(); } void readFile(fs::FS &fs, const char * path){ Serial.printf("Reading file: %s\n", path); File file = fs.open(path); if(!file){ Serial.println("Failed to open file for reading"); return; } Serial.print("Read from file: "); while(file.available()){ Serial.write(file.read()); } file.close(); } void deleteFile(fs::FS &fs, const char * path){ Serial.printf("Deleting file: %s\n", path); if(fs.remove(path)){ Serial.println("File deleted"); } else { Serial.println("Delete failed"); } }
Hasil CSV seperti gambar di bawah ini
jika tertarik dengan produk kita di atas, cukup click whatsapp di bawah ini