KY-040 Rotary encoder
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.
- 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
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
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
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()