Switch Case - nicht alle Cases funktionieren

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:

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 :slight_smile: Falls ich noch weiter Infos vergessen habe, erbringe ich diese natürlich gerne.

Vielen Dank im Voraus
Friedemann

verschieb mal deine Variablen Deklarationen aus Case 2 vor den switch case.

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

danach kannst du bis ins Menu 5 springen.

Quelle musst dir selber suchen, nur so mal aufs erste:

1 Like

Super, vielen Dank! Es hat jetzt sogar gereicht diesem Case geschweifte Klammern zu geben.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.