KY-040 Inkrementaler Drehgeber-Modul (Rotary Encoder) mit Taster für Arduino

 2,40

Erlebe präzise, digitale Eingaben mit dem KY-040 Drehgeber-Modul. Anders als ein Potentiometer hat dieser „unendliche“ Drehknopf keinen Anschlag und erfasst sowohl die Richtung als auch die Anzahl der Dreh-Schritte. Zusätzlich ist ein praktischer Taster integriert, der durch Drücken des Knopfes betätigt wird. Er ist das perfekte Eingabegerät für die Navigation in Menüs oder die feinfühlige Einstellung von Werten.

2 vorrätig

Artikelnummer: 200005 Kategorie: Schlagwörter: , , , ,

Du willst Werte nicht nur irgendwie, sondern absolut präzise einstellen? Dann ist der KY-040 Drehgeber, auch Rotary Encoder genannt, genau dein Werkzeug. Stell ihn dir wie ein digitales Volumenrad vor, das du endlos in beide Richtungen drehen kannst. Bei jeder kleinen Rastung sendet er digitale Impulse an deinen Mikrocontroller.

Das Geniale daran: Durch die Auswertung von zwei separaten Signalleitungen (CLK und DT) weiß dein Arduino nicht nur, dass gedreht wurde, sondern auch in welche Richtung. Damit kannst du Werte exakt erhöhen oder verringern. Als Bonus dient der Drehknopf selbst als Taster, mit dem du eine Auswahl bestätigen oder eine Funktion aufrufen kannst. Von der Menüführung auf einem Display bis zur Steuerung eines Schrittmotors – dieser Encoder bietet dir eine professionelle und intuitive Eingabemöglichkeit.

Deine technischen Vorteile im Überblick:

  • Präzise digitale Eingabe: Erfasst Drehrichtung und -schritte, ideal für genaue Einstellungen.
  • Integrierter Taster: Bietet eine zusätzliche Eingabemöglichkeit für Bestätigungen.
  • Endlose Rotation: Kein mechanischer Anschlag, perfekt für zyklische Menüs oder Werte.
  • Haptisches Feedback: Die leichten Rastungen bei der Drehung geben ein gutes Gefühl für jeden Schritt.
  • Einfache Anbindung: Mit 5 Pins schnell an jeden Mikrocontroller angeschlossen.
  • Universell einsetzbar: Ideal für Menü-Navigation, Lautstärkeregelung, Frequenzeinstellung und vieles mehr.

 

Technisches Datenblatt

Merkmal Spezifikation
Modell KY-040
Encoder-Typ Inkrementaler Drehgeber (Rotary Encoder)
Betriebsspannung 5V DC
Impulse pro Umdrehung 20
Ausgangssignale 2x Digital (CLK, DT), 1x Digital (SW Taster)
Pinbelegung CLK, DT, SW, + (VCC), GND
Abmessungen (LxB) ca. 32 mm x 19 mm

 

Arduino Code

Hinweis: Die zuverlässigste Methode zum Auslesen eines Drehgebers ist die Verwendung von Interrupts, um keine schnellen Drehungen zu verpassen.

/*
  KY-040 Drehgeber Beispiel mit Interrupts
  Dieses Programm liest die Drehrichtung und den Tasterdruck aus
  und gibt die Änderungen auf dem Seriellen Monitor aus.
*/

// Definiere die Pins für den Drehgeber
#define CLK_PIN 2   // CLK muss an einem Interrupt-Pin sein (z.B. 2 oder 3 beim Uno)
#define DT_PIN 3    // DT muss an einem Interrupt-Pin sein (z.B. 2 oder 3 beim Uno)
#define SW_PIN 4    // Taster-Pin

// Eine Variable, um den Zählerstand zu speichern
// 'volatile', da sie in einer Interrupt-Routine geändert wird
volatile int counter = 0; 

void setup() {
  Serial.begin(9600);
  
  // Konfiguriere die Pins als Eingänge
  pinMode(CLK_PIN, INPUT);
  pinMode(DT_PIN, INPUT);
  // Aktiviere den internen Pull-up-Widerstand für den Taster
  pinMode(SW_PIN, INPUT_PULLUP);
  
  // Füge die Interrupts für die Dreh-Pins hinzu
  // Löst bei jeder Änderung am CLK-Pin die Funktion 'readEncoder' aus
  attachInterrupt(digitalPinToInterrupt(CLK_PIN), readEncoder, CHANGE);
  
  Serial.println("KY-040 Drehgeber bereit.");
}

void loop() {
  // Lese den Taster-Status im Haupt-Loop aus
  if (digitalRead(SW_PIN) == LOW) {
    Serial.println("Taster gedrückt! Zähler zurückgesetzt.");
    counter = 0; // Setze den Zähler zurück
    delay(200); // Einfache Entprellung
  }
}

// Interrupt-Service-Routine (ISR)
void readEncoder() {
  // Lese den Zustand von Pin DT
  int dtState = digitalRead(DT_PIN);
  // Lese den Zustand von Pin CLK
  int clkState = digitalRead(CLK_PIN);

  // Wenn der Zustand von DT und CLK unterschiedlich ist,
  // wurde im Uhrzeigersinn gedreht.
  if (dtState != clkState) {
    counter++;
  } else {
    // ansonsten gegen den Uhrzeigersinn
    counter--;
  }
  
  // Gib den neuen Zählerstand aus
  Serial.print("Position: ");
  Serial.println(counter);
}