GPS-Koordinaten am LCD ausgeben

Hallo zusammen,

im heutigen Beitrag möchte ich Ihnen zeigen wie mit unserem NEO 6M Modul GPS-Koordinaten abgerufen und auf dem 2004-LCD-Display dargestellt werden können.

Wir benutzen heute für unser Beispiel:

 

Die Verdrahtung:

Die beiden Widerstände (10K) sind optional. Die Spannungsversorgung kann entweder über den USB-Anschluss des Arduino oder über ein andere 5V Netzteil(Gleichspannung) stattfinden. Die Spannungsversorgung sollte dann sicher mindestens 200 mA abgeben können. Also sollte der USB-Anschluss mindestens 2.0 sein.

Das GPS-Modul NEO M6 hat eine V24-Schnittstelle, diese ist mit der zweiten V24-Schnittstelle des Arduino-Mega 2560 verbunden. In meinem Beispiel wurde RX1 (Pin 19 des Arduino) mit TxD des GPS-Modul NEO M6 verdrahtet(braunes Kabel in der Zeichnung). Das gelbe Kabel ist obligatorisch (Pin 18 Arduino GPS RxD).

Nach dem Aufbau können wir nun der Programmierung zuwenden. In der Literatur, sofern diese etwas älter ist, wird eine Baudrate von 4800 vom GPS-Modul angegeben. Inzwischen ist die Entwicklung weitergegangen, und bei den jetzigen GPS-Modulen werden viele auch mit 9600 Baud betrieben. Im nachfolgenden Sketch kann in der Zeile #define Baudrate_02 9600
leicht die entsprechende Baudrate angepasst werden, damit das GPS-Modul und die zweite Schnittstellen des Arduino, die gleiche Baudrate haben.
Damit der nachfolgende Sketch kompiliert werden kann, müssen die Bibliotheken
LquidCrstal_I2C.h und TinyGPS++.h noch in die Arduino IDE importiert werden, da es sich im Gegensatz zur LiquidCrystal.h um keine Standbibliothek oder library handelt. Sofern also diese Bibliotheken nicht bei Ihnen vorhanden sind so können diese im Internet unter folgen Seiten geladen werden und danach in die Arduino IDE eingebunden werden.


https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

https://github.com/mikalhart/TinyGPSPlus/blob/master/src/TinyGPS%2B%2B.h

An dieser Stelle möchte ich unserem Kunden Rudolf Reiber danken, der den Code für dieses Projekt überarbeitet hat.

 Hier der Code:

 

/*********************************************************************************
  GPS mit LCD-Anzeige
  Der ursprüngliche Sketch UsingCustomFields aus der Bibliothek TinyGPS++
  wurde hier angepasst.
  Rudolf Reiber Stand 23.04.2019
  Angepasst auf Arduino UNO und LCD (4 x 20), aber ohne Serial Monitor

  Anschlüsse:
  +5 V verbinden mit VCC des GPS und VCC des LCD
  GND  verbinden mit GND des GPS und GND des LCD
  SDA des LCD verbinden mit A4 des UNO
  SCL des LCD verbinden mit A5 des UNO
  RX des GPS verbinden mit D11 des UNO
  TX des GPS verbinden mit D10 des UNO

  Kompiliert mit Arduino 1.8.9 (MacOS X)
  Im geschlossenen Raum wird in der Regel kein GPS-Signal empfangen,
  deshalb ausprobieren im Freien. Erst wenn die blaue LED auf dem GPS blinkt, hat das
  GPS Kontakt mit ausreichend Satelliten

  Die Umlaute der Texte wurden durch die Escape-Sequenzen ersetzt.
  lcd.print("\xE1"); // gibt ein ä aus
  lcd.print("\xEF"); // gibt ein ö aus
  lcd.print("\xF5"); // gibt ein ü aus
  lcd.print("\xE2"); // gibt ein ß aus
  lcd.print("\xDF"); // gibt ein ° aus
  lcd.print("\xE4"); // gibt ein µ aus
  lcd.print("\xF4"); // gibt ein Ω aus

*********************************************************************************/
#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <LCD.h>
#include <SoftwareSerial.h>

// Parameter LCD mit 4 Zeilen a 20 Zeichen
#define Zeilen_Zahl 4
#define Zeichen_Zahl 20

// Parameter für SoftwareSerial
#define rxPin 10 // wird mit TX des GPS verbunden
#define txPin 11 // wird mit RX des GPS verbunden

// Objekt für GPS
TinyGPSPlus gps;

// V24 Schnittstelle
#define Baudrate 9600

// Offset für Zeitanzeige UTC zu MEZ
// Sommerzeit: 2, Winterzeit: 1
#define Offset 2

// Variablen für die Koordinaten und anderes. Die Koordinaten wurden in das Format 32° 13.875 umgerechnet.
int    pos_Punkt_lat, pos_Punkt_lng; // Position des Punktes im String "32.124256"
String lat_Dez, lng_Dez, lat_Grad, lng_Grad, lat_Minuten, lng_Minuten; // _Dez: "32.124256", _Grad: "32", _Minuten: "13.875"
String anzeige_lat = "N:"; // Wenn die Gradzahl > 0: "N:" sonst "S:"
String anzeige_lng = "E:"; // Wenn die Gradzahl > 0: "E:" sonst "W:"
bool   maske_schreiben = true; // Die Maske wird nicht immer neu geschrieben
double lat_gps, lng_gps; // Die vom GPS zurückgegebenen Kommazahlen der Koordinaten

// Init IIC LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Init SoftwareSerial
SoftwareSerial gpsSerial(rxPin, txPin);

