Code: Einfaches Menü mit Button



  • Re: Mister T - DIY Zitronenteemaschine

    Ich dachte mir, ich zeige kurz, auf welchem Prinzip ich das Auswahlmenü meines Mister T’s programmiert habe.

    Das gezeigte funktioniert nicht nur auf einem D1 Mini sondern auch auf anderen Boards.

    Was verwende ich?

    Als Input dient bei mir jetzt einfach ein Kabel, weil ich kein Bock hab ein Setup aufzubauen. Das Kabel kann aber genauso gut ein Taster / Schalter / Mikroschalter / Bewegungsmelder oder was auch immer sein. Irgendwas, das einen Input liefert, der das Menü dazu bringt, einen Punkt weiter zu springen.

    Beschreibung

    Auf Knopfdruck wird ein Punkt im Menu ausgewählt. Wenn die max. Anzahl der Menü-Punkte erreicht ist, springt das Menü wieder auf den ersten Punkt zurück.


    Menü-Code-Funktion

    Fügt diesen Code-Block am am Ende eures Programms ein.
    Das ist alles vordefiniert und muss von euch nicht bearbeitet werden.

    //VARIABLEN FÜR DAS MENÜ
    int button_state;
    int button_pressed = 0;
      
    int menu_selected = 0;
    //VARIABLEN FÜR DAS MENÜ
    
    
    int menu(int pin){
    
      button_state = digitalRead(pin);
    
      if(button_state == 1){
        if(button_pressed == 0){
          //Serial.println("Button wurde gedrückt.");
          button_pressed = 1;
          if(menu_selected == 5){
            menu_selected = 1;
          }else{
            menu_selected += 1; 
          }
          //Serial.println(menu_selected); 
          delay(50);
        }   
      }
    
      if(button_state == 0){
        if(button_pressed == 1){
          //Serial.println("Button wurde losgelassen.");
          button_pressed = 0;
          delay(50);
        }   
      }
    
      return menu_selected;
    }
    

    Anwendung in deinem Projekt

    Nachdem ihr den Code-Block von oben in euer Programm eingefügt habt, könnt ihr das Menü wie folgt anwenden und dementsprechend anpassen.

    int vom_button = 15; //D8
    int menu_max = 5;
    
    void loop() {
    
      if(menu(vom_button) == 1){
        // Der erste Punkt ist ausgewählt.
    
        // Solange der der Menüpunkt ausgewählt ist, wird der
        // Inhalt in Dauerschleife ausgegeben.
        Serial.println("Menuepunkt: 1");
      }
    
      if(menu(vom_button) == 2){
        // Der zweite Punkt ist ausgewählt.
         Serial.println("Menuepunkt: 2");
      }
    
      if(menu(vom_button) == 3){
        // Der dritte Punkt ist ausgewählt.
         Serial.println("Menuepunkt: 3");
      }
    
    }
    

    Erklärung

    // Input-Pin, der das Menü steuert
    int vom_button = 15;
    
    // Anzahl der auswählbaren Punkte im Menü
    int menu_max = 5;
    
    // Gibt den aktuellen Menü-Punkt zurück
    menu(vom_button)
    
    // Gibt den Menü-Punkt im seriellen Monitor aus
    Serial.println(menu(vom_button));
    
    // Wenn Menü vom_button == 4, dann 
    
    if(menu(vom_button) == 4){
    
        // ...befinden wir uns im Menüpunkt 4
    
        Serial.println("Menuepunkt: 4");
    
      }
    

    Keine Ahnung ob meine Erklärung jetzt verständlich is … 🤣. Schreibt mir eure Anregungen und Verbesserungen gerne als Antwort.

    PS: Wenn man ein Wort 50x hintereiander sagt, dann hört es sich echt komisch an.

    Menü, menü, menü, menü, menü, … 👌

    FAQ

    (Die keiner gefragt hat.)

    Q: Wie verhindere ich, dass die Aktion in Dauerschleife ausgeführt wird?

    Füg’ ganz oben in deinem Programm eine neue Variable ein. Diese Variable speichert, welcher Menüpunkt gerade aktiv ist.

    int menu_active = 0;
    

    Cancle die Aktion aus, sobald sie einmal ausgeführt wurde:

    if(menu(vom_button) == 1){
    
        if(menu_active != 1){
         
          Serial.println("Menuepunkt: 1"); 
    
          // Diese Zeile verhindert das erneute Ausführen, ...
          menu_active = 1;
          // ... da menu_active jetzt = 1 ist.
        } 
    
      }