ESP32 S3 - Drehgeber

Erfahren Sie, wie Sie einen Drehgeber (Rotary Encoder) mit Ihrem ESP32 S3 verwenden, um Drehrichtung und Position zu erkennen. Dieses Tutorial führt Sie durch die Verdrahtung, einfachen Polling-Code und einen effizienteren Interrupt-basierten Ansatz – so haben Sie alles, was Sie brauchen, um einen Drehgeber in Ihre ESP32 S3 Projekte einzubinden.

Was Sie bauen werden:

  1. Eine Schaltung, die einen Drehgeber mit dem ESP32 S3 verbindet
  2. Einen Sketch, der die Drehung im und gegen den Uhrzeigersinn erkennt
  3. Eine Interrupt-gesteuerte Version für bessere Leistung und Zuverlässigkeit
  4. Eine Grundlage für praktische Anwendungen wie Menüs, Motorsteuerung und Lautstärkeregelung
ESP32 S3 - Drehgeber

Erforderliche Hardware

1×ESP32 S3 WROOM N16R8
1×(Alternativ) ESP32 S3 SuperMini Dev Module
1×(Alternativ) ESP32 S3 Uno-form Board
1×(Alternativ) ESP32 S3 Camera Board
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×Breadboard
1×Verbindungskabel
1×(Empfohlen) Screw Terminal Expansion Board for ESP32 S3
1×(Empfohlen) Breakout Expansion Board for ESP32 S3
1×(Empfohlen) Power Splitter for ESP32 S3

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 S3 Starter-Kit (ESP32 S3 enthalten)
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.

Überblick über Rotary Encoder

Ein Drehgeber ist ein Positionssensor, der Drehbewegungen in elektrische Signale umwandelt. So kann ein Mikrocontroller wie der ESP32 S3 sowohl die Richtung als auch das Ausmaß der Drehung bestimmen. Anders als ein Potentiometer kann sich ein Drehgeber endlos drehen, ohne an einen mechanischen Anschlag zu stoßen. Damit ist er ideal für Navigationsmenüs, Motordrehzahlsteuerung und andere Anwendungen, bei denen eine unbegrenzte Drehung erforderlich ist.

Dieses Tutorial konzentriert sich auf inkrementelle Drehgeber – den gängigsten und einsteigerfreundlichsten Typ für ESP32 S3 Projekte.

Wichtige Spezifikationen

Inkrementelle Drehgeber erzeugen zwei digitale Impulssignale (A und B), die um 90 Grad phasenverschoben sind. Durch den Vergleich, welches Signal sich zuerst ändert, kann der ESP32 S3 bestimmen, ob der Knopf im oder gegen den Uhrzeigersinn gedreht wurde. Die meisten Module haben außerdem einen integrierten Taster, der durch Herunterdrücken des Knopfs betätigt wird. Der Drehgeber kann sich ohne Endanschläge in beide Richtungen endlos drehen, und das Modul akzeptiert typischerweise eine Versorgungsspannung von 3,3V bis 5V.

Pinbelegung des Drehgebermoduls

Drehgeber Pinbelegung

Das Drehgebermodul hat fünf Pins, die mit Ihrem ESP32 S3 verbunden werden:

  1. CLK-Pin (Ausgang A): Primärer Impulsausgang, der die Drehung signalisiert – gibt pro Raststufe einen vollständigen LOW-HIGH-LOW-Zyklus aus
  2. DT-Pin (Ausgang B): Sekundärer Impulsausgang, der CLK um 90 Grad nacheilt und zur Bestimmung der Drehrichtung dient
  3. SW-Pin: Anschluss des Tasters – normalerweise offen, liefert im Ruhezustand HIGH und LOW, wenn der Knopf gedrückt wird (benötigt einen Pull-up-Widerstand)
  4. VCC-Pin (+): Stromversorgung – mit 3,3V am ESP32 S3 verbinden
  5. GND-Pin: Massebezug – mit GND verbinden

Drehgeber vs. Potentiometer

Man könnte einen Drehgeber leicht mit einem Potentiometer verwechseln, doch beide erfüllen grundlegend unterschiedliche Zwecke. Ein Potentiometer gibt eine analoge Spannung aus, die proportional zu einem festen Drehbereich (typischerweise 270°) ist, und eignet sich daher am besten zum Lesen einer absoluten Position. Ein Drehgeber gibt über eine unbegrenzte Drehung digitale Impulse aus und ist daher ideal, um relative Bewegungen zu verfolgen – wie weit und in welche Richtung der Knopf gedreht wurde.

