ESP8266 - Drehencoder

Dieses Tutorial erklärt dir, wie man den inkrementalen Drehencoder mit dem ESP8266 verwendet. Folgendes werden wir behandeln:

Erforderliche Hardware

1×ESP8266 NodeMCU
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Drehgeber
1×Verbindungskabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP8266
1×(Empfohlen) Stromverteiler für ESP8266 Typ-C

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über Drehencoder

Ein Drehencoder ist eine Art Knopf, der Drehbewegungen in ein elektrisches Signal umwandeln kann. Es zeigt dir, wie stark sich etwas gedreht hat und an welcher Position es sich befindet. Es gibt zwei Haupttypen:

  • Inkrementalencoder: Dieser Typ verwendet schnelle Signale, um zu messen, wie weit sich etwas bewegt hat.
  • Absolutencoder: Diese Art liefert für jede Position einen speziellen Code, der dabei hilft, genau zu wissen, wo sich etwas befindet, selbst wenn die Stromversorgung ausfällt.

Dieses Tutorial konzentriert sich auf den inkrementellen Encoder.

Pinbelegung des Drehencoder-Moduls

Drehencoder-Pinbelegung

Ein Drehencoder-Modul hat vier Pins:

  • CLK-Pin (Ausgang A): ist der Hauptimpuls, der angibt, wie viel Rotation stattgefunden hat. Wenn Sie den Drehknopf um eine Rastung (Klick) in eine Richtung drehen, liefert der CLK-Pin ein Signal aus, das einen vollständigen Zyklus durchläuft (LOW HIGH LOW).
  • DT-Pin (Ausgang B): verhält sich wie der CLK-Pin, liefert jedoch ein Signal, das dem CLK-Signal um 90 Grad hinterherhinkt. Es hilft uns dabei, die Drehrichtung (im Uhrzeigersinn oder gegen den Uhrzeigersinn) zu bestimmen.
  • SW-Pin: ist der Ausgang des im Encoder integrierten Druckknopfs. Er ist normalerweise offen. Wenn wir an diesem Pin einen Pull-up-Widerstand verwenden, ist der SW-Pin HIGH, wenn der Druckknopf nicht gedrückt ist, und LOW, wenn er gedrückt wird.
  • VCC-Pin (+): muss mit VCC verbunden werden (zwischen 3,3 und 5 Volt).
  • GND-Pin: muss mit GND (0 V) verbunden werden.

Drehencoder vs Potentiometer

Sie könnten den Drehencoder mit dem Potentiometer verwechseln. Aber es sind unterschiedliche Bauteile. Hier ist ein Vergleich zwischen ihnen:

  • Der Drehencoder ist wie die moderne Version eines Potentiometers, aber er kann mehr Dinge tun.
  • Der Drehencoder kann sich eine volle Umdrehung drehen, ohne anzuhalten, während ein Potentiometer nur etwa drei Viertel des Kreises drehen kann.
  • Der Drehencoder erzeugt Impulse, während ein Potentiometer die analoge Spannung ausgibt.
  • Der Drehencoder ist praktisch, wenn man einfach herausfinden muss, wie weit der Drehknopf gedreht wurde, und nicht genau, wo er sich befindet. Das Potentiometer ist nützlich, wenn man wirklich genau wissen muss, wo sich ein Drehknopf befindet.

Wie ein Drehencoder funktioniert

Drehencoder-Ausgang

Im Encoder befindet sich eine Scheibe mit Schlitzen, die mit einem Pin namens C verbunden ist, der wie eine gemeinsame Masse dient. Es gibt noch zwei weitere Pins, A und B.

  • Wenn du den Drehknopf drehst, berühren Pin A und Pin B den gemeinsamen Erdungspunkt C, jedoch in einer bestimmten Reihenfolge, abhängig davon, in welche Richtung du den Drehknopf drehst (im Uhrzeigersinn oder gegen den Uhrzeigersinn).
  • Diese Berührungen erzeugen zwei Signale. Sie unterscheiden sich im Timing leicht, weil einer der Pins den Erdungspunkt vor dem anderen berührt. Die beiden Signale sind um 90 Grad zueinander phasenverschoben. Dies wird Quadraturkodierung genannt.
  • Wenn du den Drehknopf im Uhrzeigersinn drehst, berührt Pin A den Erdungspunkt vor Pin B. Wenn du den Drehknopf gegen den Uhrzeigersinn drehst, berührt Pin B den Erdungspunkt vor Pin A.
  • Indem wir überwachen, wann jeder Pin den Erdungspunkt berührt oder verlässt, können wir feststellen, in welche Richtung der Drehknopf sich dreht. Wir tun dies, indem wir prüfen, was mit Pin B passiert, wenn Pin A sich ändert.
