Speed and Distance Tracker with Arduino

My Code


#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;//LCD ports
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//setting up LCD


SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);


#define GPSECHO  false

bool firstRun = true;

void setup()
{
  Serial.begin(115200);
  mySerial.begin(9600);
  delay(5000);
  Serial.println("Adafruit GPS library basic parsing test!");

  GPS.begin(9600);

  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);

  // uncomment this line to turn on only the "minimum recommended" data
  //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

  // Set the update rate
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);  

  // Request updates on antenna status, comment out to keep quiet
  GPS.sendCommand(PGCMD_ANTENNA);

  delay(5000);
  // Ask for firmware version
  mySerial.println(PMTK_Q_RELEASE);

  lcd.begin(16, 2);
  
}

double latitude = (GPS.latitudeDegrees, 8);
double longitude = (GPS.longitudeDegrees, 8);
double newLat = (GPS.latitudeDegrees, 8);
double newLong = (GPS.longitudeDegrees, 8);
double distance = 0;

uint32_t timer = millis();

void loop()
{
  char c = GPS.read();
  if ((c) && (GPSECHO))
    Serial.write(c);

  // if a sentence is received, we can check the checksum, parse it...
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA()))   // sets the newNMEAreceived() flag to false
      return;  
  }

  // every 2 seconds or so, print out the current stats
  if (millis() - timer > 2000) {
    timer = millis(); // reset the timer

    Serial.print("\nTime: ");
    if (GPS.hour < 10) { Serial.print('0'); }
    Serial.print(GPS.hour, DEC); Serial.print(':');
    if (GPS.minute < 10) { Serial.print('0'); }
    Serial.print(GPS.minute, DEC); Serial.print(':');
    if (GPS.seconds < 10) { Serial.print('0'); }
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    if (GPS.milliseconds < 10) {
      Serial.print("00");
    } else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
      Serial.print("0");
    }
    Serial.println(GPS.milliseconds);
    Serial.print("Date: ");
    Serial.print(GPS.day, DEC); Serial.print('/');
    Serial.print(GPS.month, DEC); Serial.print("/20");
    Serial.println(GPS.year, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
    if (GPS.fix) {
      Serial.print("Location: ");
      Serial.print(GPS.latitudeDegrees, 8); Serial.print(GPS.lat);
      Serial.print(", ");
      Serial.print(GPS.longitudeDegrees, 8); Serial.println(GPS.lon);

      Serial.print("Speed (knots): "); Serial.println(GPS.speed);
      Serial.print("Angle: "); Serial.println(GPS.angle);
      Serial.print("Altitude: "); Serial.println(GPS.altitude);
      Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
      Serial.print("Antenna status: "); Serial.println((int)GPS.antenna);
    }
    if (GPS.fix) {
        //ETCG Notes -- Print to LCD Screen
        lcd.clear();
        lcd.setCursor(7,0);
        lcd.print("Spd:");
        lcd.setCursor(11,0);
        float mph;
        mph = (GPS.speed) * 1.15;
        lcd.print(mph);
        lcd.setCursor(15, 0);
        lcd.print("mph");


        if(firstRun == true){
          firstRun = false;
          latitude = GPS.latitudeDegrees, 8;
          longitude = GPS.longitudeDegrees, 8;
        }
        else{
          newLat = GPS.latitudeDegrees, 8;
          newLong = GPS.longitudeDegrees, 8;
          distance += sqrt(pow(((newLat - latitude) * 69), 2) + pow(((newLong - longitude) * 50), 2));

          latitude = GPS.latitudeDegrees, 8;
          longitude = GPS.longitudeDegrees, 8;

          lcd.setCursor(0,1);
          lcd.print("Dis:");
          lcd.setCursor(4,1);
          lcd.print(distance);
        }

      }  else {
        lcd.clear();
        lcd.setCursor(0,1);
        lcd.print("No Signal");
      }
      lcd.setCursor(0,0);
      lcd.print("Sats:");
      lcd.setCursor(5,0);
      lcd.print((int)GPS.satellites);
  }
}