Wichtige Unterschiede

Drehgeber drehen sich endlos um 360°, während Potentiometer einen festen mechanischen Anschlag haben. Drehgeber geben digitale Impulse aus, Potentiometer eine analoge Spannung. Drehgeber erfassen relative Bewegungen, Potentiometer absolute Positionen. Für ESP32 S3 Projekte, die Menünavigation, Motordrehzahlregelung oder einen Knopf benötigen, der sich endlos drehen lässt, ist ein Drehgeber die richtige Wahl.

Funktionsweise eines Drehgebers

Drehgeber-Ausgang

Im Inneren des Drehgebers ist eine geschlitzte Scheibe mit einer gemeinsamen Masse (Pin C) verbunden. Beim Drehen des Knopfs berühren die Pins A und B abwechselnd die gemeinsame Masse und erzeugen zwei Impulsfolgen, die um 90 Grad phasenverschoben sind – ein Verfahren, das als Quadraturkodierung bezeichnet wird.

Innerer Mechanismus:

  1. Eine geschlitzte Scheibe im Inneren ist mit Pin C (gemeinsame Masse) verbunden
  2. Die Pins A und B berühren beim Drehen des Knopfs die gemeinsame Masse
  3. Die Reihenfolge des Kontakts von A und B bestimmt die Drehrichtung
  4. Es entstehen zwei um 90 Grad phasenverschobene Impulssignale (Quadraturkodierung)

Erkennen der Drehrichtung:

  1. Drehung im Uhrzeigersinn: Pin A berührt die Masse vor Pin B
  2. Drehung gegen den Uhrzeigersinn: Pin B berührt die Masse vor Pin A
  3. Der ESP32 S3 liest den Zustand von Pin B in dem Moment, in dem Pin A wechselt, und bestimmt daraus die Richtung
So funktioniert ein Drehgeber

Logik der Richtungserkennung:

Wenn Pin A von LOW auf HIGH wechselt:

  • Wenn Pin B HIGH ist: Der Knopf wurde gegen den Uhrzeigersinn gedreht
  • Wenn Pin B LOW ist: Der Knopf wurde im Uhrzeigersinn gedreht

※ Notiz:

Die Pins A und B sind mit den Pins CLK und DT verbunden. Je nach Hersteller kann die Reihenfolge abweichen. Der folgende Code wurde mit Drehgebern von DIYables getestet.

So programmieren Sie einen Drehgeber

Der ESP32 S3 liest den Drehgeber, indem er den CLK-Pin auf Zustandsänderungen überwacht. Wenn CLK von LOW auf HIGH wechselt, liest der Sketch sofort den DT-Pin:

  1. Der ESP32 S3 überwacht den CLK-Pin fortlaufend
  2. Wenn CLK von LOW auf HIGH steigt, wird sofort der DT-Pin gelesen
  3. Wenn DT HIGH ist: Drehung gegen den Uhrzeigersinn → Zähler um 1 erhöhen
  4. Wenn DT LOW ist: Drehung im Uhrzeigersinn → Zähler um 1 verringern
  5. Diese Methode erfasst zuverlässig sowohl die Richtung als auch den kumulierten Drehbetrag

Verdrahtungsdiagramm

Verbinden Sie den Drehgeber wie im folgenden Diagramm gezeigt mit Ihrem ESP32 S3. Verwenden Sie kurze Jumperkabel, um die Signalleitungen sauber zu halten und Störungen zu vermeiden, die zu Fehlzählungen führen könnten.

ESP32 S3 Drehgeber Verdrahtungsplan

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

Sicherheitshinweise

Verbinden Sie VCC immer mit dem 3,3V-Pin des ESP32 S3 statt mit 5V, um innerhalb der Spannungstoleranz der GPIOs des Boards zu bleiben. Der SW-Pin benötigt einen Pull-up-Widerstand – die meisten Drehgebermodule haben bereits einen auf der Platine, prüfen Sie das jedoch an Ihrem Modul, bevor Sie auf einen externen Widerstand verzichten.

Drehgeber-Pin ESP32 S3 Pin
CLK GPIO19
DT GPIO20
SW GPIO21
VCC 3.3V
GND GND

ESP32 S3 Code – Drehgeber