Wie ein Drehencoder funktioniert.

Wenn A den Zustand von LOW auf HIGH ändert:

  • Wenn B LOW ist, wird der Drehknopf im Uhrzeigersinn gedreht.
  • Wenn B HIGH ist, wird der Drehknopf gegen den Uhrzeigersinn gedreht.

※ Notiz:

Pin A und Pin B sind mit den CLK- und DT-Pins verbunden. Je nach Hersteller kann die Reihenfolge jedoch unterschiedlich sein. Die unten angegebenen Codes wurden mit dem Drehencoder von DIYables getestet.

Wie man einen Drehencoder programmiert

  • Prüfe das Signal vom CLK-Pin
  • Wenn sich der Zustand vom LOW-Zustand zum HIGH-Zustand ändert, prüfe den Zustand des DT-Pins.
    • Wenn der Zustand des DT-Pins HIGH ist, wird der Drehknopf gegen den Uhrzeigersinn gedreht, der Zähler wird um 1 erhöht
    • Wenn der Zustand des DT-Pins LOW ist, wird der Drehknopf im Uhrzeigersinn gedreht, der Zähler wird um 1 verringert

Verdrahtungsdiagramm

ESP8266 NodeMCU Drehencoder Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Weitere Informationen finden Sie unter ESP8266-Pinbelegung und wie man ESP8266 und andere Komponenten mit Strom versorgt.

ESP8266-Code – Drehencoder

Der untenstehende ESP8266-Code führt Folgendes aus:

  • Erfasst die Richtung und das Ausmaß der Drehung des Encoders.
    • Wenn festgestellt wird, dass der Drehknopf um eine Rastung (Klick) im Uhrzeigersinn gedreht wird, erhöhe den Zähler um eins.
    • Wenn festgestellt wird, dass der Drehknopf um eine Rastung (Klick) gegen den Uhrzeigersinn gedreht wird, senke den Zähler um eins.
  • Erfasst, ob die Taste gedrückt wird.

Um den Code für das Entprellen von Tasten zu vereinfachen, wird die ezButton-Bibliothek verwendet.

