Menüstruktur UTFT

Hallo, ich hab da ein kleines problem, und zwar, hab ich ein 3,2" Sainsmart Display (mit Touch) mit den UTFT lib angesteuert, und will mir jetzt ein Menü zusammenstellen, hab nur das problem wenn das menü gestartet ist, wartet der code ab bis was gedrückt wird, bzw ich ins untermenü gehe und da führt der code auch nur aus was ich da im bereich untermenü im code eingebe, meine frage ist jetzt wie kann ich das lösen dass das display immer im menü, bzw da bleibt wo man hindrückt und nebenbei immer die daten ausliest ohne den code anzuhalten.
Ist in mein fall blöd wenn der code immer anhält, da ich ein GSM modul habe, und DS1820 fühler usw…

//Buttons coordinates
//Menu 1
//Button HLT
int x11=20; int y11=20; int x12=150; int y12=100;
//Button Mash
int x21=180; int y21=20; int x22=300; int y22=100;
//Button Boiler
int x31=20; int y31=120; int x32=150; int y32=200;
//Button Menu
int x41=180; int y41=120; int x42=300; int y42=200;
//Button G
int x51=10; int y51=10; int x52=160; int y52=220;
//Button Back
int x61=200; int y61=130; int x62=300; int y62=220;
//Front led
int x71=20; int y71=40; int x72=170; int y72=100;
//Back led
int x81=20; int y81=130; int x82=170; int y82=190;




//########################################################################################
void Menu1()    // Hauptmenü
{
  myGLCD.clrScr(); // Clear the screen (black)
  myGLCD.setFont(BigFont);
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 255);
  //BUTTON Gpro
  button (x11,y11,x12,y12);  myGLCD.print("Temp",50,40);
                             myGLCD.print("Fuhler",36,60);
  //BUTTON Leds
  button (x21,y21,x22,y22);  myGLCD.print("Car",218,40);    
                             myGLCD.print("Data",210,60);
 //BUTTON Volto 
  button (x31,y31,x32,y32);  myGLCD.print("GPS",55,150);     
  //BUTTON Spare
  button (x41,y41,x42,y42);  myGLCD.print("Over",210,140); 
                             myGLCD.print("View",210,160);

  menu =1;  
 
  
}



void Menu2()    //HLT MENU
{
   myGLCD.clrScr(); // Clear the screen (black)
  myGLCD.print("HLT Temp:", 20, 20);
  myGLCD.setBackColor(0, 0, 255);
  button (x61,y61,x62,y62);   myGLCD.setFont(Inconsola);  myGLCD.print("Back",230,200);   
  menu =2;
  //myGLCD.printNumF(HLTtemp, 1, 200, 20);
}

void Menu3()    //Mash MENU
{

  myGLCD.clrScr(); // Clear the screen (black)
  //Front led
  button (x71,y71,x72,y72);
  myGLCD.setFont(Inconsola);    myGLCD.print("Front Led",30,70); 
  //Back Led
  button (x81,y81,x82,y82);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.setFont(BigFont);    myGLCD.print("Back Led",30,160);   
  button (x61,y61,x62,y62);   myGLCD.setFont(BigFont);  myGLCD.print("Back",230,200);   
  menu =3;

}

void Menu4()    // MENU 4
{

  myGLCD.clrScr(); // Clear the screen (black)
  myGLCD.setFont(BigFont);    myGLCD.print("Menu 4",30,70); 
  button (x61,y61,x62,y62);   myGLCD.setFont(BigFont);  myGLCD.print("Back",230,200);   
  menu =4;

}

void loop()

{
  while (true)
  {
    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();

      if (menu ==1)  
      {
        if ((y>=y11) && (y<=y12))  // Upper row
        {      
          if ((x>=x11) && (x<=x12))  // Button: Gpro
          {        
            waitForIt(x11,y11,x12,y12);
            menu =2;
            Menu2();
          }
          if ((x>=x21) && (x<=x22))  // Button: Leds
           {
             waitForIt(x21,y21,x22,y22);
            menu =3;
            Menu3();
           }
        }
        if ((y>=y31) && (y<=y32))  // Lower row
        {     
          if ((x>=x31) && (x<=x32))  // Button: Volto
           { 
             waitForIt(x31,y31,x32,y32);
           menu =4;
           Menu4();
             
           }
        }
      }

      if (menu==2)
      {
       
        myGLCD.setFont(BigFont);
              delay(300);
        if ((y>=y61) && (y<=y62))  // Button: Back
        {     
          if ((x>=x61) && (x<=x62))  // Button: Back
          {     
            waitForIt(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }

        }
      }
      if (menu==3)
      {
        delay(300);
        if ((y>=y61) && (y<=y62))  // Button: Back
        {     
          if ((x>=x61) && (x<=x62))  // Button: Back
          {     
            waitForIt(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }

        } 
      }
            if (menu==4)
      {
        if ((y>=y61) && (y<=y62))  // Button: Back
        {     
          if ((x>=x61) && (x<=x62))  // Button: Back
          {     
            waitForIt(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }

        } 
      }
    }
}

Du könntest die Funktion in der du bist zwischenspeichern und immer erneut aufrufen. Dieses Verfahren verwende ich in der LCDMenuLib. Alternative könntest du im Menu nur Variablen (siehe weiter unten unter Edit1) setzen und diese in der Loop Funktion abfragen und dann den Inhalt ausführen. Beide Varianten sind möglich.

Eine andere Möglichkeit wäre die Lib simpleThreads. In jedem Menupunkt schreibst du dann: - simpleThread_group_stop(thread_group_name); // alle alten menufunktionen stoppen - simpleThread_start(thread_name); // neue menufunktion starten

Dieses muss wie jetzt auch nur einmal ausgeführt werden. Der Menupunktinhalt befindet sich dann im Thread.

Thread => Funktion die Kontinuierlich nach x Millisekunden aufgerufen wird. Mehr dazu hier: http://forum.arduino.cc/index.php?topic=165552.0

Edit 1: Dann noch etwas zu deinem Code. Du benötigst in der Loop Funktion keine while(true) da die Loop Funktion ja schon in der Schleife läuft.

Du könntest die Loop Funktion auch wie folgt aufbauen:

void loop()

{
  //while (true)  diese Zeilen löschen
  //{
      //menu immer erneut aufrufen
      switch(menu) {
        case 1:
           Menu1();
           break;

        case 2:
           Menu2();
           break;

        case .....
           .....
         
         default:
            //menu nicht aktiv
            break;
        }

        //.. ab hier der restliche code der das touch display auswertet und neue menufunktionen startet

Werde ich gleich mal testen, danke für deine Antwort, mal schaun ob ich als NOOB das hinbekomme :-), Karma+

Jomelo,

Irgentwie komm ich mit deiner lib ned ganz klar, da ich diverse sachen immer durchlaufen lassen will, nicht nur wenn das display diese werte abfragt, zweks datalogger usw ist es eine große hilfe wenn die temperaturen und andere daten immer actualisiert werden, leider bin ich noch ein newbie in sachen programming -.- ,

Alle x Zeiteinheiten Dinge erledigen geht auch einfach in loop() mit millis(). Siehe hier: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Das ist da um eine LED blinken zu lassen. Aber genauso kann man da auch irgendeine Funktion aufrufen. Und man kann mehrere solche Abfragen hintereinander machen wenn man jeweils verschiedene Variablen für previousMillis und interval definiert.

Hat den Nachteil, dass wenn du in einem Menü (bzw. generell nicht in loop) bist, diese Abfrage nicht mehr gemacht wird.

Das reicht aber erst mal um was zum Laufen zu bekommen. Verbessern kann man es später immer noch.

Danke für die Antwort, Delay hab ich in mein sketch nimmer, nur is bei mir das problem wenn ich im Menü LCD bin wartet ja das touch screen das ich was drücke und hält somit den sketch auf, wenn ich das waitingfor wecklasse, is dann wieder so dass er immer in MainMenü reinspringt da der sketch immer von anfang an lädt.