Encoder beschleunigen

Hallo geehrte Community

Ich möchte meinem Rotary Encoder gerne mitteilen, dass, je schneller ich ihn drehe, er grössere Schritte ausführen soll.
Er gibt Zahlenwerte von 0 bis 127 aus. Bei einer Beschleunigung darf er gerne 3 bis 5 Schritte übergehen.

Es gibt da ein kleines Beispiel in den Libraries, aber das ist eingebunden als "isr" in einem Interrupt, und für mich absolut zu kompliziert, um es auch nur im Ansatz zu verstehen.

Ich wäre also sehr dankbar, wenn mir hier jemand das einfach erklären könnte...

Danke im Voraus

int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWert = 0;

void setup() {
 pinMode(14, INPUT);
 pinMode(15, INPUT);
 Serial.begin(31250);
}

void loop() {
 messungPin1 = digitalRead(14);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) 
 {if (digitalRead(15) == HIGH) 
 {if (encoderWert < 127) encoderWert++;} 
 else {if (encoderWert > 0) encoderWert--;}
 Serial.println (encoderWert);}
messungPin1Alt = messungPin1;}

Dann zähle doch die Zeit zwischen 2 Impulse und sage dann, dass er die aktuelle Position nicht um 1, sondern um 2 oder 3 Schritte je Impuls erhöhen soll.

Ich muss aber anmerken, dass ich die Drehencoder bisher immer ohne lib genutzt habe.

Jep, das klingt erstmal sehr logisch...
Danke

Hi

Naja - das Beispiel oben sieht nun ja auch nicht nach einer Lib aus.
Was ich auf jeden Fall ändern würde:

  • Pin-Nummer 14 als Variable im Header
  • Pin-Nummer 15 als Variable im Header
  • Maximal-Wert des Encoder per Variable im Header
  • Minimal-Wert des Encoder per Variable im Header

Da Du int benutzt - brauchst Du negative Werte?
Wenn Es eh nur bis 127 gehen soll, reicht byte als Typ, wenn negative Zahlen benötigt werden, char (-128...127), drüber int (-32368...32767), drüber long (... ne, Die müsste ich nachgucken - 2^31).
Dinge, Die konstant sind, auch so deklarieren - z.B. werden sich die Pin-Nummern und die Grenzen des Encoder-Wertes wohl während der Laufzeit nicht ändern.

const byte Encoder_Pin_A=14;
const byte Encoder_Pin_B=15;
const byte Endocer_Min=0;
const byte Encoder_Max=127;
char schrittweite;
byte encoderwert;
...
if (digitalRead(Encoder_Pin_A)==HIGH){
...
//je nach Drehrichtung schrittweite + oder -, je nach Geschwindigkeit auch größer als 1
...
if (schrittweite>0){ //positive/r Schritt/e
  encoderwert=min(encoderwert+schrittweite,Encoder_Max);  //das Minimum von neuem Schrittwert
}else if (schrittweite<0){
  encoderwert=max((char)encoderwert+schrittweite,Encoder_Min);
}
...

MfG

Nee, das ist mein eigener Sketch, keine Lib...

Aber was du da sagst, ist schon sehr interessant.
Ich brauche keine negativen Werte.
Richtig, weder Pin noch Grenzen werden sich ändern.
Danke, ich werde das gleich mal umsetzen in mein Sketch...

Danke vielmals