Der folgende Sketch demonstriert das grundlegende Auslesen eines Drehgebers am ESP32 S3 mit einem Polling-Ansatz. Er erkennt die Drehrichtung, führt einen laufenden Zähler der Raststufen und meldet Tastendrücke – alles wird im Seriellen Monitor ausgegeben. Die ezButton-Bibliothek übernimmt die Entprellung des Tasters automatisch, sodass die Tastenerkennung ohne zusätzlichen Boilerplate-Code zuverlässig funktioniert.

/* * Dieser ESP32 S3 Code wurde von newbiely.de entwickelt * Dieser ESP32 S3 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/esp32-s3/esp32-s3-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN 19 // The ESP32 S3 pin 19 connected to the rotary encoder's CLK pin #define DT_PIN 20 // The ESP32 S3 pin 20 connected to the rotary encoder's DT pin #define SW_PIN 21 // The ESP32 S3 pin 21 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 21; void setup() { Serial.begin(115200); // 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("Counter-clockwise"); Serial.print(" - count: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Hinweis: Dieser Code verwendet die ezButton-Bibliothek, um die Entprellung des Tasters zu vereinfachen und Tastendrücke zuverlässig zu erkennen.

Schnelle Schritte

  1. Neu beim ESP32 S3? Arbeiten Sie zuerst unsere Anleitung Erste Schritte mit dem ESP32 S3 durch.
  2. Bibliothek installieren: Fügen Sie die ezButton-Bibliothek über den Bibliotheksverwalter der Arduino IDE hinzu
  3. Code öffnen: Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein
  4. Hochladen: Klicken Sie auf die Schaltfläche Upload, um den Sketch auf Ihren ESP32 S3 zu übertragen
  5. Drehung testen: Drehen Sie den Knopf des Drehgebers einige Klicks im Uhrzeigersinn und dann gegen den Uhrzeigersinn
  6. Taster testen: Drücken Sie den Knopf des Drehgebers herunter
  7. Ergebnisse ansehen: Öffnen Sie den Seriellen Monitor (115200 Baud), um Drehrichtung und Zählerstand zu sehen
  8. Profi-Tipp: Jeder fühlbare "Klick" beim Drehen des Knopfs wird Raststufe genannt – der Drehgeber erzeugt pro Raststufe genau einen vollständigen Impulszyklus, sodass Ihre Klickanzahl und der Zählerwert immer übereinstimmen

Ausgabe im Seriellen Monitor:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-06-16 10:23:01] Rotary Encoder:: direction: CLOCKWISE - count: 1 [2026-06-16 10:23:01] Rotary Encoder:: direction: CLOCKWISE - count: 2 [2026-06-16 10:23:02] Rotary Encoder:: direction: CLOCKWISE - count: 3 [2026-06-16 10:23:02] Rotary Encoder:: direction: CLOCKWISE - count: 4 [2026-06-16 10:23:03] Rotary Encoder:: direction: CLOCKWISE - count: 5 [2026-06-16 10:23:04] Rotary Encoder:: direction: ANTICLOCKWISE - count: 4 [2026-06-16 10:23:04] Rotary Encoder:: direction: ANTICLOCKWISE - count: 3 [2026-06-16 10:23:05] Rotary Encoder:: direction: ANTICLOCKWISE - count: 2 [2026-06-16 10:23:05] Rotary Encoder:: direction: ANTICLOCKWISE - count: 1 [2026-06-16 10:23:06] Rotary Encoder:: direction: ANTICLOCKWISE - count: 0 [2026-06-16 10:23:08] The button is pressed [2026-06-16 10:23:09] The button is pressed
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Code-Erklärung

Lesen Sie die ausführlichen zeilenweisen Kommentare im obigen Code, um zu verstehen, wie jeder Abschnitt funktioniert.

ESP32 S3 Code – Drehgeber mit Interrupt

Der Polling-Ansatz im vorherigen Sketch funktioniert gut für einfache Projekte, verbraucht aber Rechenzeit des ESP32 S3, selbst wenn der Knopf nicht bewegt wird – und kann Impulse verpassen, wenn anderer Code zu langsam läuft. Interrupts lösen beide Probleme, indem die Hardware den ESP32 S3 in dem Moment benachrichtigt, in dem ein CLK-Wechsel auftritt. So bleibt die Hauptschleife für andere Aufgaben frei.

Der folgende Sketch verwendet einen Hardware-Interrupt am CLK-Pin, um den Drehgeber effizient auszulesen. Die Richtungslogik ist identisch mit der Polling-Version, aber der Zustand des Drehgebers wird in einer Interrupt-Service-Routine (ISR) erfasst, sodass keine Impulse verloren gehen.

/* * Dieser ESP32 S3 Code wurde von newbiely.de entwickelt * Dieser ESP32 S3 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/esp32-s3/esp32-s3-rotary-encoder */ #include <ezButton.h> // The library to use for SW pin #define CLK_PIN 19 // The ESP32 S3 pin 19 connected to the rotary encoder's CLK pin #define DT_PIN 20 // The ESP32 S3 pin 20 connected to the rotary encoder's DT pin #define SW_PIN 21 // The ESP32 S3 pin 21 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 21; void IRAM_ATTR ISR_encoder() { 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(115200); // 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 ISR_encoder() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoder, 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 }

