Ich versuch das mal zu beschreiben.
In meinem Fork ist die Erkennung der Eingaben komplett umgeschrieben um Fälle wie deinen schnell implementieren zu können.
Im Fall Rotary Encoder dreht sich alles um diese Funktion:
#if defined ROTARY_ENCODER
int8_t currentPosition = 0;
void RotEncSetVolume () {
int8_t newPosition = myEnc.read() / ROTARY_ENCODER_STEPS; //lesen der erkannten Impulse
if (newPosition != currentPosition) {
if (newPosition > currentPosition) {
#if defined ROTARY_ENCODER
Serial.println(F("encoder direction clockwise"));
#endif
myTrigger.volumeUp |= true;
} else if (newPosition < currentPosition) {
#if defined ROTARY_ENCODER
Serial.println(F("encoder direction conterclockwise"));
#endif
myTrigger.volumeDown |= true;
}
currentPosition = 0;
myEnc.write(currentPosition);
}
}
#endif
Das ist quasi 1:1 aus dem Beispiel der Bibliothek übernommen. Wichtig ist hier nur, dass man die Drehrichtung erkennt.
if (newPosition != currentPosition) -> rechts herum
else if (newPosition < currentPosition) -> links herum
und dann das setzt, was es bewirken soll. In meinem Fall die Lautstärke erhöhen oder verringern.
myTrigger.volumeUp |= true;
myTrigger.volumeDown |= true;
Ich arbeite hier mit globalen Variablen. Für jeden Befehl gibt es eine. Hier die Übersicht aller Befehle:
struct inputTrigger {
bool noTrigger;
bool pauseTrack;
bool next;
bool nextPlusTen;
bool previous;
bool previousPlusTen;
bool volumeUp;
bool volumeDown;
bool cancel;
bool adminMenu;
bool resetTrack;
bool shortCutNo [availableShortCuts]; //muss an letzter Stelle stehen bleiben!
};
Es gibt eine Struktur die zwei Mal instanziert wird
static inputTrigger myTrigger;
static inputTrigger myTriggerEnable;
Die erste Varaibale myTrigger
ist für das Triggern des Befehls. Die zweite myTriggerEnable
für die Flankenerkennung, damit beim Dauerdrücken nicht ständig der Befehl getriggert wird. Wenn man das will, muss die Abfrage des Triggers an entsprechender Stelle entfernt werden. Im Fall des Rotary Encoder aber irrelevant. Ich will nur das Prinzip etwas erläutern. Man muss hier nur wissen, welche Befehle es gibt und dass man Sie mit |= true
triggert.
Was musst du jetzt machen um die Libary zu ändern?
- eine Libary aussuchen, es gibt ein paar. -> z.B. https://github.com/mprograms/SimpleRotary
- Dir auf Github die Beispiele anschauen, wie der Encoder ausgelesen wird ->https://github.com/mprograms/SimpleRotary/blob/master/examples/rotate/rotate.ino
- Alles nötige in den Code einfügen.
Die obige Methode ist nur das reine Lesen und Auswerten des Encoders. Es müssen aber oft, Libaryspezifisch, die Encoder initalisiert werden. Man muss ein Objekt aufrufen oder eine Methode, um z.B. die Pins zu übergeben oder es muss noch eine Interrupt Rutine mit rein.
Die aktuelle Lib braucht folgende initalisierungen (im übrigen sind die alle mit #if defined ROTARY_ENCODER
eingeklammert und lassen sich danit auch gut suchen und finden)
#if defined ROTARY_ENCODER
// erstellen des Objekts myEnc, übergabe der verendeten Pins
Encoder myEnc(ROTARY_ENCODER_PIN_A, ROTARY_ENCODER_PIN_B);
#endif
Das steht fast ganz oben im Code.
Ich hoffe damit kommst du weiter.