[Mikrocontroller]

M5Core2 + GNSS Modul: GPS Logging im Taschenformat

/m5core2-gnss-modul-gps-logging-im-taschenformat
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

```cpp

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);
}

}
}

Anzeige

/comments0 Einträge

Kommentare

> NO_COMMENTS_FOUND

> INITIATE_COMMENT_PROTOCOL

MARKDOWN_SUPPORT: ENABLED
CHARS: 0