Anfänger will Drehgeber auslesen

hansheiri:
Hardware wird nicht das Problem sein.
Im Moment habe ich nur kein Plan wie das Programm aussehen soll.

Als erstes einfach mal klarmachen, was läuft.

Die zwei Ausgänge des Drehgebers, die an zwei Eingänge des Arduino angeschlossen werden, können vier Zustände annehmen. Beim Gray-Code ändert sich von einem zum nächsten Zustand immer nur ein einziges Bit. Es gibt zwei Bitfolgen, die möglich sind:

Bitfolge 1:
00
01
11
10
00

Bitfolge 2:
00
10
11
01
00

Diese beiden Bitfolgen stehen für "links" bzw. "rechts" Impulse, wenn sie in dieser Abfolge erfolgen.

D.h. Du brauchst immer "alter Zustand" und "neuer Zustand", um zu sehen, was für ein Impuls vorliegt.

Ich nehme nun mal an, Bitfolge1 stehe für links und Bitfolge2 für rechts (da braucht man ggf. nur die beiden Eingänge vertauschen), dann entsprechen folgende Änderungen:
00-01 ==> links
01-11 ==> links
11-10 ==> links
10-00 ==> links

00-10 ==> rechts
10-11 ==> rechts
11-01 ==> rechts
01-00 ==> rechts

Falls keine Änderung stattfindet, hat sich nichts gedreht, falls andere Bitübergänge stattfinden, liegt ein Fehler vor, z.B. weil Änderungen an den Eingängen "verpaßt" wurden.

Diese Logik zur Encoder-Abfrage in eine Funktion gegossen sähe bei mir beispielsweise so aus:

// Pins für die Eingänge am Arduino festlegen
#define ENCODER_A 2
#define ENCODER_B 3

int encoderImpuls()
{
  static byte state=0;
  state= state<<2;    // Bits um zwei Stellen nach links schieben
  if (digitalRead(ENCODER_A)) bitSet(state,1);  // Eingang A abfragen und Bit1 setzen
  if (digitalRead(ENCODER_B)) bitSet(state,0);  // Eingang B abfragen und Bit0 setzen
  state= state & 0xF;   // Nur die unteren 4 Bits behalten
  switch(state)
  {
    case 0b0000:
    case 0b0101:
    case 0b1010:
    case 0b1111: return 0; // keine Änderung an den Eingängen
    case 0b0001:
    case 0b0111:
    case 0b1110:
    case 0b1000: return -1; // links Impuls an den Eingängen
    case 0b0010:
    case 0b1011:
    case 0b1101:
    case 0b0100: return 1; // rechts Impuls an den Eingängen
    default: return 9999;  // Error (z.B. wegen verpaßter Impulse)
  }  
}

Diese Funktion einfach in einer engen Schleife ständig aufrufen und Impulse zusammenzählen. Über den Stand des millis() Zählers den Stillstand der Spindel erkennen und jeweils beim Stillstand das Display aktualisieren.

Sag Bescheid, wenn Du nicht nur eine Funktion sondern ein ganzes Beispielprogramm brauchst.