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