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.
Schreibe einen Kommentar