I have question about programming the rotary encoder:
it works, but when I go from click to click it increases randomly by 2, 3 or 4 .
Is that normal? I was expecting it to go one by one, and negative on the left, positive on the right.
Here the code I used:
#include // Verwendung der Bibliothek
const int CLK = 6; // Definition der Pins. CLK an D6, DT an D5.
const int DT = 5;
const int SW = 2; // Der Switch wird mit Pin D2 Verbunden. ACHTUNG : Verwenden Sie einen interrupt-Pin!
long altePosition = -999; // Definition der "alten" Position (Diese fiktive alte Position wird benötigt, damit die aktuelle Position später im seriellen Monitor nur dann angezeigt wird, wenn wir den Rotary Head bewegen)
Encoder meinEncoder(DT,CLK); // An dieser Stelle wird ein neues Encoder Projekt erstellt. Dabei wird die Verbindung über die zuvor definierten Varibalen (DT und CLK) hergestellt.
void setup() // Beginn des Setups
{
Serial.begin(9600);
pinMode(SW, INPUT_PULLUP); // Hier wird der Interrupt installiert.
attachInterrupt(digitalPinToInterrupt(SW), Interrupt, CHANGE); // Sobald sich der Status (CHANGE) des Interrupt Pins (SW = D2) ändern, soll der Interrupt Befehl (onInterrupt)ausgeführt werden.
}
void loop()
{
long neuePosition = meinEncoder.read(); // Die "neue" Position des Encoders wird definiert. Dabei wird die aktuelle Position des Encoders über die Variable.Befehl() ausgelesen.
neuePosition=-neuePosition; //invert rotation direction
if (neuePosition != altePosition) // Sollte die neue Position ungleich der alten (-999) sein (und nur dann!!)...
{
altePosition = neuePosition;
Serial.println(neuePosition); // ...soll die aktuelle Position im seriellen Monitor ausgegeben werden.
}
}
void Interrupt() // Beginn des Interrupts. Wenn der Rotary Knopf betätigt wird, springt das Programm automatisch an diese Stelle. Nachdem...
{
Serial.println("Switch betaetigt"); //... das Signal ausgegeben wurde, wird das Programm fortgeführt.
}