Encoder Menue , mit Button while starten & stopen

Hallo Arduino-Gemeinde, hab ein Problem im Prog. und bräuchte bitte Hilfe zur Lösung.

Ich möchte mit Hilfe eines Menüs ein UnterProgramm mit dem Mittel Button des Poti`s in eine Schleife Starten und wieder Stopen um wieder ins Menü zurück zukommen, leider hänge ich in der Schleife fest oder ich Rufe nur auf ohne Funktion komme aber ins Menü zurück.

Ich möchte aber das Unterprog. zum auslesen in Loop haben.
Schlage mich schon eine ganze Weile damit rum ohne auf die Lösung zukommen.

Den Sketch habe ich aus verschiedenen Teilen zusammen gebaut und läuft bis auf die Schleifen sache
mit den Stop und zurück.

Ich bin für jeden Tipp dankbar. Meine Programmierkenntnisse sind nur Amateurhaft also keine super komplizierten Fragen stellen bitte.

//  - MP---encoder----

#include <Wire.h>  
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>         
#define OLED_RESET 4                  
Adafruit_SSD1306 display(OLED_RESET);

#include <ClickEncoder.h>
#include <TimerOne.h>
const int fontSize = 18;

int ledPin = 12;



int menuitem = 1;
int frame = 1;
int page = 1;
int lastMenuItem = 1;


String menuItem1 = " Akku ";
String menuItem2 = " Spannung ";
String menuItem3 = " LED: An";

boolean Led1 = true;

int selectedDifficulty = 0;

boolean up = false;
boolean down = false;
boolean middle = false;
//int middle = false;

ClickEncoder *encoder;
int16_t last, value;


int analogInput1 = A1; 
int analogInput2 = A2;              


void setup() {
  pinMode(analogInput1, INPUT);  
  pinMode(analogInput2, INPUT);
  pinMode(12,OUTPUT);
  Led1An();
 
  
  encoder = new ClickEncoder(2,3,4);                 //--- Anschüsse Encoder---
  encoder->setAccelerationEnabled(false);
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.clearDisplay();
  display.begin();

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr); 
  last = encoder->getValue();
  
  
}

void loop() {
  
  
  drawMenu();
  readRotaryEncoder();
  
  ClickEncoder::Button b = encoder->getButton();    // Drehregler Anfang
   if (b != ClickEncoder::Open) {
   switch (b) {
      case ClickEncoder::Clicked:   // Mitte auf an
         middle=true;
        break;
        
   }  
 }
  if (up && page == 1 ) {                             // zum hoch  scroll
     
    up = false;                                       //--Hoch---
    if(menuitem==2 && frame ==2)
    {
      frame--;
    }

     if(menuitem==3 && frame ==3)
    {
      frame--;
    }
   
    lastMenuItem = menuitem;
    menuitem--;
    if (menuitem==0)
    {
      menuitem=1;
    } 
    
    }
  
  if (down && page == 1)  {                                 // zum  runter scroll
  
    down = false;                                          //---Runter---     
    if(menuitem==2 && lastMenuItem == 1)
    {
      frame ++;
    }
    
     else  if(menuitem==4 && lastMenuItem == 3 && frame!=2)
    {
      frame ++;
    }
    lastMenuItem = menuitem;
    menuitem++;  
    if (menuitem==4)                                       // ---abschluß immer einen mehr
    {
      menuitem--;
    }
  
  }
       //------------------------------Mittel Knopf drücken---------------------------------
  if (middle)                                              
  {
      middle = false;
   
 
    if(page == 1 && menuitem ==1)                           // ----Aufruf Prog. 1
    {
      while(middle = true)                                // --- Unter Prog. Start-----
      {
         spannung1();
         
     //  if(!digitalRead(middle)) break;
    //    delay(100);
      //  return;
         
         
        
      }
       }
                       
    else if(page == 1 && menuitem ==2)                       // ---- Aufruf Prog. 2
    {
       
         spannung2();  
   
   } 
     
          
    if (page == 1 && menuitem==3)                              //---- Auruf Led An/AUS (LED)
    {
      if (Led1) 
      {
        Led1 = false;
        menuItem3 = "Led: Aus";
        Led1Aus();
        }
      else 
      {
        Led1 = true; 
        menuItem3 = "Led: An";
        Led1An();
       }
    }

      else if (page == 1 && menuitem<=3) {
       page=2;
     }
       else if (page == 2) 
     {
      page=1; 
   } 
  }  
  }
  
  void drawMenu()
  {
    
  if (page ==1) 
  {    
    display.setTextSize(1);                                      // ----- Haupt Menü -----
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setCursor(25,5);
    display.print("Haupt - Menu");
    display.drawFastHLine(0,15,120,WHITE);
  
    if(menuitem == 1 && frame == 1)
    {   
      displayMenuItem(menuItem1, 20,true);
      displayMenuItem(menuItem2, 35,false);
      displayMenuItem(menuItem3, 50,false);
    }
    else if(menuitem == 2 && frame == 1)
    {
      displayMenuItem(menuItem1, 20,false);
      displayMenuItem(menuItem2, 35,true);
      displayMenuItem(menuItem3, 50,false);
    }
    else if(menuitem == 3 && frame == 1)
    {
      displayMenuItem(menuItem1, 20,false);
      displayMenuItem(menuItem2, 35,false);
      displayMenuItem(menuItem3, 50,true);           //--letzte Unten
    }
     else if(menuitem == 3 && frame == 2)
    {
      displayMenuItem(menuItem1, 20,false);
      displayMenuItem(menuItem2, 35,false);
      displayMenuItem(menuItem3, 50,true);
    }

      else if(menuitem == 2 && frame == 2)
    {
      displayMenuItem(menuItem1, 20,false);
      displayMenuItem(menuItem2, 35,true);
      displayMenuItem(menuItem3, 50,false);
    }
    else if(menuitem == 1 && frame == 2)
    {
      displayMenuItem(menuItem1, 20,true);
      displayMenuItem(menuItem2, 35,false);
      displayMenuItem(menuItem3, 50,false);              //---letzte Oben  
    }
    display.display();
  }
 
}
 
 void spannung1(){
 
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(4,0);
  display.setTextColor(WHITE);
  display.println("AKKU-Check"); // A1 Eingang
  display.setTextSize(1);
  display.setCursor(4,30);
  display.setTextColor(WHITE);
  display.setTextSize(3);
  display.setTextSize(3);
  int sensorValue = analogRead(analogInput1);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  display.print(voltage); display.println("V");
  display.display();
  display.clearDisplay();
  
 }

 
 void spannung2()
  {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(4,0);
  display.setTextColor(WHITE);
  display.println("Span-Check"); // A2 Eingang
  display.setTextSize(1);
  display.setCursor(4,30);
  display.setTextColor(WHITE);
  display.setTextSize(3);
  display.setTextSize(3);
  int sensorValue = analogRead(analogInput2);
  float voltage = sensorValue * (5.0 / 1023.0);
  display.print(voltage); display.println("V");
  display.display();
  display.clearDisplay();
  
 }
 
 

  
  void Led1An()                                     //------------------ Anschluß 12 An/AUS
  {
    digitalWrite(12,LOW);
  }
    void Led1Aus()
  {
    digitalWrite(12,HIGH);
  }

  void timerIsr() {
  encoder->service();
}



void displayStringMenuPage(String menuItem, String value)
{
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setCursor(15, 0);
    display.print(menuItem);
    display.drawFastHLine(0,10,83,WHITE);
    display.setCursor(5, 18);
    display.print("Wert");
    display.setTextSize(3);
    display.setCursor(10, 40);
    display.print(value);
    display.setTextSize(3);
    display.display();
}

void displayMenuItem(String item, int position, boolean selected)
{
    if(selected)
    {
      display.setTextColor(BLACK,WHITE);       //-------- Menue Pfeil Strich !!!
    }else
    {
      display.setTextColor(WHITE,BLACK);
    }
    display.setCursor(0, position);
    display.print("->"+item);
}




void readRotaryEncoder()                                 // -- entprell---
{
  value += encoder->getValue();
  
  if (value/2 > last) {
    last = value/2;
    down = true;
    delay(150);
  }else   if (value/2 < last) {
    last = value/2;
    up = true;
    delay(150);
  }
}

Ich möchte mit Hilfe eines Menüs ein UnterProgramm mit dem Mittel Button des Poti`s in eine Schleife Starten und wieder Stopen um wieder ins Menü zurück zukommen

