/*
Zur Zeit arbeite ich daran, den Solartracker auf GPS umzustellen.
Damit werden die aktuelle Uhrzeit (UTC) sowie die Ortskoordinaten
(Geogr. Breite, Länge) vom GPS-Modul (GY-NEO-6M v2) bereitgestellt.
Der Solartracker kann so ohne RTC-Uhr und ortsunabhängig betrieben werden.
Dieses Testprogramm: GPS-Ausgabe auf LCD Display
Hardware: Arduino Uno, GPS GY-NEO-6M v2, SaintSmart I2C 20x4 LCD Display
Michael Schulte, 14.07.2019
*/
 


#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

static const int RXPin = 2, TXPin = 3;             // Anschluss an Pin 2 (Rx) und Pin 3 (Tx)
static const uint32_t GPSBaud = 9600;              // Serielle Geschw. 9600 baud

TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);

TinyGPSCustom pdop(gps, "GPGSA", 15); // $GPGSA sentence, 15th element
TinyGPSCustom hdop(gps, "GPGSA", 16); // $GPGSA sentence, 16th element
TinyGPSCustom vdop(gps, "GPGSA", 17); // $GPGSA sentence, 17th element
 


void setup()
{
ss.begin(GPSBaud);
lcd.init();
lcd.backlight();
lcd.clear();
}
 


void loop()
{
if (gps.altitude.isUpdated() || gps.satellites.isUpdated() ||
pdop.isUpdated() || hdop.isUpdated() || vdop.isUpdated())

{
lcd.setCursor(0, 0);
if (gps.date.day() < 10) lcd.print("0");
lcd.print(gps.date.day());                        // Aktuelles Datum (Tag)
lcd.print(".");
if (gps.date.month() < 10) lcd.print("0");
lcd.print(gps.date.month());                      // Aktuelles Datum (Monat)
lcd.print(".");
lcd.print(gps.date.year());                       // Aktuelles Datum (Jahr)

lcd.setCursor(12, 0);
lcd.print(gps.time.hour() + 2);                   // Aktuelle Uhrzeit (UTC-Stunde + 2 = MEZ)
lcd.print(":");
if (gps.time.minute() < 10) lcd.print("0");
lcd.print(gps.time.minute());                     // Aktuelle Uhrzeit (Minute)
lcd.print(":");
if (gps.time.second() < 10) lcd.print("0");
lcd.print(gps.time.second());                     // Aktuelle Uhrzeit (Sekunde)

lcd.setCursor(0, 1);
lcd.print(gps.location.lat(), 6);                 // Geographische Breite in Grad         
lcd.write(0xDF);                                 
lcd.print(" ");
lcd.print(gps.location.lng(), 6);                 // Geographische Länge in Grad
lcd.write(0xDF);

lcd.setCursor(0, 2);
lcd.print("Altit. ");
lcd.print(gps.altitude.meters(), 0);              // Höhe ü.NN in Meter
lcd.print(" m");

lcd.setCursor(14, 2);
lcd.print("Sat ");
lcd.print(gps.satellites.value());                // Anzahl der Satelliten "in use"
if (gps.satellites.value() < 10) lcd.print(" ");

lcd.setCursor(0, 3);
lcd.print("p.h.v ");
lcd.print(pdop.value());                          // Positionsgenauigkeit
lcd.print(" ");
lcd.print(hdop.value());                          // Horizontale Genauigkeit
lcd.print(" ");
lcd.print(vdop.value());                          // Vertikale Genauigkeit
}
while (ss.available() > 0)
gps.encode(ss.read());
}