Wenn Sie den Knopf drehen, zeigt der Serielle Monitor dieselben Drehinformationen wie im vorherigen Beispiel an, jedoch mit besserer Leistung und Zuverlässigkeit auf dem ESP32 S3.

※ Notiz:

  • Ein Interrupt genügt: Viele Tutorials hängen Interrupts sowohl an CLK als auch an DT, aber ein einziger Interrupt an CLK reicht aus und verbraucht weniger Ressourcen
  • Schlüsselwort volatile verwenden: Deklarieren Sie Variablen, die in einer ISR geändert werden, immer als volatile, damit der Compiler sie nicht wegoptimiert
  • ISRs kurz halten: Vermeiden Sie Aufrufe von Serial.print() oder Serial.println() innerhalb eines Interrupts – setzen Sie ein Flag oder aktualisieren Sie einen Zähler und erledigen Sie die Ausgabe in der Hauptschleife
  • Schnelle Ausführung: Je kürzer und schneller Ihre ISR ist, desto zuverlässiger funktioniert das Auslesen des Drehgebers unter Last

ESP32 S3 Drehgeber-Anwendungen

Drehgeber harmonieren hervorragend mit der Rechenleistung und Konnektivität des ESP32 S3 und ermöglichen eine Vielzahl interaktiver und steuerungsorientierter Projekte.

  1. Servomotorsteuerung: Drehen Sie den Drehgeber, um die Servoposition präzise Klick für Klick einzustellen
  2. LED-Helligkeitsdimmer: Bilden Sie den Zähler des Drehgebers auf ein PWM-Tastverhältnis ab, um die Helligkeit gleichmäßig und stufenlos einzustellen
  3. Drehzahlsteuerung für Schrittmotoren: Regeln Sie die Schrittmotordrehzahl in Echtzeit für Robotik- und CNC-Anwendungen
  4. Digitale Lautstärkeregelung: Stellen Sie die Audiolautstärke in Hausautomations- oder Bluetooth-Lautsprecher-Projekten ein
  5. OLED-Menünavigation: Blättern Sie durch Drehen des Knopfs durch Menüeinträge und wählen Sie per Tastendruck aus
  6. Intelligentes Thermostat: Stellen Sie die Zieltemperatur mit dem Drehgeber ein und zeigen Sie den Wert auf einem Bildschirm an
  7. RGB-LED-Farbwähler: Bilden Sie die Position des Drehgebers auf den Farbton ab und durchlaufen Sie das gesamte Farbspektrum

Video-Tutorial

Sehen Sie sich unten die Schritt-für-Schritt-Videoanleitung für dieses ESP32 S3 Projekt an.

Fordern Sie sich heraus

Da Sie nun einen funktionierenden Drehgeber am ESP32 S3 haben, probieren Sie diese Übungen aus, um Ihr Verständnis zu vertiefen und das Projekt weiterzuentwickeln.

  1. Anfänger: Schließen Sie eine LED an, die jedes Mal einmal blinkt, wenn der Taster des Drehgebers gedrückt wird
  2. Anfänger: Zeigen Sie den aktuellen Zählerwert auf einer 4-stelligen 7-Segment-Anzeige statt im Seriellen Monitor an
  3. Fortgeschritten: Steuern Sie mit dem Zähler des Drehgebers den Winkel eines Servomotors – bilden Sie den Zählerbereich auf 0–180 Grad ab
  4. Fortgeschritten: Bauen Sie einen PWM-basierten LED-Helligkeitsdimmer, der in Echtzeit auf die Drehung des Drehgebers reagiert
  5. Experte: Erstellen Sie ein mehrstufiges Menüsystem auf einem OLED- oder LCD-Display, mit dem Drehgeber zum Blättern und dem Taster zur Auswahl

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!