switch case wird nicht angesprungen

Hallo Freunde :slight_smile:

ich habe ein Problem…

Nachdem ich mein Programm von Tasten - Bedienung auf Drehencoder mit einer Taste umgeschreieben habe, funktioniert der switch case in “if (Page == 1)” nicht mehr.

Über den Seriell Monitor sehe ich, dass das Programm in case0 landet.
Wenn ich die Taste drücke, wird ParameterNr um 1 erhöht, aber es wird nicht in case1 gesprungen.
Das gleiche passiert auch bei case2 bis case6.

Vorher hatte ich zwei ineinader verschachtelte switch cases benutzt, da ging zumindest das noch.

Wenn mehr informationen gebraucht werden, bitte bescheid sagen.

void loop() {

 if (Page == 0){
    //Ausgabe der Temperaturen auf dem Display
 
    DOG.string(30,0,font_8x8,"Uebersicht");
    DOG.string(1,1,font_6x8,"Temp. Puffer:");
    DOG.string(1,2,font_6x8,"Temp. Ruecklauf:");
    DOG.string(1,3,font_6x8,"Temp. Ofen:");
  
    dtostrf(Temperatur_1,4, 1, str);
    DOG.string(100,1,font_6x8, (str));

    dtostrf(Temperatur_2,4, 1, str);
    DOG.string(100,2,font_6x8, (str)); 

    dtostrf(Temperatur_3,4, 1, str);
    DOG.string(100,3,font_6x8, (str)); 

    DOG.string(1,4,font_6x8, Pumpe);
    DOG.string(1,5,font_6x8, Mischer);
    DOG.string(1,6,font_6x8, Kessel);

    long newPos = (myEnc.read()/2);
    if (Page != newPos)
    {
    DOG.clear();
    }
    Page = newPos;

    }

    
    if (Page == 1){
    DOG.string(30,0,font_8x8,"Parameter");
    
    DOG.string(1,1,font_6x8,"Mischer:");
    dtostrf(DeltaMischer_Auf,2, 0, str);
    DOG.string(50,1,font_6x8, (str));
    dtostrf(DeltaMischer_Zu,2, 0, str);
    DOG.string(80,1,font_6x8, (str));
    
    DOG.string(1,2,font_6x8,"Pumpe:  ");
    dtostrf(TempPumpe_Ein,2, 0, str);
    DOG.string(50,2,font_6x8, (str));
    dtostrf(TempPumpe_Aus,2, 0, str);
    DOG.string(80,2,font_6x8, (str));
    
    DOG.string(1,3,font_6x8,"Kessel: ");
    dtostrf(TempKessel_Ein,2, 0, str);
    DOG.string(50,3,font_6x8, (str));
    dtostrf(TempKessel_Aus,2, 0, str);
    DOG.string(80,3,font_6x8, (str));
    
   if (Taste_1 == LOW)
   {      
    if((millis() - alteZeit) > entprellZeit) { 
    // innerhalb der entprellZeit nichts machen
    DOG.clear();
    ParameterNr ++;
    alteZeit = millis(); // letzte Schaltzeit merken
    }      
   }

    if (ParameterNr > 6)
     {
      ParameterNr = 0;
     }
    Serial.println(ParameterNr);



    switch (ParameterNr){
      case 0:
      Serial.println("Case_0");
      DOG.string(95,3,font_6x8," ");
      long newPos = (myEnc.read()/2);
      if (Page != newPos)
      {
      DOG.clear();
      }
      Page = newPos;
      break;

      case 1:
      Serial.println("Case_1");
      DOG.string(65,1,font_6x8,"*");
      Val = (myEnc.read()/2);
      DeltaMischer_Auf = DeltaMischer_Auf + Val;
      if (Taste_1 <= 500)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      case 2:
      Serial.println("Case_2");
      DOG.string(65,1,font_6x8," ");
      DOG.string(95,1,font_6x8,"*");
      Val = (myEnc.read()/2);
      DeltaMischer_Zu = DeltaMischer_Zu + Val;
      if (Taste_1 == LOW)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      case 3:
      Serial.println("Case_3");
      DOG.string(95,1,font_6x8," ");
      DOG.string(65,2,font_6x8,"*");
       Val = (myEnc.read()/2);
      TempPumpe_Ein = TempPumpe_Ein + Val;
      if (Taste_1 == LOW)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      case 4:
      Serial.println("Case_4");
      DOG.string(65,2,font_6x8," ");
      DOG.string(95,2,font_6x8,"*");
       Val = (myEnc.read()/2);
      TempPumpe_Aus = TempPumpe_Aus + Val;
      if (Taste_1 == LOW)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      case 5:
      Serial.println("Case_5");
      DOG.string(95,2,font_6x8," ");
      DOG.string(65,3,font_6x8,"*");
      Val = (myEnc.read()/2);
      TempKessel_Ein = TempKessel_Ein + Val;
      if (Taste_1 == LOW)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      case 6:
      Serial.println("Case_6");
      DOG.string(65,3,font_6x8," ");
      DOG.string(95,3,font_6x8,"*");
       Val = (myEnc.read()/2);
      TempKessel_Aus = TempKessel_Aus + Val;
      if (Taste_1 == LOW)
      {      
       myEnc.write(0);
       Val = 0;
      }        
      break;

      default:
      Serial.println("default");
      break;
    }
    
    }
      
    if (Page == 2){
    DOG.string(30,0,font_8x8,"Leer");
    long newPos = (myEnc.read()/2);
    if (Page != newPos)
    {
    DOG.clear();
    }
    Page = newPos;
      
   }

    if ((Page >= 3) || (Page <= -1))
    {
    myEnc.write(0);
    Page = 0; 
    }

Hi

Das kann so nicht funktionieren - mindestens eine Klammer fehlt am Ende um loop() abzuschließen.
Habe mir Mal gestattet, zwei Dutzend sinnloser Leerzeilen zu entfernen und den Kram halbwegs leserlich einzurücken/Klammern zu verschieben

void loop() {

  if (Page == 0) {
    //Ausgabe der Temperaturen auf dem Display
    DOG.string(30, 0, font_8x8, "Uebersicht");
    DOG.string(1, 1, font_6x8, "Temp. Puffer:");
    DOG.string(1, 2, font_6x8, "Temp. Ruecklauf:");
    DOG.string(1, 3, font_6x8, "Temp. Ofen:");
    dtostrf(Temperatur_1, 4, 1, str);
    DOG.string(100, 1, font_6x8, (str));
    dtostrf(Temperatur_2, 4, 1, str);
    DOG.string(100, 2, font_6x8, (str));
    dtostrf(Temperatur_3, 4, 1, str);
    DOG.string(100, 3, font_6x8, (str));
    DOG.string(1, 4, font_6x8, Pumpe);
    DOG.string(1, 5, font_6x8, Mischer);
    DOG.string(1, 6, font_6x8, Kessel);
    long newPos = (myEnc.read() / 2);
    if (Page != newPos){
      DOG.clear();
    }
    Page = newPos;
  }

  if (Page == 1) {
    DOG.string(30, 0, font_8x8, "Parameter");
    DOG.string(1, 1, font_6x8, "Mischer:");
    dtostrf(DeltaMischer_Auf, 2, 0, str);
    DOG.string(50, 1, font_6x8, (str));
    dtostrf(DeltaMischer_Zu, 2, 0, str);
    DOG.string(80, 1, font_6x8, (str));
    DOG.string(1, 2, font_6x8, "Pumpe:  ");
    dtostrf(TempPumpe_Ein, 2, 0, str);
    DOG.string(50, 2, font_6x8, (str));
    dtostrf(TempPumpe_Aus, 2, 0, str);
    DOG.string(80, 2, font_6x8, (str));
    DOG.string(1, 3, font_6x8, "Kessel: ");
    dtostrf(TempKessel_Ein, 2, 0, str);
    DOG.string(50, 3, font_6x8, (str));
    dtostrf(TempKessel_Aus, 2, 0, str);
    DOG.string(80, 3, font_6x8, (str));
    if (Taste_1 == LOW){
      if ((millis() - alteZeit) > entprellZeit) {
        // innerhalb der entprellZeit nichts machen
        DOG.clear();
        ParameterNr ++;
        alteZeit = millis(); // letzte Schaltzeit merken
      }
    }
    if (ParameterNr > 6){
      ParameterNr = 0;
    }
    Serial.println(ParameterNr);

    switch (ParameterNr) {
      case 0:
        Serial.println("Case_0");
        DOG.string(95, 3, font_6x8, " ");
        long newPos = (myEnc.read() / 2);
        if (Page != newPos){
          DOG.clear();
        }
        Page = newPos;
        break;
      case 1:
        Serial.println("Case_1");
        DOG.string(65, 1, font_6x8, "*");
        Val = (myEnc.read() / 2);
        DeltaMischer_Auf = DeltaMischer_Auf + Val;
        if (Taste_1 <= 500){
          myEnc.write(0);
          Val = 0;
        }
        break;
      case 2:
        Serial.println("Case_2");
        DOG.string(65, 1, font_6x8, " ");
        DOG.string(95, 1, font_6x8, "*");
        Val = (myEnc.read() / 2);
        DeltaMischer_Zu = DeltaMischer_Zu + Val;
        if (Taste_1 == LOW){
          myEnc.write(0);
          Val = 0;
        }
        break;
      case 3:
        Serial.println("Case_3");
        DOG.string(95, 1, font_6x8, " ");
        DOG.string(65, 2, font_6x8, "*");
        Val = (myEnc.read() / 2);
        TempPumpe_Ein = TempPumpe_Ein + Val;
        if (Taste_1 == LOW){
          myEnc.write(0);
          Val = 0;
        }
        break;
      case 4:
        Serial.println("Case_4");
        DOG.string(65, 2, font_6x8, " ");
        DOG.string(95, 2, font_6x8, "*");
        Val = (myEnc.read() / 2);
        TempPumpe_Aus = TempPumpe_Aus + Val;
        if (Taste_1 == LOW){
          myEnc.write(0);
          Val = 0;
        }
        break;
      case 5:
        Serial.println("Case_5");
        DOG.string(95, 2, font_6x8, " ");
        DOG.string(65, 3, font_6x8, "*");
        Val = (myEnc.read() / 2);
        TempKessel_Ein = TempKessel_Ein + Val;
        if (Taste_1 == LOW){
          myEnc.write(0);
          Val = 0;
        }
        break;
      case 6:
        Serial.println("Case_6");
        DOG.string(65, 3, font_6x8, " ");
        DOG.string(95, 3, font_6x8, "*");
        Val = (myEnc.read() / 2);
        TempKessel_Aus = TempKessel_Aus + Val;
        if (Taste_1 == LOW){
          myEnc.write(0);
          Val = 0;
        }
        break;
      default:
        Serial.println("default");
        break;
    }
  }

  if (Page == 2) {
    DOG.string(30, 0, font_8x8, "Leer");
    long newPos = (myEnc.read() / 2);
    if (Page != newPos){
      DOG.clear();
    }
    Page = newPos;
  }

  if ((Page >= 3) || (Page <= -1)){
    myEnc.write(0);
    Page = 0;
  }
}

Ich sehe sehr viel doppelten Code - ALLES, was man mehr als 2x macht, lagert man in eine Funktion aus - macht den ganzen Kram übersichtlicher und ist einfacher zu warten.

Dann habe ich Dein Problem noch nicht ganz verstanden - WAS macht der Sketch, wenn Er denn was macht (so ist der Mist nämlich nicht kompilierbar) - und WAS ERWARTEST Du statt Dessen?

Kommentare hätten uns das Leben erleichtert und werden es Dir in spätestens zwei Wochen ebenfalls erleichtern, wenn Du irgend etwas ändern willst.
So siehst auch Du Da nämlich nicht mehr für lange durch!

MfG

Funktion ab > 2, nicht ab größer 1?

Gruß Tommy

ist eine Grauzone :wink:

postmaster-ino:
Hi

Das kann so nicht funktionieren - mindestens eine Klammer fehlt am Ende um loop() abzuschließen.
Habe mir Mal gestattet, zwei Dutzend sinnloser Leerzeilen zu entfernen und den Kram halbwegs leserlich einzurücken/Klammern zu verschieben

Ich sehe sehr viel doppelten Code - ALLES, was man mehr als 2x macht, lagert man in eine Funktion aus - macht den ganzen Kram übersichtlicher und ist einfacher zu warten.

Dann habe ich Dein Problem noch nicht ganz verstanden - WAS macht der Sketch, wenn Er denn was macht (so ist der Mist nämlich nicht kompilierbar) - und WAS ERWARTEST Du statt Dessen?

Kommentare hätten uns das Leben erleichtert und werden es Dir in spätestens zwei Wochen ebenfalls erleichtern, wenn Du irgend etwas ändern willst.
So siehst auch Du Da nämlich nicht mehr für lange durch!

MfG

Hallo und vielen Dank für die schnelle Antwort.
Das Projekt ist ja noch lange nicht fertig und im moment wäre ich froh wenn Das mit dem Display funktionioeren würde.

Die Klammer am Ende von loop() ist da, die kommt nur noch etwas weiter hinten im Code.
Ich wollte nur jedem ersparen noch mehr Leerzeilen (Code) zu durchforsten.

Viele Grüße

Hi

Was direkt Klarheit in die Sache bringt - Moment: Nicht.
Was soll der Sketch machen
Was macht Er statt Dessen

Bitte nicht wiederholen, was Du oben bereits geschrieben hast - du bekommst zu viele Befehle - wo werden Diese gesendet,
Kannst Du das Problem mit Serial.print() einkreisen, warum wird Das mehrfach aufgerufen?

MfG

Edit
Durchgestrichen bezog sich auf einen anderen Trhead ... sorry

Tommy56:
Funktion ab > 2, nicht ab größer 1?

Gruß Tommy

An welcher Stelle meinst du genau?

VlG

postmaster-ino:
Hi

Was direkt Klarheit in die Sache bringt - Moment: Nicht.
Was soll der Sketch machen
Was macht Er statt Dessen

Bitte nicht wiederholen, was Du oben bereits geschrieben hast - du bekommst zu viele Befehle - wo werden Diese gesendet,
Kannst Du das Problem mit Serial.print() einkreisen, warum wird Das mehrfach aufgerufen?

MfG

Dieser Teil des Sketches soll ein Display EA DOGL 128-6 ansteuern und mit einem Drehencoder (HW-040) will ich mich durch die Menüs navigieren.

If (Page==0) Zeigt auf dem Display 3 Temperatruren, welche über Sensoren an OnWire gemessen werden. Das funktioniert schon mal.

If (Page==1) Zeigt 6 Parameter an, welche ich durch drücken der Taste anwählen und mit drehen verändern will. Hinter jedem Parameter, wenn er angewählt wird, soll ein Sternchen erscheinen um zu markieren wo man sich gerade befindet.

If (Page==2) da steht im moment nur Leer drin.

Ich kann also zwischen den drei Ansichten wechseln, das funktioniert super. Nur wennn ich dann die Taste drücke, wird zwar case0 verlassen, aber in keinen weiteren case gesprungen.
Es erscheint auf dem Display hinter den Werten kein Stern und ich kann auch nichts durch drehen veändern.

Das case0 verlassen wird und ParameterNr bei jedem Tastendruck 1 hochzählt sehe ich über Print.serial()

Aber warum case1 bis case6 nicht angesprungen wird, ist mir ein Rätsel.

Hallo,

warum das nicht funktioniert ist klar, weil nachwievor Klammerfehler drin sind die die Logik des Programmablaufes verändern.
Dein switch-case ist im if (Page == 1) Block drin.

Trenne alles auf in

  • Encoderabfrage
  • Encoderwertverarbeitung
  • Displayausgabe

Mach daraus klare Funktionen die du alle in loop aufrufst.

Doc_Arduino:
Hallo,

warum das nicht funktioniert ist klar, weil nachwievor Klammerfehler drin sind die die Logik des Programmablaufes verändern.
Dein switch-case ist im if (Page == 1) Block drin.

Trenne alles auf in

  • Encoderabfrage
  • Encoderwertverarbeitung
  • Displayausgabe

Mach daraus klare Funktionen die du alle in loop aufrufst.

Hallo,

vielen Dank für deine Hilfe.
Aber im Momnet verstehe ich nicht ganz was du meinst.

Welche Klammerfehler? Die Klammer von void loop() kommt weiter unten. Das hier war nur ein Teil davon.

Was meinst du mit alles auftrennen? soll ich aus jeden case eine Funktion machen?
DOG.string(100,1,font_6x8, (str)); ruft jedesmal eine Funktion auf und übergibt Werte fur xy Position, Schriftart und was (str) dargestellt werden soll.
Daraus kann ich nicht (nur) eine Funktion machen. Das sieht nur nach mehrfach Aufruf aus, es wird aber jedes mal was anderes übertragen.

Gibt es denn noch eine einfachere Art ein LCD anzusteuern?

VlG

Hallo,

die fehlende loop Klammer interessiert bei der Betrachtung nicht.

Schau dir dein Rohgerüst genauer an.
Was steht in welchen { } Block?
Wann wird dein switch case aufgerufen?
Welches case wird im switch aufgerufen?
Stichwort: mehrfach if (Taste_1 == LOW) vs. if(Taste_1 <= 500)

void loop()
{

  if (Page == 0)
  {
    if (Page != newPos)
    {
    }
    Page = newPos;
  }


  if (Page == 1)
  {
    if (Taste_1 == LOW)
    {
      ParameterNr ++;
    }

    if (ParameterNr > 6)
    {
      ParameterNr = 0;
    }

    switch (ParameterNr)
    {
      case 0:

        if (Page != newPos)
        {
        }
        Page = newPos;
        break;

      case 1:

        if (Taste_1 <= 500)
        {
        }
        break;

      case 2:

        if (Taste_1 == LOW)
        {
        }
        break;

      case 3:
        if (Taste_1 == LOW)
        {
        }
        break;

      case 4:

        if (Taste_1 == LOW)
        {
        }
        break;

      case 5:
        if (Taste_1 == LOW)
        {
        }
        break;

      case 6:
        if (Taste_1 == LOW)
        {
        }
        break;

      default:
        break;
    }
  }

  if (Page == 2)
  {
    if (Page != newPos)
    {
    }
    Page = newPos;
  }

  if ((Page >= 3) || (Page <= -1))
  {
  }

}

Funktionen.
Man sollte klare abgetrennte Funktionen schreiben die nur das tun was der Name einem sagt.
Man sollte nicht alles in die loop werfen.

Doc_Arduino:
Hallo,

die fehlende loop Klammer interessiert bei der Betrachtung nicht.

Schau dir dein Rohgerüst genauer an.
Was steht in welchen { } Block?
Wann wird dein switch case aufgerufen?
Welches case wird im switch aufgerufen?
Stichwort: mehrfach if (Taste_1 == LOW) vs. if(Taste_1 <= 500)

Funktionen.
Man sollte klare abgetrennte Funktionen schreiben die nur das tun was der Name einem sagt.
Man sollte nicht alles in die loop werfen.

Gestern war es schon etwas spät :wink:
Da hatte ich doch glatt übersehen, dass da noch ein falsches if(Taste_1 <= 500) stand.

Nun habe ich erst mal alle switch-cases durch if (ParameterNr == 0){} bis if (ParameterNr == 6) {}
ersetzt und schon läuft es… Warum auch immer. Es heißt doch immer, um Menues zu gestalten bietet sich switch-case an?

Um alles andere kümmere ich mich die Tage.

Dann sag ich erst mal vielen Dank für die vielen Informationen und anregungen.

VlG