• Arduino
  • Raspberry Pi
  • Raspberry Pi Pico
  • Micro:Bit

When the rotary switch is moved, the direction of movement and the current position of the rotary switch are coded and output via the outputs.

coding

With a rotary switch, the state of the two outputs changes per step. The direction of rotation can be determined by checking which of the two states changed first.

pin assignment

Code example Arduino

Pin assignment Arduino

Arduino Sensor
5 V + V
GND GND
Pin 3 CLK
Pin 4 DT
Pin 5 Button

The sample program checks for the change of the pin states and determines the direction of rotation as soon as a rotation has been detected. After the direction has been determined, the steps from the start position are counted and output. Pressing the button resets the count.

// Initialization of the required variables
int counter = 0;
boolean direction;
int Pin_clk_Last;
int Pin_clk_Aktuell;
 
// Definition of the input pins
int pin_clk = 3;
int pin_dt = 4;
int button_pin = 5;
  
  
void setup ()
{
   // input pins are initialized ...
   pinMode (pin_clk, INPUT);
   pinMode (pin_dt, INPUT);
   pinMode (button_pin, INPUT);
    
   // ... and their pull-up resistors activated
   digitalWrite (pin_clk, true);
   digitalWrite (pin_dt, true);
   digitalWrite (button_pin, true);
    
   // Initial reading of the Pin_CLK
   Pin_clk_last = digitalRead (pin_clk);
   Serial.begin (115200);
 }
 
// If the pin status has changed, the program checks which of the two
// Pins changed first, which indicates the direction of rotation.
// This information is obtained by taking one of the two pin values from a previous
// Compare pass with the value of the current pass.
// After the direction has been determined, the steps are counted and output from the start position.
// Pressing the rotary encoder button resets the current position.
 
void loop ()
{
   // Read out the current status
   Pin_clk_Aktuell = digitalRead (pin_clk);
    
   // Check for change
   if (Pin_clk_Aktuell! = Pin_clk_Lieter)
   {
          
        if (digitalRead (pin_dt)! = Pin_clk_Aktuell)
        {
            // Pin_CLK changed first
            Counter ++;
            Direction = true;
        }
          
        else
        {// Otherwise, Pin_DT changed first
            Direction = false;
            Counter--;
        }
        Serial.println ("Rotation detected:");
        Serial.print ("Direction of rotation:");
         
        if (direction)
        {
           Serial.println ("clockwise");
        }
        else
        {
           Serial.println ("counterclockwise");
        }
         
        Serial.print ("Current position:");
        Serial.println (Counter);
        Serial.println ("------------------------------");
          
   }
    
   // Preparation for the next run:
   // The value of the current run is the previous value for the next run
   Pin_clk_Lieter = Pin_clk_Aktuell;
    
   // Reset function to save the current position
   if (! digitalRead (button_pin) && Counter! = 0)
     {
       Counter = 0;
       Serial.println ("position reset");
     }
      
 }

Sample program download

KY040-Arduino.zip

When the rotary switch is moved, the direction of movement and the current position of the rotary switch are coded and output via the outputs.

coding

With a rotary switch, the state of the two outputs changes per step. The direction of rotation can be determined by checking which of the two states changed first.

pin assignment

Code example Raspberry Pi

Pin assignment Raspberry Pi

Raspberry Pi Sensor
GPIO 14 [pin 8] Button
3.3 V [pin 1] + V
GND [pin 6] GND
GPIO 16 [pin 36] CLK
GPIO 15 [pin 10] DT

The sample program checks for the change of the pin states and determines the direction of rotation as soon as a rotation has been detected. After the direction has been determined, the steps from the start position are counted and output. Pressing the button resets the count.

# coding=utf-8
# required modules are imported and set up
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
 
# Here the input pins are declared, to which the sensor is connected.
PIN_CLK = 16
PIN_DT = 15
BUTTON_PIN = 14
 
GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
# Required variables are initialized
Counter = 0
direction = True
PIN_CLK_LAST = 0
PIN_CLK_CURRENT = 0
delayTime = 0.01
 
# Initial readout of the pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)
 
