M5Core2 + GNSS Modul: GPS Logging im Taschenformat

a device with a screen on it

Vor einiger Zeit entdeckte ich den M5 Stack – für mich eine der spannendsten Innovationen im Bereich der Mikrocontroller. Das stapelbare System basiert auf einem ESP32 und vereint Gehäuse, Display, SD-Kartenleser, Vibrationsmotor, Lautsprecher, Mikrofon, Sensoren und fünf Tasten in einem unglaublich kompakten Format. All das wird zu einem fairen Preis angeboten und eröffnet nahezu endlose Möglichkeiten für kreative Projekte. Natürlich kann man dies mit nahezu jedem Microcontroller auch selbst zusammen bauen aber das ist eben immer „gebastel“ und mit dem M5Stack sieht das alles schön aus und ist äußerst kompakt. So kann man sich schnell praktische Dinge für den Alltag bauen.

Hardware

Für meinen ersten Test mit dem GNSS Modul verwende ich folgende Hardware
– M5Stack Core2
– GNSS-Modul mit Drucksensor, IMU und Magnetometer
– M5GO Battery Bottom2 (for Core2 only)

Code

#include <M5Core2.h>
#include <TinyGPS++.h>
#include <HardwareSerial.h>

TinyGPSPlus gps;
HardwareSerial SerialGPS(2);

// Positionsdefinitionen für Anzeige
const int xCenter = 160; // Mittige Ausrichtung der Werte
const int yLatitude = 50;
const int yLongitude = 90;
const int yAltitude = 130;
const int ySpeed = 170;
const int ySatellites = 210;

void setup() {
  M5.begin();
  Serial.begin(115200);
  SerialGPS.begin(38400, SERIAL_8N1, 13, 14); // RX=13, TX=14

  // Hintergrund und statische Texte auf dem Display
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK); // Weißer Text auf schwarzem Hintergrund

  displayStaticText();
}

void displayStaticText() {
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.print("GNSS Data");

  M5.Lcd.setCursor(10, yLatitude);
  M5.Lcd.print("Latitude");
  M5.Lcd.drawLine(10, yLatitude + 20, 310, yLatitude + 20, WHITE);

  M5.Lcd.setCursor(10, yLongitude);
  M5.Lcd.print("Longitude");
  M5.Lcd.drawLine(10, yLongitude + 20, 310, yLongitude + 20, WHITE);

  M5.Lcd.setCursor(10, yAltitude);
  M5.Lcd.print("Altitude");
  M5.Lcd.drawLine(10, yAltitude + 20, 310, yAltitude + 20, WHITE);

  M5.Lcd.setCursor(10, ySpeed);
  M5.Lcd.print("Speed");
  M5.Lcd.drawLine(10, ySpeed + 20, 310, ySpeed + 20, WHITE);

  M5.Lcd.setCursor(10, ySatellites);
  M5.Lcd.print("Satellites");
  M5.Lcd.drawLine(10, ySatellites + 20, 310, ySatellites + 20, WHITE);
}

void updateGPSData() {
  // Latitude
  M5.Lcd.setCursor(xCenter, yLatitude);
  M5.Lcd.fillRect(xCenter, yLatitude, 140, 20, BLACK); // Bereich löschen
  M5.Lcd.printf("%.6f", gps.location.lat());

  // Longitude
  M5.Lcd.setCursor(xCenter, yLongitude);
  M5.Lcd.fillRect(xCenter, yLongitude, 140, 20, BLACK);
  M5.Lcd.printf("%.6f", gps.location.lng());

  // Altitude
  M5.Lcd.setCursor(xCenter, yAltitude);
  M5.Lcd.fillRect(xCenter, yAltitude, 140, 20, BLACK);
  M5.Lcd.printf("%.2f m", gps.altitude.meters());

  // Speed
  M5.Lcd.setCursor(xCenter, ySpeed);
  M5.Lcd.fillRect(xCenter, ySpeed, 140, 20, BLACK);
  M5.Lcd.printf("%.2f km/h", gps.speed.kmph());

  // Satellites
  M5.Lcd.setCursor(xCenter, ySatellites);
  M5.Lcd.fillRect(xCenter, ySatellites, 140, 20, BLACK);
  M5.Lcd.printf("%d", gps.satellites.value());
}

void updateTime() {
  // Zeit anpassen und darstellen (UTC+1 für Winterzeit in Deutschland)
  int hour = gps.time.hour() + 1;
  if (hour >= 24) hour -= 24;

  M5.Lcd.setCursor(210, 10); // Position rechts oben
  M5.Lcd.fillRect(210, 10, 100, 20, BLACK); // Uhrzeitbereich leeren
  M5.Lcd.printf("%02d:%02d:%02d", hour, gps.time.minute(), gps.time.second());
}

