Hallo liebe Community,
ich habe Probleme mit meinem Code. Ich habe einen Switch Case um mehrere Menü-Seiten auf einem vierzeiligen Display auszugeben. der Menu-Counter funktioniert, allerdings werden nur in den cases 1 und 2 Code ausgeführt. Ich konnte auch nach längerer Zeit keine Syntax-Fehler entdecken. Könnt ihr mir hier weiterhelfen?
Ich nutze die Ardion IDE in der Version 1.8.16 und folgende Bibliotheken:
- TinyGPS++ Releases · mikalhart/TinyGPSPlus · GitHub
- LiquidCrystal_I2C GitHub - johnrickman/LiquidCrystal_I2C: LiquidCrystal Arduino library for the DFRobot I2C LCD displays
Ausgeführt wird es auf einem Arduino Nano Klon.
Hier der Code:
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <Time.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display
TinyGPSPlus gps;
SoftwareSerial ss(4, 3);
float lat_dd;
String lat_SouthN;
float lat_d1;
int lat_d;
float lat_m1;
int lat_m;
float lat_s;
int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;
void setup()
{
Serial.begin(9600);
lcd.init(); // Initalisiere LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.clear();
ss.begin(9600);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
updateMenu();
}
void loop()
{
if (!digitalRead(downButton)) {
Serial.println("Button Down");
menu++;
Serial.println("Menu = ");
Serial.print(menu);
updateMenu();
delay(100);
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)) {
Serial.println("Button Up");
menu--;
Serial.println("Menu = ");
Serial.print(menu);
updateMenu();
delay(100);
while (!digitalRead(downButton));
}
if (!digitalRead(selectButton)) {
executeAction();
updateMenu();
delay(100);
while (!digitalRead(selectButton));
}
updateMenu();
//Serial.println("update Menu");
}
static void smartdelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
void updateMenu() {
switch (menu) {
case 0:
menu = 10;
break;
case 1:
Serial.println("Jetzt Case 1");
if (gps.location.isValid()) // erste Zeile Breitengrad
{
lat_dd = gps.location.lat();
if (lat_dd < 0)
lat_SouthN = "S";
else
lat_SouthN = "N";
lat_d1 = abs(lat_dd);
lat_d = lat_d1;
lat_m1 = (lat_d1 - lat_d) * 60;
lat_m = lat_m1;
lat_s = (lat_m1 - lat_m) * 60;
lcd.setCursor(0, 0);
lcd.print("Breite:");
lcd.print(lat_d);
lcd.print("\xDF");
lcd.print(lat_m);
lcd.print("'");
lcd.print(lat_s, 2);
lcd.print("\"");
lcd.print(lat_SouthN);
}
else
{
lcd.setCursor(0, 0);
lcd.print("Keine GPS-Daten ");
}
if (gps.location.isValid())
{
lcd.setCursor(0, 1);
lat_dd = gps.location.lng();
if (lat_dd < 0)
lat_SouthN = "W";
else
lat_SouthN = "O";
lat_d1 = abs(lat_dd);
lat_d = lat_d1;
lat_m1 = (lat_d1 - lat_d) * 60;
lat_m = lat_m1;
lat_s = (lat_m1 - lat_m) * 60;
lcd.print("L\xE1nge:");
// lcd.print("\xE1");
// lcd.print("nge:");
lcd.print(lat_d);
lcd.print("\xDF");
lcd.print(lat_m);
lcd.print("'");
lcd.print(lat_s, 2);
lcd.print("\"");
lcd.print(lat_SouthN);
}
else
{
lcd.setCursor(0, 1);
lcd.print("Keine GPS-Daten ");
}
if (gps.course.isValid() & gps.speed.isValid())
{
lcd.setCursor(0, 2);
lcd.print("Kurs:");
if (gps.course.deg() < 10) {
lcd.print("0");
}
if (gps.course.deg() < 100) {
lcd.print("0");
}
lcd.print(gps.course.deg(), 0);
lcd.print("\xDF GS:");
if (gps.speed.knots() < 10) {
lcd.print("0");
}
lcd.print(gps.speed.knots(), 1); // Speed in knots (double)
lcd.print("kn");
} else
{
lcd.setCursor(0, 2);
lcd.print("Keine Kursdaten ");
}
if (gps.date.isValid() & gps.time.isValid())
{
lcd.setCursor(0, 3);
lcd.print(gps.date.day());
lcd.print(".");
lcd.print(gps.date.month());
lcd.print(".");
lcd.print(gps.date.year());
lcd.print(" ");
if (gps.time.hour() < 10)
{
lcd.print("0");
}
lcd.print(gps.time.hour());
lcd.print(":");
if (gps.time.minute() < 10)
{
lcd.print("0");
lcd.print(gps.time.minute());
}
else
{
lcd.print(gps.time.minute());
}
lcd.print(" UTC");
}
else
{
lcd.setCursor(0, 3);
lcd.print("Keine Uhrzeit ");
}
smartdelay(5000);
break;
case 2:
Serial.println("Jetzt Case 2");
static const double WEIMAR_LAT = 50.983419, WEIMAR_LON = 11.327274;
// static const double WEIMAR_LAT = 43.737350, WEIMAR_LON = -15.018280;
double distanceToWeimar =
TinyGPSPlus::distanceBetween(
gps.location.lat(),
gps.location.lng(),
WEIMAR_LAT,
WEIMAR_LON);
double courseToWeimar =
TinyGPSPlus::courseTo(
gps.location.lat(),
gps.location.lng(),
WEIMAR_LAT,
WEIMAR_LON);
lcd.setCursor(0, 0);
lcd.print("Entfernung zu Weimar");
lcd.setCursor(0, 1);
if (distanceToWeimar / 1000 < 1000) {
lcd.print(" ");
}
if (distanceToWeimar / 1000 < 100) {
lcd.print(" ");
}
if (distanceToWeimar / 1000 < 10) {
lcd.print(" ");
}
lcd.print(distanceToWeimar / 1000, 1);
lcd.print("km Kurs: ");
if (courseToWeimar < 10) {
lcd.print("0");
}
if (courseToWeimar < 100) {
lcd.print("0");
}
lcd.print(courseToWeimar, 0);
lcd.print("\xDF");
lcd.setCursor(0, 2);
lcd.print("Zweiter Datenscreen ");
lcd.setCursor(0, 3);
lcd.print("1234");
smartdelay(5000);
break;
case 3:
Serial.println("Jetzt Case 3");
lcd.setCursor(0, 0);
lcd.print("== Einstellungen == ");
lcd.setCursor(0, 1);
lcd.print("> Zeitzone anpassen ");
lcd.setCursor(0, 1);
lcd.print(" Einstellung 2 ");
lcd.setCursor(0, 1);
lcd.print(" Einstellung 3 ");
break;
case 4:
Serial.println("Jetzt Case 4");
break;
case 5:
Serial.println("Jetzt Case 5");
break;
case 6:
menu = 5;
break;
case 10:
lcd.setCursor(0, 0);
lcd.print("aktuelle Zone: ");
lcd.setCursor(0, 1);
lcd.print("> Zeitzone anpassen ");
lcd.setCursor(0, 1);
lcd.print(" Einstellung 2 ");
lcd.setCursor(0, 1);
lcd.print(" Einstellung 3 ");
break;
}
}
void executeAction() {
switch (menu) {
case 1:
// action1();
break;
case 2:
//action2();
break;
case 3:
// menu = 10;
break;
}
}
Hier mein Serial Output fürs Debugging:
Jetzt Case 1
Jetzt Case 1
Jetzt Case 1
Jetzt Case 1
Jetzt Case 1
Button Down
Menu =
2Jetzt Case 2
Jetzt Case 2
Button Down
Menu =
3Button Down
Menu =
4Button Down
Menu =
5Button Down
Menu =
6Button Down
Menu =
7Button Down
Menu =
8Button Down
Menu =
9Button Down
Menu =
10Button Down
Menu =
11Button Up
Menu =
10Button Up
Menu =
9Button Up
Menu =
8Button Up
Menu =
7Button Up
Menu =
6Button Up
Menu =
5Button Up
Menu =
4Button Up
Menu =
3Button Up
Menu =
2Jetzt Case 2
Jetzt Case 2
Button Down
Menu =
3
Für ein paar Hinweise wäre ich echt dankbar
Falls ich noch weiter Infos vergessen habe, erbringe ich diese natürlich gerne.
Vielen Dank im Voraus
Friedemann