Menüstruktur

Hi,
mein Name ist Tobi und ich beschäftige mich gerade mit einer Menüstruktur für mein Porjekt. Nun hänge ich an einer Stelle.

Ich benutze einen Arduino Uno und ein LCD Shield mit 6 Buttons welche alle über A0 ausgegeben werden.

Das obermenü habe ich schon fertig mit der Switch Case funktion. Ich kann durch das Menü scrolen mit den hoch und runter knöpfen und kann die einzelnen Menüelemente auswählen.

Nun muss ich “nur” noch die Untermenüstruktur hinbekommen. Das Menü soll folgend aufgebaut sein:

Vergr:
14
20
44
50

EindrKörper

usw. Jedoch kriege ich es nicht hin meine VergrMenu Struktur in den Fall Vergr einzubauen ohne das mir immer Fehler unterlaufen. Hätte vielleicht jemand eine Idee oder könnte mir zumindest erklären wie die verschachtelte Switch Case funktion aufgebaut ist ?

Ich bedanke mich schon einmal im vorraus :slight_smile: und im Anhang findet ihr den Code

#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);  
 
int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;
int Zoom; 
char btn_push;
 
byte mainMenuPage = 1;
byte mainMenuPageOld = 1;
byte mainMenuTotal = 7;

byte VergrMenuPage = 1;
byte VergrMenuPageOld = 1;
byte VergrMenuTotal = 5;

 
void setup()
{
    lcd.begin(16,2);  //Initialize a 2x16 type LCD
 
    MainMenuDisplay();
    delay(1000);
}
void loop()
{
    btn_push = ReadKeypad();
   
    MainMenuBtn();
   
    if(btn_push == 'S')//enter selected menu
    {
        WaitBtnRelease();
        switch (mainMenuPage)
        
        {
            case 1:
              Vergr();
              break;
            case 2:
              Durchmesser1();
              break;
            case 3:
              Durchmesser2();
              break;
            case 4:
              EindringKoerper();
              break;
            case 5:
              PruefStufe();
              break;
            case 6:
              Beanspruchungsgr();
              break;
            case 7:
              Berechnen();
              break;
        }
 
          MainMenuDisplay();
          WaitBtnRelease();
    }   
 
 
    delay(10);
 
}//--------------- End of loop() loop ---------------------
void Vergr()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu B");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu B here
       
    }
}
void Durchmesser1()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu B");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu B here
       
    }
}
void Durchmesser2()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu C");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu C here
       
    }
}
void EindringKoerper()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu D");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu D here
       
    }
}
void PruefStufe()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu E");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu D here
       
    }
}
void Beanspruchungsgr()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu F");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu D here
       
    }
}
void Berechnen()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu G");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu D here
       
    }
}
void Vergroesserung()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu G");
   
    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu D here
       
    }
}

 
void MainMenuDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    switch (mainMenuPage)
    {
        case 1:
          lcd.clear();
          lcd.print(">Vergr");
          lcd.setCursor(0,1);
          lcd.print("Durchmesser1");
          break;
        case 2:
          lcd.clear();
          lcd.print("Vergr");
          lcd.setCursor(0,1);
          lcd.print(">Durchmesser1");
          break;
        case 3:
          lcd.clear();
          lcd.print("Durchmesser1");
          lcd.setCursor(0,1);
          lcd.print(">Durchmesser2");
          break;
        case 4:
          lcd.clear();
          lcd.print("Durchmesser2");
          lcd.setCursor(0,1);
          lcd.print(">EindrKoerper");
          break;
        case 5:
          lcd.clear();
          lcd.print("EindrKoerper");
          lcd.setCursor(0,1);
          lcd.print(">Pruefstufe");
          break;
        case 6:
          lcd.clear();
          lcd.print("Pruefstufe");
          lcd.setCursor(0,1);
          lcd.print(">Beanspruchungsgr");
          break;
        case 7:
          lcd.clear();
          lcd.print("Beanspruchungsgr");
          lcd.setCursor(0,1);
          lcd.print(">Berechnen");
          break;

    }
}

void VergrMenuDisplay()
{
    lcd.clear();
    lcd.setCursor(0,0);
    switch (VergrMenuPage)
    {
        case 9:
          lcd.clear();
          lcd.print(">14");
          lcd.setCursor(0,1);
          lcd.print("20");
          break;
        case 10:
          lcd.clear();
          lcd.print("20");
          lcd.setCursor(0,1);
          lcd.print(">44");
          break;
        case 11:
          lcd.clear();
          lcd.print("44");
          lcd.setCursor(0,1);
          lcd.print(">50");
          break;
        case 12:
          lcd.clear();
          lcd.print("50");
          lcd.setCursor(0,1);
          lcd.print(">70");
          break;
        case 13:
          lcd.clear();
          lcd.print("70");
          lcd.setCursor(0,1);
          lcd.print(">100");
          break;
        case 14:
          lcd.clear();
          lcd.print("100");
          lcd.setCursor(0,1);
          lcd.print(">140");
          break;      
        case 15:
          lcd.clear();
          lcd.print("140");
          lcd.setCursor(0,1);
          lcd.print(">200");
          break;

    }
}
 
