Auswertung eines Drehreglers

Hallo,

ich möchte ein Menü auf einem LCD-Display 16x2 steuern. Dazu habe ich einen Drehregler HW-040 an meinem Nano angeschlossen ( CLK an D2, DT an D3 und SW an D4).

Zum üben habe ich für die Menüs "LCDMenuLib2" das Beispiel "00 Beginners" gestartet. Funktioniert soweit gut.
Für den Drehregler wird dort auf die Installation von einer Bibliothek verwiesen:

Nun reagiert das Menü auf genau jeden 2. Drehimpuls am Drehgeber. Das heißt, ich muss immer 2 mal drehen, um einen Menüpunkt weiter zu kommen. Sowohl links- als auch rechtsrum.

Ist das ein Softwareproblem oder was mache ich falsch?

Vielen Dank
Thomas

Hi

Die Encoder-Lib sollte pro Raste 4 Impulse liefern.
Finde erst Mal heraus, ob Du pro Raste +2 oder +4 heraus bekommst.

MfG

PS: LiquidCrystalDisplay-Display ... nö, LC-Display oder LCD
Das Ding ist ein Dreh-Encoder, Quadratur-Encoder oder Drehgeber - KEIN -Regler.

Da musste ich schnell mal ein Programm basteln.

Der Dreh-Encoder(!) ändert pro Raste genau 1 mal seinen Zustand an CLK und DT.

Von 1 auf 0 oder 0 auf 1. Die Drehrichtung entscheidet, ob CLK oder DT zuerst ändert.

Die Encoder-Lib liefert:

bei Dreh im Uhrzeigersinn: 0 -1 -2
weiterer Dreh im Uhrzeigersinn: -2 -3 1 0

entgegen Uhrzeigersinn: 0 1 2
weiterer Dreh entgegen Uhrzeigersinn: 2 3 -1 0

Hi

Das ist (für mich) aber ungewöhnlich - SO hätte ich mir Das Mal gewünscht :slight_smile:
Meine Dreh-Encoder strampeln alle 4 Flanken durch von Raste zu Raste.
(Maschinen-Encoder, also ohne Raste, oder Welche von ALPS, Quelle jeweils eBay)

Dann ist's bei Dir ggf. sinnvoll, die Auswertung händisch vorzunehmen.
Du hast dann ja
00
01
11
10
als Bitmuster. Wenn man das hintere Bit 'umdreht', wenn das Vordere gesetzt ist, kommt
00
01
10
11
heraus, was genau der Zahlenreihenfolge 0 1 2 3 entspricht.
Man kann auch das alte Bitmuster um 2 Bit verschieben und das Neue reinkopieren.
00 00 Nix
00 01 PLUS
00 10 MINUS
00 11 ERROR (beide Bits haben sich geändert - geht nicht)
01 00 MINUS
01 01 Nix
01 10 ERROR
01 11 PLUS
10 00 PLUS
10 01 ERROR
10 10 Nix
10 11 MINUS
11 00 ERROR
11 01 MINUS
11 10 PLUS
11 11 Nix
Das sind die 16 Fälle, Die auftreten könnten.
Wenn Du schneller abfragst, als drehst, fallen die ERROR-Fälle raus (da dafür 2 Rasten zwischen den Auslesungen nötig sind)
Eigentlich ist's egal, ob das alte oder das neue Bitmuster 'vorne' steht, selber bevorzuge ich 'das Alte' - da ist die Leserichtung (Links nach Rechts) gewohnter.

neuwert= (PORTD>>3)&0x03; // (D3/D4 liegen auf PD3/PD4, also Bit 3 und 4 auf Port D)
altwert=(altwert<<2)|neuwert;

Dadurch wird in 'neuwert' die Bitfolge des Encoder eingelesen, um 3 Bit nach rechts verschoben (auf 1 und 0) und mit 0x03 verUNDet (die restlichen Bits werden gelöscht).
Der altwert wird um 2 Bits nach links geschoben (aus 0b0001 wird 0b0100) und mit den zwei Bits von neuwert verodert.
Heraus kommt ein 4-Bit Wert (0...15), mit den oben aufgezählten Möglichkeiten.
Wenn beide Paare gleich sind (0000 0101 1010 1111), passiert Nix, wenn BEIDE unterschiedlich sind (0011 0110 1001 1100) ist's ein Error, sonst hoch oder runter.

Vll. etwas heftig für den Anfang?
Versuche, den Dreh-Encoder in einem neuen Sketch auszuwerten.

MfG

PS:
Dann hast Du schon genau, was ich hier beschrieben habe, von der Lib.
Nun musst Du 'nurnoch' der Lib beibringen, mit den Unterschied von 1 weiter zu schalten - Das könnte als Einstellung verfügbar sein oder ist hardcodiert in der Lib zu finden.
Dort wohl akut eine 2, da Du ja 2 Rasten drehen musst.
... der Text bleibt nun aber stehen ... Finger blutig ...

postmaster-ino, du bist der Beste!

Das rausfinden, was Lib und Encoder für Werte liefern, war der Schlüssel zum Erfolg.

Das Programm erhöht lib-Werte bei -3 einfach um 4 und senkt bei +3 um 4. Das habe ich gelöscht, und vergleiche einfach den Wert mit Wert_alt: steigt er um 2 = Rechtsdreh, sinkt er um 2 = Linksdreh.

Funktioniert perfekt :slight_smile:

Achtung, Falle!

Wenn der Datentyp überläuft, wirst Du seltsame Reaktionen feststellen.
Hier könntest Du 'irgendwo in der Mitte' die Werte normieren.

Bei int sind Das aber nominal 32768 Rasten - Da musst Du schon 'eine längere Zeit am Rad drehen', bis Dir Das auf die Füße fällt.
Aber wenn, im Hinterkopf dran denken, was passiert sein könnte.

Du kannst auch die original-Ausgabe der Lib benutzen, und die 4 mit der 0 gleich setzen.
Wenn Wert >2, dann Wert-=4
Wenn Wert <-2, dann Wert +=4

So hättest Du zumindest eine originale Lib, wenn Du Diese nicht im Projekt-Verzeichnis hast, wird Dir das nächste Update Deine Änderung eh 'ausbessern'.
Da ist's sinniger, den Work-arround im eigenen Sketch zu haben.

MfG

Aber schön, daß Das bis jetzt so weit funktioniert!
Danke der Rückmeldung.