// Initroutine
void setup()
{
  gpsSerial.begin(Baudrate);            // Initialisiere Schnittstelle GPS NEO_M6
  lcd.begin(Zeichen_Zahl, Zeilen_Zahl);  // LCD Anzeige vorbereiten
  lcd.clear();                          // initialisiere LCD IIC Anzeige

  // Willkommensgruß
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.write("    Willkommen!");
  delay(2000);

} // Ende Initroutine

// Hauptschleife
void loop()
{
  // Erst wenn die Daten ankommen ...
  while (gpsSerial.available() > 0)
    if (gps.encode(gpsSerial.read())) displayInfo();
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" Kein GPS-Empf\xE1nger ");
    lcd.setCursor(0,2);
    lcd.print(" Anschluss  pr\xF5fen! ");
    while (true);
  }
} // Ende Hauptschleife

// Funktion displayInfo
void displayInfo()
{
  if (gps.location.isValid())
  {
    lat_gps = gps.location.lat();   // Breite und Länge einlesen
    lng_gps = gps.location.lng();
    if (lat_gps < 0) {              // Anpassen, wenn auf der Südhalbkugel
      anzeige_lat = "S:";
      lat_gps = abs(lat_gps);
    }
    if (lng_gps < 0) {              // Anpassen, wenn westlich von Greenwich
      anzeige_lng = "W:";
      lng_gps = abs(lng_gps);
    }

    schreibeMaske(maske_schreiben); // Bei Bedarf die Maske schreiben
    lat_Dez = String(gps.location.lat(),6); // Umwandeln in einen String
    lng_Dez = String(gps.location.lng(),6); // Umwandeln in einen String
    pos_Punkt_lat = lat_Dez.indexOf(".");   // Position des Punktes ermitteln
    pos_Punkt_lng = lng_Dez.indexOf(".");   // Position des Punktes ermitteln
    lat_Grad = lat_Dez.substring(0, pos_Punkt_lat); // Vor dem Punkt stehen die Grad
    lng_Grad = lng_Dez.substring(0, pos_Punkt_lng); // Vor dem Punkt stehen die Grad
    lat_Minuten = String( ("0."+lat_Dez.substring(pos_Punkt_lat + 1, lat_Dez.length())).toDouble()*60.0,3); // Die Minuten ermitteln
    lng_Minuten = String( ("0."+lng_Dez.substring(pos_Punkt_lng + 1, lng_Dez.length())).toDouble()*60.0,3); // Die Minuten ermitteln
    lcd.setCursor(0, 1); // Ergebnis anzeigen
    lcd.print(lat_Grad + "\xDF" + lat_Minuten);
    lcd.setCursor(11, 1);
    lcd.print(lng_Grad + "\xDF" + lng_Minuten);
  }
  else // Keine Koordinaten wurden übermittelt
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" Satelliten  suchen ");
    maske_schreiben = true;
    delay (2000);
  }

  if (gps.date.isValid()) // Gültiges Datum formatiert auf dd.mm.yyyy
  {
    lcd.setCursor(0, 3);
    if (gps.date.day() < 10) lcd.print("0");
    lcd.print(gps.date.day());
    lcd.print(".");
    if (gps.date.month() < 10) lcd.print("0");
    lcd.print(gps.date.month());
    lcd.print(".");
    if (gps.date.year() < 10) lcd.print("0");
    lcd.print(gps.date.year());
    lcd.print(" ");
  }
  else // Datum ungültig
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" Datum ist ung\xF5ltig ");
    maske_schreiben = true;
  }
  if (gps.time.isValid()) // Gültige Zeit, formatiert auf hh:mm:ss
  {
    lcd.setCursor(12, 3);
    if (gps.time.hour() + Offset< 10) lcd.print("0");
    lcd.print((gps.time.hour() + Offset));
    lcd.print(":");
    if (gps.time.minute() < 10) lcd.print("0");
    lcd.print(gps.time.minute());
    lcd.print(":");
    if (gps.time.second() < 10) lcd.print("0");
    lcd.print(gps.time.second());
  }
  else // keine gültige Zeit vorhanden
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" Zeit ist ung\xF5ltig! ");
    maske_schreiben = true;
  }
} // Ende displayInfo

// Funktion schreibeMaske
 void schreibeMaske(bool schreiben) {
  if (schreiben) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(anzeige_lat + "        " + anzeige_lng + "        ");
    lcd.setCursor(0, 2);
    lcd.print("Datum:      Zeit:   ");
    maske_schreiben = false;
  }
} // Ende schreibeMaske

/********************** Ende ***************************/

 Viel Spaß beim nachbasteln & bis zum nächsten Beitrag :)

Letzter Artikel Digispark als Eingabegerät

Kommentar

Thomas Lehnert - Februar 18, 2019

Ein interessantes Projekt. Das werde ich auf jeden Fall ausprobieren. Eine Frage zum code.
In der init routine meckert die Arduino IDE den Befehl lcd.begin(); an. Erst nach Ergänzung durch Parameter lcd.begin(20,4); (Spalten und Zeilenzahl des Displays), lief die Kompilierung durch. Praktisch kann ich das noch nicht ausprobieren, da ich das GPS Modul noch besorgen muss.
Stimmt da eventuell mit der GPS libery etwas nicht? im Foto über dem Beitrag werden Koordinaten angezeigt, die irgendwo südlich von Saudiarabien am Horn von Afrika liegen. Werden hier vielleicht Längen und Breitengrad verwechselt? Das werde ich aber rausfinden wenn ich das Projekt selbst realisiert habe.

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe