Man nehme die library NewEncoder und konfiguriere beim Erzeugen der Instanz die untere und obere Grenze der Werte und den Startwert.
NewEncoder encoder(2, 3, -20, 20, 0, FULL_PULSE);
2,3 IO-Pins,
-20,20 unterer und oberer Grenzwert
0 Startwert
FULL_PULSE oder HALF_PULSE je nach encoder-Bauart
NewEncoder funktioniert sehr zuverlässig selbst mit prellendem mechanischen Encodern
Democode:
#include "Arduino.h"
#include "NewEncoder.h"
// Pins 2 and 3 should work for many processors, including Uno. See README for meaning of constructor arguments.
// Use FULL_PULSE for encoders that produce one complete quadrature pulse per detnet, such as: https://www.adafruit.com/product/377
// Use HALF_PULSE for endoders that produce one complete quadrature pulse for every two detents, such as: https://www.mouser.com/ProductDetail/alps/ec11e15244g1/?qs=YMSFtX0bdJDiV4LBO61anw==&countrycode=US¤cycode=USD
NewEncoder encoder(2, 3, -20, 20, 0, FULL_PULSE);
int16_t prevEncoderValue;
void setup() {
NewEncoder::EncoderState state;
Serial.begin(115200);
delay(2000);
Serial.println("Starting");
if (!encoder.begin()) {
Serial.println("Encoder Failed to Start. Check pin assignments and available interrupts. Aborting.");
while (1) {
yield();
}
} else {
encoder.getState(state);
Serial.print("Encoder Successfully Started at value = ");
prevEncoderValue = state.currentValue;
Serial.println(prevEncoderValue);
}
}
void loop() {
int16_t currentValue;
NewEncoder::EncoderState currentEncoderState;
if (encoder.getState(currentEncoderState)) {
Serial.print("Encoder: ");
currentValue = currentEncoderState.currentValue;
if (currentValue != prevEncoderValue) {
Serial.println(currentValue);
prevEncoderValue = currentValue;
} else
switch (currentEncoderState.currentClick) {
case NewEncoder::UpClick:
Serial.println("at upper limit.");
break;
case NewEncoder::DownClick:
Serial.println("at lower limit.");
break;
default:
break;
}
}
}
ich möchte jetzt zunächst einmal erreichen, dass der Wert (0-123) auf dem Display vernünftig wählbar ist bzw. sich gleichmäßig ändert. Aktuell habe ich folgendes Problem:
Drehe ich den Encoder beispielsweise nach rechts, ist der Wert 123 ziemlich schnell erreicht (2-3 Umdrehungen). Drehe ich dann wieder nach links, ist der Wert nach 2-3 Umdrehungen bei ca.100 d.h. er sinkt sehr sehr langsam. Außerdem kommt es vor, dass der Wert steigt wenn ich mit dem Encoder nach links drehe, obwohl er zuvor auch gestiegen ist, wenn ich nach rechts gedreht habe (D.h. der Wert steigt beim Drehen in beide Richtungen!?).
Mir ist bereits bewusst, dass dies nur auftritt, wenn das LCD-Display angeschlossen ist. (Ohne Display werden im Seriellen Monitor die Werte genauso angezeigt und sind durch drehen justierbar, wie ich es möchte).
Habt ihr Ideen woran das liegen könnte? Habe euch den Code angehängt.
my_xy_projekt:
Was hesist das?
Nicht angeschlossen UND die Lib deaktiviert oder Display abgenommen bei AKTIVER Lib?
Bitte für BEIDE Zustände sagen, wo die Reise hingeht.
Die Lib habe ich nicht deaktiviert/ gelöscht. Das einzige was ich mit // herausgenommen habe, waren die "print"-Befehle für das Display. Dann ändern sich die Zahlen im Seriellen Monitor optimal.
Also wenn ich die Lib lösche, funktioniert es auch. Ich muss nur diesen Part des Codes deaktivieren: