Heute zeige ich dir, wie du einen Rotary Encoder (Drehimpulsgeber) mit dem Arduino ausließt und für deine Projekte nutzen kannst. Ein Arduino Encoder ist ein vielseitiges Bauteil, das dir unbegrenzte Drehbewegungen ermöglicht – im Gegensatz zu einem Potentiometer, das nur einen begrenzten Drehwinkel hat.
Was ist ein Rotary Encoder?
Ein Rotary Encoder ist ein elektromechanisches Bauteil, das Drehbewegungen in digitale Signale umwandelt. Anders als ein Potentiometer kannst du ihn unendlich oft in beide Richtungen drehen. Er liefert digitale Impulse, die der Arduino zählen und auswerten kann.
Typische Anwendungen:
- Lautstärkeregler in Audio-Projekten
- Menünavigation in Display-Anwendungen
- Präzise Steuerung von Robotern
- Einstellungen für LED-Helligkeit oder Motorgeschwindigkeit
In diesem Tutorial lernst du die Grundlagen des Arduino Encoders kennen, wie du ihn verkabelst und mit zwei verschiedenen Code-Varianten ausließt – einmal manuell zum Verstehen des Prinzips und einmal mit einer professionellen Bibliothek für maximale Zuverlässigkeit.
Diese Bauteile brauchst du
- Rotary Encoder KY-040 Modul – Auf Amazon ansehen
- Arduino Uno oder kompatibles Board – Auf Amazon ansehen
- Jumperkabel männlich-männlich – Auf Amazon ansehen
- USB-Kabel für Arduino – Auf Amazon ansehen
- Breadboard (optional) – Auf Amazon ansehen
Wie funktioniert ein Rotary Encoder?
Bevor du mit der Verkabelung beginnst, solltest du das Grundprinzip verstehen. Ein Rotary Encoder hat zwei Ausgangskontakte (A und B), die beim Drehen versetzt schalten. Diese Phasenverschiebung zwischen den Signalen ermöglicht es, die Drehrichtung zu erkennen.
Das Funktionsprinzip im Detail:
Bei einer Drehung im Uhrzeigersinn schaltet Signal A vor Signal B:

Bei einer Drehung gegen den Uhrzeigersinn schaltet Signal B vor Signal A:

Der Arduino erkennt die Drehrichtung, indem er die Reihenfolge der Signalwechsel auswertet. Durch das Zählen der Impulse kann ich die aktuelle Position bestimmen. Pull-Up-Widerstände (entweder im Encoder-Modul oder im Arduino aktiviert) sorgen dafür, dass die Signale stabil auf HIGH-Pegel liegen, wenn kein Kontakt besteht.
Verkabelung des Arduino Encoders
Die Verkabelung ist erfreulich einfach. Ich zeige dir jetzt, wie du den Rotary Encoder mit deinem Arduino verbindest:
Anschluss-Schema:
- CLK (Clock/Pin A) → Arduino Pin 2
- DT (Data/Pin B) → Arduino Pin 3
- SW (Switch) → Lassen wir zunächst frei (für spätere Projekte mit Taster-Funktion)
- + (VCC) → 5V (bei Modulen mit separater Stromversorgung)
- GND → GND
Wichtige Hinweise zur Verkabelung:
Ich empfehle dir, die Pins 2 und 3 zu verwenden, weil diese Hardware-Interrupts unterstützen. Das sorgt für die beste Performance und zuverlässigste Erkennung. Bei Encoder-Modulen ohne separate Stromversorgung aktivierst du im Code einfach die internen Pull-Up-Widerstände mit INPUT_PULLUP.
Halte die Kabelverbindungen möglichst kurz, um Störsignale zu vermeiden und stabile Messwerte zu erhalten.

Der Arduino Encoder Code
Ich stelle dir zwei Varianten vor: Eine einfache Version ohne Bibliothek, mit der du das Grundprinzip verstehst, und eine professionelle Variante mit der Encoder-Bibliothek für maximale Zuverlässigkeit.
Variante 1: Einfache Version ohne Bibliothek
Diese Version eignet sich perfekt, wenn du verstehen möchtest, wie die Encoder-Auswertung im Detail funktioniert:
int encoderPinA = 2;
int encoderPinB = 3;
int encoderPos = 0;
int encoderPinALast = LOW;
int encoderPinANow = LOW;
void setup() {
pinMode (encoderPinA, INPUT_PULLUP);
pinMode (encoderPinB, INPUT_PULLUP);
Serial.begin (115200);
}
void loop() {
encoderPinANow = digitalRead(encoderPinA);
if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
if (digitalRead(encoderPinB) == HIGH) {
encoderPos++;
} else {
encoderPos--;
}
Serial.println(encoderPos);
}
encoderPinALast = encoderPinANow;
}
So funktioniert dieser Code:
Der Code liest kontinuierlich den Zustand von Pin A in die Variable encoderPinANow. Wenn ich eine fallende Flanke erkenne (Übergang von HIGH zu LOW), werte ich den aktuellen Zustand von Pin B aus:
- Ist Pin B HIGH → Du drehst im Uhrzeigersinn → Position wird erhöht (
encoderPos++) - Ist Pin B LOW → Du drehst gegen den Uhrzeigersinn → Position wird verringert (
encoderPos--)
Die aktuelle Position gibst du über den Serial Monitor aus, den du mit 115200 Baud öffnen kannst.
Variante 2: Mit Encoder-Bibliothek (empfohlen!)
Für echte Projekte empfehle ich dir die Encoder-Bibliothek von Paul Stoffregen. Sie bietet deutlich bessere Performance und Zuverlässigkeit.
Installation der Bibliothek:
- Öffne die Arduino IDE
- Gehe zu Sketch → Bibliothek einbinden → Bibliotheken verwalten
- Suche nach „Encoder“ (von Paul Stoffregen)
- Klicke auf „Installieren“
Der Code mit Bibliothek:
/* Encoder Library - Basic Example
* http://www.pjrc.com/teensy/td_libs_Encoder.html
*
* This example code is in the public domain.
*/
#include <Encoder.h>
// Change these two numbers to the pins connected to your encoder.
// Best Performance: both pins have interrupt capability
// Good Performance: only the first pin has interrupt capability
// Low Performance: neither pin has interrupt capability
Encoder myEnc(2, 3);
// avoid using pins with LEDs attached
void setup() {
Serial.begin(115200);
Serial.println("Basic Encoder Test:");
}
long oldPosition = -999;
void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
}
}
Vorteile der Bibliothek:
- Nutzt Hardware-Interrupts optimal aus
- Erkennt auch sehr schnelle Drehbewegungen zuverlässig
- Deutlich einfachere Implementierung
- Praktisch keine verpassten Impulse mehr
Code hochladen und testen:
- Kopiere den Code in die Arduino IDE
- Wähle das richtige Board und den richtigen Port aus
- Klicke auf „Hochladen“
- Öffne den Serial Monitor (Baudrate: 115200)
- Drehe den Encoder und beobachte die Werte
Du wirst sofort sehen, wie präzise die Erkennung funktioniert!
Fazit: Arduino Encoder erfolgreich einsetzen
Du hast jetzt gelernt, wie du einen Rotary Encoder mit dem Arduino ausließt und in deinen Projekten nutzen kannst. Ich habe dir zwei Varianten gezeigt: eine einfache manuelle Auswertung zum Verständnis des Grundprinzips und die professionelle Lösung mit der Encoder-Bibliothek.
Zusammenfassung:
- Rotary Encoder ermöglichen präzise Erkennung von Drehbewegungen in beide Richtungen
- Die manuelle Variante hilft dir, das Funktionsprinzip zu verstehen
- Die Encoder-Bibliothek empfehle ich dir für alle ernsthaften Projekte
- Vielseitig einsetzbar: von Lautstärkereglern über Menüsteuerungen bis zur Robotik
Deine nächsten Schritte:
Jetzt kannst du den Arduino Encoder in vielfältiger Weise erweitern:
- Nutze den SW-Pin für die integrierte Taster-Funktion
- Begrenze die Werte (z.B. 0-100 für Prozentanzeigen)
- Kombiniere den Encoder mit einem LED-Ring oder OLED-Display zur visuellen Darstellung
- Setze ihn für die Menünavigation in größeren Projekten ein
Probleme lösen (Troubleshooting):
- Encoder zählt in die falsche Richtung: Tausche Pin A und B in der Verkabelung oder im Code
- Werte springen unkontrolliert: Verbessere die Verkabelung oder füge Entstörkondensatoren (100nF) zwischen Signal und GND hinzu
- Keine Ausgabe im Serial Monitor: Prüfe die Baudrate (muss 115200 sein)
Viel Erfolg mit deinem Arduino Encoder Projekt! Du wirst sehen, wie vielseitig du dieses kleine Bauteil einsetzen kannst.
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs

Ah sorry. Die Zeitachse im zweiten Bild ist von Rechts nach Links zu lesen.
So stimmt es natürlich.
Hätte die beiden untereinanderliegenden Darstellungen zunächst beide von links nach Rechts gelesen.
Oszillogramme lese ich eher so.
ich glaube, die Skizze mit dem Phasendiagramm ist nicht korrekt
Der dargestellte Phasenverlauf ist gleich nur die Detektionspunkte sind unterschiedlich eingezeichnet. Die Drehrichtung würde aber bei beiden Diagrammen in die gleiche Richtung zeigen.
Hi,
der Code ohne lib (ohne Interrupts) funktioniert wunderbar. Wenn ich ihn allerdings in mein Projekt integriere, gibt er zwar noch Werte aus, aber das hoch-und runterzählen funktioniert eigentlich überhaupt nicht mehr. Warum? Dazu muss ich sagen, dass in meiner loop() noch eine paar andere Sachen ablaufen. Ist der Abfrage Code sehr zeitkritisch?
Du solltest den Encoder mit Interrupts verwenden. Wenn in der loop() noch weitere Sachen laufen, bekommst du timing-Probleme (wie du ja bereits festgestellt hast).
„int val;“ ist überflüßig
Ha! Stimmt, danke :-)
Hallo Stefan,
ist weist du wie man auch andere Pins beim Arduino (MEGA) verwenden kann. Da einfach Umstecken und andere Pins im Code eingeben nicht geht es muss scheinbar etwas mit Pin 2&3 zu tun haben.
Brauche für mein Projekt 2 Encoder.
Würde mich sehr freuen danke für den super Artikel.
Hi Matthias, das ist echt komisch. Beim Mega sollten mit der Encoder-Library auf jeden Fall folgende Pins funktionieren: 2, 3, 18, 19, 20, 21 Probier mal die anderen aus. Liebe Grüße Stefan
Hallo Stefan,
besten Dank für deine / Ihre super Information.
Mir ist noch aufgefallen, dass beim einfachen Arduino Encoder – Beispiel die Angabe der PINs verrutscht ist. Im Code und Bild sind es PIN 2 & 3. In der Beschreibung dazwischen 3 & 4.
Grüße
Hallo Michael, vielen Dank für den Hinweis und die netten Worte. Hab es im Text geändert, jetzt sollte es passen. Liebe Grüße Stefan