Sorry, versteh ich nicht :confused:

Nimm das Menü

       //------------------------------Mittel Knopf drücken---------------------------------
  if (middle)                                              
  {
      middle = false;
  
 
    if(page == 1 && menuitem ==1)                           // ----Aufruf Prog. 1
    {
      while(middle = true)                                // --- Unter Prog. Start-----
      {
         spannung1();
        
    
        
        
      }
       }

Ich meinte diese Passage. Ich möcht doch nur wieder sauber aus diese While schleife kommen mit den Mittelknopf vom Encoder.
Gibt mir doch mal bitte ein Tipp ohne das Menü um zu ändern.
:frowning:

cloanto:
Ich meinte diese Passage. Ich möcht doch nur wieder sauber aus diese While schleife kommen mit den Mittelknopf vom Encoder.
Gibt mir doch mal bitte ein Tipp ohne das Menü um zu ändern.

Das ist sicher falsch

while(middle = true)

und sollte

while(middle == true)

heißen.

Und aus der Schleife kommst du raus, wenn du den Taster innerhalb der Schleife abfragst.

Danke für die Kopf-Nuss, werde es mal in Augenschein nehmen mit der Tasterabfrage.

Wird paar Tage dauern.

cloanto:
Danke für die Kopf-Nuss, werde es mal in Augenschein nehmen mit der Tasterabfrage.

Wird paar Tage dauern.

Alles klar und gerne.
Lass ruhig wieder was von dir lesen.

Und aus der Schleife kommst du raus, wenn du den Taster innerhalb der Schleife abfragst.

Ohne den Wust deines Sketches genau anzusehen weiß ich, dass es meist hilft, erst gar keine while Schleife zu verwenden. :confused:
Es steht doch in globalen Variablen, wo du in deinem Menü-System gerade bist, oder ? ...

Es geht ja nicht um das Menü, sondern um den Aufruf von " spannung1" diese soll in einer Schleife laufen für die

Echtzeit - Werte , dann mit den Mittel- Button durch drücken unterbrochen bzw. wieder ins Haupt-Menü zukommen.

Experimentiere schon seid einiger Zeit ohne Ergebnisse den Button in dieser Schleife ein zubauen, für die Abfrage zum rauskommen.

langsam Ratlos, wenn so was nicht funktioniert, dann bitte das Ansagen.

Gruß an Alle

Dein Ansatz ist wie gesagt falsch. Wieso while-Schleifen und irgendwo stehen bleiben? Du hast mit loop() schon eine Schleife. Du musst nur festlegen was dort je nach Zustand/Menüpunkt gemacht wird.

Na dann kläre mich doch mal auf, wo der Denkfehler ist , deshalb gibt es ja dieses Forum.

Ich frage hier mal nach einer kleinen Hilfe und es wird hier immer um den heißen Brei gesprochen.

Viele die mehr davon verstehen führen sich auf wie Gurus, nicht wie eine Hilfestellung .

Man muß ewig fragen und alles aus der Nase ziehen. Natürlich ist das nicht Einfach, aber wenn mich einer zu

einer HEIDENHAIN 530/426/355 fragt, gibt es auch Antworten und nicht naja & könnte usw.

Ist mir schon mehrmals bei anderen Fragenden auch aufgefallen die ich gelesen habe.

Hier soll ja nicht der ganze Code regeneriert werden , sondern der Fehler.

Danke für die Aufmerksamkeit.

Stichworte: Zustandsmaschine, Endlicher Automat, Finite State Machine

Du hast Variable die dir den aktuellen Zustand angibt (in dem Fall in welchem Menü du bist). Und je nachdem machst du was. Benutzereingaben können dann den Zustand ändern.
Das geschieht mit einfachen if-Abfragen, bzw. switch/case. Entsprechend muss man nirgendswo stehen bleiben. loop() läuft immer durch und wenn nichts zu tun ist macht man halt nichts.

Da kann man auch mehrere Automaten haben. Einen für das Menu und einen für das was sonst nicht ablaufen soll (z.B. Messungen).