/*
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());
}