Fragen zu Encoder

Hallo zusammen,

ich habe in meinem Projekt einen Encoder mit dem ich z.B in einem Menü scrollen kann (Anzeige an einem Display). Das mit dem Encoder auswerten klappt eigentlich wunderbar, aber das Problem ist, wenn ich schnell am Encoder drehe stimmt die Reihenfolge der Anzeige nicht mehr.

Gebe ich einen Wert am Monitor aus geht das auch wunderbar. Kann schnell drehen und der Wert ändert sich immer richtig.

Wie kann man dieses Problem lösen?

Karlsa:
Wie kann man dieses Problem lösen?

Softwareseitig. Vermutlich... :wink:

Ohne Blick auf den Code, ggf. ein Schaltplan dazu, lässt sich auf deine Frage keine konkrete Antwort finden.

Das ist mein Code zum Auswerten des Encoders:

  if (digitalRead(A)==HIGH && digitalRead(B)==LOW && speicherA==0 && speicherB==0)
  {
    auswahl++;
    auswahl = auswahl % 4;
    speicherA=1;
    speicherB=0;
  }
  else if (digitalRead(A)==HIGH && digitalRead(B)==HIGH && speicherA==1 && speicherB==0)
  {
    auswahl++;
    auswahl = auswahl % 4;
    speicherA=1;
    speicherB=1;
  }
  else if (digitalRead(A)==LOW && digitalRead(B)==HIGH && speicherA==1 && speicherB==1 )
  {
    auswahl++;
    auswahl = auswahl % 4;
    speicherA=0;
    speicherB=1;
  }
  else if (digitalRead(A)==LOW && digitalRead(B)==LOW && speicherA==0 && speicherB==1 )
  {
    auswahl++;
    auswahl = auswahl % 4;
    speicherA=0;
    speicherB=0;
  }
  
 else if (digitalRead(A)==LOW && digitalRead(B)==HIGH && speicherA==0 && speicherB==0)
  {
    auswahl--;
    auswahl = auswahl % 4;
    speicherA=0;
    speicherB=1;
  }
  else if (digitalRead(A)==HIGH && digitalRead(B)==HIGH && speicherA==0 && speicherB==1)
  {
    auswahl--;
    auswahl = auswahl % 4;
    speicherA=1;
    speicherB=1;
  }
  else if (digitalRead(A)==HIGH && digitalRead(B)==LOW && speicherA==1 && speicherB==1)
  {
    auswahl--;
    auswahl = auswahl % 4;
    speicherA=1;
    speicherB=0;
  }
  else if (digitalRead(A)==LOW && digitalRead(B)==LOW && speicherA==1 && speicherB==0)
  {
    auswahl--;
    auswahl = auswahl % 4;
    speicherA=0;
    speicherB=0;
  }

Und bei einer Änderung von "auswahl" soll das auf dem Display passieren:

  if (auswahl == 0)
  {
    Ausgabe(0x01, 0x02, "->");
    AusgabeLoeschen(0x01, 0x0B, "->");
    AusgabeLoeschen(0x10, 0x0B, "->");
  }
  else if (auswahl == 1)
  {
    Ausgabe(0x01, 0x0B, "->");
    AusgabeLoeschen(0x01, 0x02, "->");
    AusgabeLoeschen(0x07, 0x0B, "->");
  }
  else if (auswahl == 2)
  {
    Ausgabe(0x07, 0x0B, "->");
    AusgabeLoeschen(0x01, 0x0B, "->");
    AusgabeLoeschen(0x10, 0x0B, "->");
  } 
  else if (auswahl == 3)
  {
    Ausgabe(0x10, 0x0B, "->");
    AusgabeLoeschen(0x07, 0x0B, "->");
    AusgabeLoeschen(0x01, 0x02, "->");
  }

Und das machen die Funktionen "Ausgabe" und "AusgabeLoeschen":

void Ausgabe(int y, int x, char* text)
{
  Serial1.write(0x73);
  Serial1.write(y); 
  Serial1.write(x); 
  Serial1.write(0x03); 
  Serial1.write(zero);
  Serial1.write(zero);
  Serial1.write(text);
  Serial1.write(zero);
  delay(50);
}
  
void AusgabeLoeschen(int y, int x, char* zeichen)
{
  Serial1.write(0x73);
  Serial1.write(y); 
  Serial1.write(x); 
  Serial1.write(0x03); 
  Serial1.write(0xFF);
  Serial1.write(0xFF);
  Serial1.write(zeichen);
  Serial1.write(zero);
  delay(50);
}