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

 

 Hier der Code:

 

/**************************************************************************
  GPS mit LCD-Anzeige
  Der urspruengliche Sketch UsingCustomFields aus der Bibliothek TinyGPS++
  wurde hier angepasst. Dieser Sketch laeuft mit Arduino Mege 2560.
  Beim UNO muss wie im Ursprungsbeispiel auch mit der Bibliothek Serial.h
  gearbeitet werden und nicht mit Ser2 und zusaetzlich wurde die IIC-Anzeige realisiert

  Bernhard Moosmann Stand 23.01.2019
**************************************************************************/
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <Wire.h>

// Parameter LCD IIC

#define Ausgabe_LCD_I2C 0x3F // I2C-Adresse
#define Anzahl_der_Zeilen 4
#define Anzahl_der_Zeichen_pro_Zeile 20

//---------------
// Objekt für GPS
TinyGPSPlus gps;
//------ V24 Schnittstellen
#define Baudrate_01 9600
#define Baudrate_02 9600
//------ Offset für Zeitanzeige UTC zu MEZ -----
#define Offset 1

//--------------------------------------Init IIC LCD-----------------------------------------------------------
LiquidCrystal_I2C lcd(Ausgabe_LCD_I2C, Anzahl_der_Zeichen_pro_Zeile, Anzahl_der_Zeilen);

//******************************** Initroutine **********************************
void setup()
{
  Serial.begin(Baudrate_01); // Initialisiere V24/RS232/USB Arduino
  Serial1.begin(Baudrate_02); // Initialisiere Schnittstelle GPS NEO_M6
  Wire.setClock(400000); // Baud rate IIC 100kHz, oder 400kHz
  lcd.begin();
  lcd.clear(); // initialisiere LCD IIC Anzeige
  //---------------------------------------------------------

  // Maske fuer LCD
  //---------Anzeige ----------
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Breite Laenge ");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  lcd.setCursor(0, 2);
  lcd.print("Datum Zeit ");
  lcd.setCursor(0, 3);
  lcd.print(" ");
} // Endeklammer Initroutine
//------------- Ende Initroutine ---------------------------------
//--------------------------- Hauptschleife ----------------------
void loop()
{
  // Erst wenn die
  while (Serial1.available() > 0)
    if (gps.encode(Serial1.read()))
      displayInfo();
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while (true);
  }
}
// ------------------------Ende Hauptschleife ---------------------
// ----------------------- Funktion Ausgabe -----------------------
void displayInfo()
{
  Serial.print(F("Location: "));
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    lcd.setCursor(0, 1);
    lcd.print(gps.location.lng(), 6);
    lcd.setCursor(11, 1);
    lcd.print(gps.location.lat());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F(" Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
    lcd.setCursor(0, 3);
    lcd.print(gps.date.day());
    lcd.print(".");
    lcd.print(gps.date.month());
    lcd.print(".");
    lcd.print(gps.date.year());
    lcd.print(" ");
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
    lcd.setCursor(11, 3);
    lcd.print((gps.time.hour() + Offset));
    lcd.print(":");
    lcd.print(gps.time.minute());
    lcd.print(":");
    lcd.print(gps.time.second());
    lcd.print(" ");
  }
  else
  {
    Serial.print(F("INVALID"));
  }
  Serial.println();
}// Ende Display Info

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

Letzter Artikel ArduiTouch 1 - Funktionsweise und Verwendung des Touch-Screen
Neuer Artikel Screenshots mit Digispark auf Tastendruck

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