void loop() {
  while (SerialGPS.available() > 0) {
    gps.encode(SerialGPS.read());

    if (gps.location.isUpdated()) {
      updateGPSData();
      updateTime();
      delay(1000); // Aktualisierungsintervall
    }
  }
}

Wie es funktioniert

Dieser Code zeigt GPS-Daten wie Breitengrad, Längengrad, Höhe, Geschwindigkeit, Satellitenanzahl und Uhrzeit auf dem M5Core2 Display an, wenn ein GNSS-Modul angeschlossen ist. Im Folgenden erkläre ich dir die einzelnen Bestandteile des Codes.

1. Bibliotheken und Objekte

#include <M5Core2.h> #include <TinyGPS++.h> #include <HardwareSerial.h> 

Hier werden die benötigten Bibliotheken eingebunden:

  • M5Core2.h für die M5Core2-Funktionen
  • TinyGPS++.h für die GPS-Datenverarbeitung
  • HardwareSerial.h für die serielle Kommunikation mit dem GNSS-Modul

Anschließend werden zwei Objekte erstellt:

TinyGPSPlus gps; HardwareSerial SerialGPS(2); 

Das gps Objekt verarbeitet die GPS-Daten, während SerialGPS einen seriellen Kanal für die GNSS-Kommunikation festlegt.

2. Positionsdefinitionen für das Display

const int xCenter = 160; const int yLatitude = 50; const int yLongitude = 90; const int yAltitude = 130; const int ySpeed = 170; const int ySatellites = 210; 

Diese Konstanten legen die Positionen auf dem Display fest, an denen die GPS-Werte (z. B. Latitude) erscheinen sollen.

3. setup() Funktion

void setup() { M5.begin(); Serial.begin(115200); SerialGPS.begin(38400, SERIAL_8N1, 13, 14); 

In setup() wird das M5Core2-Gerät und die serielle Kommunikation initialisiert. SerialGPS.begin legt die Baudrate und die RX- und TX-Pins des GNSS-Moduls fest. Danach wird das Display für die GPS-Anzeige vorbereitet:

M5.Lcd.fillScreen(BLACK); M5.Lcd.setTextColor(WHITE, BLACK); displayStaticText(); 

Hier wird der Hintergrund schwarz und der Text weiß eingestellt. displayStaticText() zeigt die statischen Texte für die GPS-Daten an.

4. displayStaticText() Funktion

void displayStaticText() { M5.Lcd.setTextSize(2); M5.Lcd.setCursor(10, 10); M5.Lcd.print("GNSS Data"); // ... 

Diese Funktion zeigt die Beschriftungen für Latitude, Longitude usw. an. Mit setCursor() wird die Textposition festgelegt, und print() gibt die Bezeichnungen aus. Unter jeder Bezeichnung wird eine Linie gezeichnet.

5. updateGPSData() Funktion

void updateGPSData() { M5.Lcd.setCursor(xCenter, yLatitude); M5.Lcd.fillRect(xCenter, yLatitude, 140, 20, BLACK); M5.Lcd.printf("%.6f", gps.location.lat()); // ... 

Diese Funktion aktualisiert die GPS-Daten (Breitengrad, Längengrad, Höhe, Geschwindigkeit und Satellitenanzahl) auf dem Display. fillRect() löscht den Bereich, bevor neue Werte angezeigt werden. printf() zeigt dann die neuen GPS-Werte an.

6. updateTime() Funktion

void updateTime() { int hour = gps.time.hour() + 1; if (hour >= 24) hour -= 24; M5.Lcd.setCursor(210, 10); M5.Lcd.fillRect(210, 10, 100, 20, BLACK); M5.Lcd.printf("%02d:%02d:%02d", hour, gps.time.minute(), gps.time.second()); } 

Diese Funktion zeigt die aktuelle Zeit auf dem Display an und berücksichtigt eine Zeitverschiebung von +1 Stunde für die Winterzeit in Deutschland.

7. loop() Funktion

void loop() { while (SerialGPS.available() > 0) { gps.encode(SerialGPS.read());
scss
Code kopieren
if (gps.location.isUpdated()) {
  updateGPSData();
  updateTime();
  delay(1000);
}
} } 

Die loop()-Funktion liest die GNSS-Daten und aktualisiert die Anzeige jede Sekunde. gps.encode() verarbeitet die Daten, und isUpdated() überprüft, ob neue Standortdaten vorliegen, bevor updateGPSData() und updateTime() aufgerufen werden.

Dieses Skript ist so aufgebaut, dass es alle aktuellen GPS-Daten regelmäßig auf dem M5Core2-Display anzeigt.

🤞 1x pro Monat unsere News, Tipps und Tutorials gebündelt direkt in dein Postfach!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.