#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> 

LiquidCrystal_I2C lcd(0x27, 20,4);

SoftwareSerial serial_gps(4, 3); // RX = pin 10, TX = pin 11
TinyGPSPlus gps;
double rendah = 10.00,
       sedang = 35.00,
       tinggi = 65.00;
double latitude, longitude;
float vbatt = 0.0;
void setup() {
  pinMode(13, OUTPUT);
  pinMode(2, OUTPUT);
  lcd.begin(); 
  Serial.begin(115200);
  serial_gps.begin(9600);
  lcd.setCursor(0, 0);
  lcd.print(" GPS SPEED DISPLAY ");
  lcd.setCursor(0, 1);
  lcd.print("     LOCOTRACK     ");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("     LOCOTRACK     ");
  lcd.setCursor(0, 2);
  lcd.print("  Mencari Satelit  ");
  lcd.setCursor(0, 3);
  lcd.print("  ---------------  ");
  digitalWrite(2, HIGH);
}
void taspat_rendah(){
  if (gps.speed.kmph() < rendah){
    lcd.setCursor(8, 3);
    lcd.print("Rendah");
  }
}
void taspat_sedang(){
  if (gps.speed.kmph() > sedang){
    lcd.setCursor(8, 3);
    lcd.print("Sedang");
  }
}
void taspat_tinggi(){
  if (gps.speed.kmph()> tinggi){
    lcd.setCursor(8, 3);
    lcd.print("Tinggi");
  }
}

void loop() {
  while (serial_gps.available()) {
    gps.encode(serial_gps.read());
  }
  if (gps.location.isUpdated()) {
    
    digitalWrite(13, HIGH);
    int analog_value = analogRead(A0);
    vbatt = (analog_value * 5.0) / 1024.0; 
    latitude = gps.location.lat();
    longitude = gps.location.lng();
    String link = String(latitude, 4) + "," + String(longitude, 4) ;
    lcd.setCursor(0, 0);
    lcd.print("Batt:");
    lcd.setCursor(5, 0);
    lcd.print(vbatt);
    lcd.print("V ");
    lcd.setCursor(11, 0);
    lcd.print("| ");
    lcd.setCursor(0, 1);
    lcd.print("POS:");
    lcd.print(link);

    lcd.setCursor(0, 2);
    lcd.print("KECEPATAN:");
    lcd.print(gps.speed.kmph());
    lcd.print("Km/h  ");

    lcd.setCursor(0, 3);
    lcd.print("TASPAT:");
    taspat_rendah();
    taspat_sedang();
    taspat_tinggi();

    Serial.print(link);
    Serial.print(",");
    Serial.println(gps.speed.kmph());
    digitalWrite(13, LOW);
  }
}