/* * Dieser ESP8266 NodeMCU Code wurde von newbiely.de entwickelt * Dieser ESP8266 NodeMCU Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp8266/esp8266-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN D7 // The ESP8266 pin D7 connected to the rotary encoder's CLK pin #define DT_PIN D6 // The ESP8266 pin D6 connected to the rotary encoder's DT pin #define SW_PIN D5 // The ESP8266 pin D5 connected to the rotary encoder's SW pin #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object for pin 7; void setup() { Serial.begin(9600); // Configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // read the initial state of the rotary encoder's CLK pin prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); // MUST call the loop() function first // read the current state of the rotary encoder's CLK pin CLK_state = digitalRead(CLK_PIN); // If the state of CLK is changed, then pulse occurred // React to only the rising edge (from LOW to HIGH) to avoid double count if (CLK_state != prev_CLK_state && CLK_state == HIGH) { // if the DT state is HIGH // The encoder is rotating in counter-clockwise direction => decrease the counter if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { // The encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } Serial.print("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Schnelle Schritte

Um mit ESP8266 in der Arduino-IDE zu beginnen, befolgen Sie diese Schritte:

  • Schauen Sie sich das Wie man die Umgebung für ESP8266 in der Arduino IDE einrichtet Tutorial an, wenn dies Ihr erster Einsatz von ESP8266 ist.
  • Verbinden Sie die Komponenten wie in der Abbildung gezeigt.
  • Verbinden Sie das ESP8266-Board mit Ihrem Computer über ein USB-Kabel.
  • Öffnen Sie die Arduino-IDE auf Ihrem Computer.
  • Wählen Sie das richtige ESP8266-Board, z. B. NodeMCU 1.0 (ESP-12E-Modul), und seinen jeweiligen COM-Port.
  • Installieren Sie die ezButton-Bibliothek in der Arduino-IDE. Siehe So installieren Sie die Bibliothek
  • Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino-IDE.
  • Klicken Sie in der Arduino-IDE auf die Upload-Schaltfläche, um den Code auf den ESP8266 hochzuladen.
  • Drehen Sie den Drehknopf im Uhrzeigersinn und anschließend gegen den Uhrzeigersinn.
  • Drücken Sie den Knopf.
  • Überprüfen Sie das Ergebnis im Serial Monitor.
COM6
Send
Rotary Encoder:: direction: CLOCKWISE - count: 1 Rotary Encoder:: direction: CLOCKWISE - count: 2 Rotary Encoder:: direction: CLOCKWISE - count: 3 Rotary Encoder:: direction: CLOCKWISE - count: 4 Rotary Encoder:: direction: CLOCKWISE - count: 5 Rotary Encoder:: direction: ANTICLOCKWISE - count: 4 Rotary Encoder:: direction: ANTICLOCKWISE - count: 3 Rotary Encoder:: direction: ANTICLOCKWISE - count: 2 Rotary Encoder:: direction: ANTICLOCKWISE - count: 1 Rotary Encoder:: direction: ANTICLOCKWISE - count: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code-Erklärung

Schau dir die Zeilenkommentare im Code an.

ESP8266 Code – Drehencoder mit Interrupt

Im vorherigen Code kann wiederholtes Abfragen des Pinstatus mittels Polling Ressourcen verschwenden und möglicherweise nicht korrekt zählen, wenn andere Aufgaben viel Zeit in Anspruch nehmen. Interrupts bieten eine Lösung, indem sie kontinuierliche Abfragen vermeiden und dem ESP8266 ermöglichen, verschiedene Aufgaben auszuführen, ohne Ereignisse zu verpassen.

Hier ist ein ESP8266-Beispiel, wie man einen Drehencoder mit Interrupts ausliest.

/* * Dieser ESP8266 NodeMCU Code wurde von newbiely.de entwickelt * Dieser ESP8266 NodeMCU Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp8266/esp8266-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN D7 // The ESP8266 pin D7 connected to the rotary encoder's CLK pin #define DT_PIN D6 // The ESP8266 pin D6 connected to the rotary encoder's DT pin #define SW_PIN D5 // The ESP8266 pin D5 connected to the rotary encoder's SW pin #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); // create ezButton object for pin 7; void ICACHE_RAM_ATTR INTERRUPT_handler() { if ((millis() - last_time) < 50) // debounce time is 50ms return; if (digitalRead(DT_PIN) == HIGH) { // The encoder is rotating in counter-clockwise direction => decrease the counter counter--; direction = DIRECTION_CCW; } else { // The encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { Serial.begin(9600); // Configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // use interrupt for CLK pin is enough // call INTERRUPT_handler() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), INTERRUPT_handler, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Nun, während du den Knopf drehst, wirst du bemerken, dass Informationen im Serial Monitor erscheinen, ähnlich dem, was du im früheren Code gesehen hast.

※ Notiz:

  • Sie könnten auf Tutorials anderer Websites stoßen, die zwei Interrupts für einen einzelnen Encoder verwenden, aber das ist unnötig und verschwenderisch. Nur ein Interrupt reicht aus.
  • Es ist wichtig, das Schlüsselwort volatile für globale Variablen zu verwenden, die im Interrupt verwendet werden. Die Vernachlässigung dieses Aspekts könnte zu unerwarteten Problemen führen.
  • Halten Sie den Code im Interrupt so einfach wie möglich. Vermeiden Sie die Verwendung von Serial.print() oder Serial.println() innerhalb des Interrupts.

ESP8266 Drehencoder-Anwendung

Mit einem Drehencoder können wir die folgenden Anwendungen durchführen, aber nicht darauf beschränkt:

  • ESP8266 - Drehencoder steuert die Position des Servo-Motors
  • ESP8266 - Drehencoder steuert die Helligkeit der LED
  • ESP8266 - Drehencoder steuert die Geschwindigkeit des Schrittmotors

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Funktionsreferenzen

Verwandte Tutorials

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!