Drehimpulsgeber Rotary Encoder „KY-040“

Hier ein kleiner Versuchsaufbau mit einem Drehimpulsregler KY-040.
Dieser Drehregler hat spürbar beim drehen kurze Wege bis zur nächsten Einrastung. Durch Zählen dieser Impulse kann der Grad der Rotation ermittelt werden. Der Encoder gibt das Signal für die Drehung an Pin „CLK“ und „DT“ wieder. Dabei ist entscheidend, welcher Pin zuerst den Zustand wechselt. Bei Rotation im Uhrzeigersinn wechselt zuerst „CLK“ den Zustand. Bei Rotation gegen den Uhrzeigersinn wechselt „DT“ zuerst den Zustand.
Er kann auch gedrückt werden, so das eine Art Multifunktionsauswahl stattfinden kann.
Er benötigt zwischen 3,3 Volt bis 5 Volt und hat den Pin DT und CLK für digitalen A und B -Kanal, sowie SW als Auswahlbutton

KY-040 Drehgeber-Datenblatt: https://www.rcscomponents.kiev.ua/datasheets/ky-040-datasheet.pdf

Verdrahtung:

Verdrahtung des Drehreglers an einen Arduino Uno Pin 2 CLK, 3 DT, 4 SW, VCC an 5V und GND an GND.
Die 5 LED Anode an Vorwiderstand 220 Ohm, sowie die jeweilige Katode an den Arduino Pin 5, 6, 7, 8, 9.

Bibliothek:

Arduino Drehgeber-Bibliothek: https://www.arduino.cc/reference/en/libraries/encoder/

Quellcode:
Mit dieser Lösung kann jede LED einzeln ausgewählt und zusätzlich geschaltet werden und zur Kontrolle ist eine Ausgabe im Seriellen Monitor mit dabei.

#include <Encoder.h>

// Encoder Pins
#define ENCODER_PIN_A 2
#define ENCODER_PIN_B 3

// Button Pin
#define BUTTON_PIN 4

// LED Pins
const int ledPins[] = {5, 6, 7, 8, 9};
int ledCount = sizeof(ledPins) / sizeof(ledPins[0]);

// Create Encoder object
Encoder myEnc(ENCODER_PIN_A, ENCODER_PIN_B);

long oldPosition  = -999;
int selectedLed = 0;
bool ledStates[5] = {false, false, false, false, false}; // LED-Zustände speichern

void setup() {
  Serial.begin(9600);

  // Setup LED pins
  for (int i = 0; i < ledCount; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  // Setup button pin
  pinMode(BUTTON_PIN, INPUT_PULLUP); // Taster mit Pullup-Widerstand
}

void loop() {
  long newPosition = myEnc.read() / 4; // Adjust for 4 steps per detent

  if (newPosition != oldPosition) {
    oldPosition = newPosition;

    // Wrap the encoder value
    selectedLed = newPosition % ledCount;
    if (selectedLed < 0) {
      selectedLed += ledCount;
    }

    // Turn off all LEDs
    for (int i = 0; i < ledCount; i++) {
      digitalWrite(ledPins[i], LOW);
    }

    // Turn on the selected LED
    digitalWrite(ledPins[selectedLed], ledStates[selectedLed] ? HIGH : LOW);

    Serial.print("Selected LED: ");
    Serial.println(selectedLed + 1);
  }

  // Check if the button is pressed
  if (digitalRead(BUTTON_PIN) == LOW) {
    delay(50); // Debounce delay
    if (digitalRead(BUTTON_PIN) == LOW) { // Confirm button press
      ledStates[selectedLed] = !ledStates[selectedLed]; // Toggle LED state
      digitalWrite(ledPins[selectedLed], ledStates[selectedLed] ? HIGH : LOW);
      Serial.print("Toggled LED: ");
      Serial.println(selectedLed + 1);

      // Wait for button release
      while (digitalRead(BUTTON_PIN) == LOW) {
        delay(10);
      }
    }
  }
}

3D-Druck:
Habe mir diesen Drehknopf ausgedruckt. Er passt perfekt und macht die Bedienung deutlich einfacher.
Rotary Encoder Knob by Nitorix – Thingiverse