From da6b1ac8a28c8219256680c6d70eeb73c747ad8a Mon Sep 17 00:00:00 2001 From: KevinMidboe Date: Thu, 13 Aug 2020 21:45:31 +0200 Subject: [PATCH] Working example of rotary encoder. Example stolen from: https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/. --- rotaryEncoder/rotaryEncoder.ino | 72 +++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 rotaryEncoder/rotaryEncoder.ino diff --git a/rotaryEncoder/rotaryEncoder.ino b/rotaryEncoder/rotaryEncoder.ino new file mode 100644 index 0000000..3bf2598 --- /dev/null +++ b/rotaryEncoder/rotaryEncoder.ino @@ -0,0 +1,72 @@ +// Rotary Encoder Inputs +#define CLK 2 +#define DT 3 +#define SW 4 + +int counter = 0; +int currentStateCLK; +int lastStateCLK; +String currentDir =""; +unsigned long lastButtonPress = 0; + +void setup() { + + // Set encoder pins as inputs + pinMode(CLK,INPUT); + pinMode(DT,INPUT); + pinMode(SW, INPUT_PULLUP); + + // Setup Serial Monitor + Serial.begin(9600); + + // Read the initial state of CLK + lastStateCLK = digitalRead(CLK); +} + +void loop() { + + // Read the current state of CLK + currentStateCLK = digitalRead(CLK); + + // If last and current state of CLK are different, then pulse occurred + // React to only 1 state change to avoid double count + if (currentStateCLK != lastStateCLK && currentStateCLK == 1){ + + // If the DT state is different than the CLK state then + // the encoder is rotating CCW so decrement + if (digitalRead(DT) != currentStateCLK) { + counter --; + currentDir ="CCW"; + } else { + // Encoder is rotating CW so increment + counter ++; + currentDir ="CW"; + } + + Serial.print("Direction: "); + Serial.print(currentDir); + Serial.print(" | Counter: "); + Serial.println(counter); + } + + // Remember last CLK state + lastStateCLK = currentStateCLK; + + // Read the button state + int btnState = digitalRead(SW); + + //If we detect LOW signal, button is pressed + if (btnState == LOW) { + //if 50ms have passed since last LOW pulse, it means that the + //button has been pressed, released and pressed again + if (millis() - lastButtonPress > 50) { + Serial.println("Button pressed!"); + } + + // Remember last button press event + lastButtonPress = millis(); + } + + // Put in a slight delay to help debounce the reading + delay(1); +}