# This output function is executed on signal detection
def outputFunction(null):
    global Counter
 
    PIN_CLK_CURRENT = GPIO.input(PIN_CLK)
 
    if PIN_CLK_ACTUAL != PIN_CLK_LETZTER:
 
        if GPIO.input(PIN_DT) != PIN_CLK_ACTUAL:
            Counter += 1
            Direction = True;
        else:
            Direction = False
            Counter = Counter - 1
 
        print ("Rotation detected: ")
 
        if Direction:
            print ("Direction of rotation: Clockwise")
        else:
            print ("Direction of rotation: Counterclockwise")
 
        print ("Current position: ", Counter)
        print ("------------------------------")
 
def CounterReset(null):
    global Counter
 
    print ("Position reset!")
    print ("------------------------------")
    Counter = 0
 
# To integrate a debounce directly, the functions for output are initialized using the
# CallBack option initialized by the GPIO Python module
GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=output_function, bouncetime=50)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50)
 
 
print ("Sensor test [press CTRL+C to end test]")
 
# main program loop
try:
        while True:
            time.sleep(delayTime)
 
# clean up after the program is finished
except KeyboardInterrupt:
        GPIO.cleanup()

Sample program download

KY040-RPi.zip

To start with the command:

sudo python3 KY040-RPi.py

When the rotary switch is moved, the direction of movement and the current position of the rotary switch are coded and output via the outputs.

coding

With a rotary switch, the state of the two outputs changes per step. The direction of rotation can be determined by checking which of the two states changed first.

pin assignment

Code example Micro:Bit

Pinout Micro:Bit:

Micro:Bit Sensor
3 V +V
GND GND
Pin 1 CLK
Pin 2 DT
Pin 0 Button

The sample program checks for the change of the pin states and determines the direction of rotation as soon as a rotation has been detected. After the direction has been determined, the steps from the start position are counted and output. Pressing the button resets the count.

Sample program download

microbit-KY-040.zip

When the rotary switch is moved, the direction of movement and the current position of the rotary switch are coded and output via the outputs.

coding

With a rotary switch, the state of the two outputs changes per step. The direction of rotation can be determined by checking which of the two states changed first.

pin assignment

Code example Raspberry Pi Pico

Pin assignment Raspberry Pi Pico

Raspberry Pi Pico Sensor
5 V +V
GND GND
GPIO16 CLK
GPIO17 DT
GPIO18 Button

The sample program checks for the change of the pin states and determines the direction of rotation as soon as a rotation has been detected. After the direction has been determined, the steps from the start position are counted and output. Pressing the button resets the count.

# Load libraries
from machine import Pin
from time import sleep

# Initialization of GPIO16, GPIO17 and GPIO18 as input
CLK = Pin(16,Pin.IN, Pin.PULL_DOWN)
DT = Pin(17,Pin.IN, Pin.PULL_DOWN)
switch = Pin(18,Pin.IN, Pin.PULL_UP)

# Variables definition
counter = 0
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
Richtung = True
PIN_CLK_LETZTER = CLK.value()

print("----------------------------------------------------")

def ausgabe():
    Blue = CLK.value()
    Purple = DT.value()
    global PIN_CLK_AKTUELL
    global counter
    global Richtung

    # Reading out the current status 
    PIN_CLK_AKTUELL = Blue

    # Change review
    if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:

        # Pin_CLK changed first
        if Purple != PIN_CLK_AKTUELL:
            counter = counter + 1
            Richtung = True

        # Otherwise Pin_DT has changed first
        else:
            Richtung = False
            counter = counter - 1
        print("Rotation detected: ")

        if Richtung:
            print("Direction of rotation: Clockwise")
        else:
            print("Direction of rotation: Counterclockwise")
        print("Current position: " + str(counter))
        print("-------------------------------------------")

# Function: Counter variable is reset when the button is pressed
def CounterReset():
    global counter
    if switch.value() == 0:
        print("Position resetted!")
        print("-----------------------")
        counter = 0
        sleep(0.5)

# Endless loop for constant readout of the sensor
while True:
    ausgabe()
    PIN_CLK_LETZTER = PIN_CLK_AKTUELL
    CounterReset()

Example program download

KY040-Pico.zip