void MainMenuBtn()
{
    WaitBtnRelease();
    if(btn_push == 'D')
    {
        mainMenuPage++;
        if(mainMenuPage > mainMenuTotal)
          mainMenuPage = mainMenuTotal;
    }
    else if(btn_push == 'U')
    {
        mainMenuPage--;
        if(mainMenuPage == 0)
          mainMenuPage = 1;    
    }
   
    if(mainMenuPage != mainMenuPageOld) //only update display when page change
    {
        MainMenuDisplay();
        mainMenuPageOld = mainMenuPage;
    }
}

void VergrMenuBtn()
{
    WaitBtnRelease();
    if(btn_push == 'D')
    {
        VergrMenuPage++;
        if(VergrMenuPage > VergrMenuTotal)
          VergrMenuPage = VergrMenuTotal;
    }
    else if(btn_push == 'U')
    {
        VergrMenuPage--;
        if(VergrMenuPage == 0)
          VergrMenuPage = 1;    
    }
   
    if(VergrMenuPage != VergrMenuPageOld) //only update display when page change
    {
        VergrMenuDisplay();
        VergrMenuPageOld = VergrMenuPage;
    }
}
 
char ReadKeypad()
{
  /* Keypad button analog Value
  no button pressed 1023
  select  741
  left    503
  down    326
  up      142
  right   0
  */
  keypad_value = analogRead(keypad_pin);
 
  if(keypad_value < 60)
    return 'R';
  else if(keypad_value < 200)
    return 'U';
  else if(keypad_value < 400)
    return 'D';
  else if(keypad_value < 600)
    return 'L';
  else if(keypad_value < 800)
    return 'S';
  else
    return 'N';
 
}
 
void WaitBtnRelease()
{
    while( analogRead(keypad_pin) < 800){}
}

Solche Konstruktionen sind für die Funktionalität tödlich, da sie den Sketch blockieren:

    while(ReadKeypad()!= 'L')
    {
        //Insert Task for Menu B here
       
    }

Warum verwendest Du nicht die Menü-Lib von Jomelo?

Gruß Tommy

Ich habe das Beispielprogramm auf meinen Arduino geladen und er wirft mir nur 4 Kryptische Zeichen aus und der Zweite ist am blinken

tobiibot:
Ich habe das Beispielprogramm auf meinen Arduino geladen und er wirft mir nur 4 Kryptische Zeichen aus und der Zweite ist am blinken

Welches Beispielprogramm ?
Das aus dem Link von Tommy ?

Hast du denn alles richtig konfiguriert ?

Was für kryptische Zeichen ?
Welcher "zweite" ist am Blinken ?

Bitte etwas mehr und ausführlichere Informationen.

Hi entschuldige bitte dass ich nicht mehr geantwortet habe aber ich habe nun selber herumprobiert und nun hat es funktioniert. (Ich bin eigentlich keiner der direkt jammert dass etwas nicht funktioniert).

Das Menü Funktioniert nun wie gewünscht. Nun habe ich jedoch eine weitere Frage auf die ich keinen Lösungsansatz habe. Wenn ich nun zum Beispiel in einem Menüpunkt meine vergrößerung auswähle, wie kann ich dann diesen Wert als Zahl benutzen ? und wo füge ich meinen restlichen Code für die Formeln etc ein ?
Müsste ich dafür einen neuen TAB anlegen oder kann ich dies mit auf die erste Seite Schreiben ?

Wie sollen wir darauf antworten können, wenn Du uns den aktuellen Stand Deines Codes vorenthälst?

Du kannst Teile des Codes in Funktionen packen, das erhöht die Übersichtlichkeit. Diese kannst Du bei Bedarf auch in extra Tabs auslagern. Da warten aber unter Umständen wieder ein paar Stolpersteine.

Gruß Tommy

Ich habe das "Beispielprogramm" von Jomelo genommen und zwar das LCDML_i2c_display dort bestehen ja schon einige Tabs. In diesem habe ich das Menü auf meine Wünsche angepasst. Ich weiß leider nicht wie ich einne Programmcode mit mehreren Tabs posten kann.

Indem Du 2 code-Abschnitte nutzt und wenn es zu lang wird, halt 2 Beiträge.

Gruß Tommy