Blog

M5Core2 + GNSS Modul: GPS Logging im Taschenformat

5/12/2025 2 Min. Lesezeit Mikrocontroller
M5Core2 + GNSS Modul: GPS Logging im Taschenformat

Einführung

Vor einiger Zeit entdeckte ich den M5Stack – 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 sich so etwas auch mit nahezu jedem Mikrocontroller selbst zusammenbauen, aber das ist dann eben immer Gebastel. Mit dem M5Stack sieht alles sauber aus und ist extrem kompakt. So lassen sich schnell praktische Dinge für den Alltag umsetzen.


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 (nur für Core2)

Code

#include 
#include 
#include 

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);
  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 (UTC+1 für Winterzeit in Deutschland)
  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());
}

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

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