Created
January 14, 2017 20:31
-
-
Save pdp7/0d7d17522dc892569eee091a8df23266 to your computer and use it in GitHub Desktop.
Arduino Rotary Encoder test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//From bildr article: http://bildr.org/2012/08/rotary-encoder-arduino/ | |
//these pins can not be changed 2/3 are special pins | |
int encoderPin1 = 2; | |
int encoderPin2 = 3; | |
volatile int lastEncoded = 0; | |
volatile long encoderValue = 0; | |
long lastencoderValue = 0; | |
int lastMSB = 0; | |
int lastLSB = 0; | |
void setup() { | |
Serial.begin (9600); | |
pinMode(encoderPin1, INPUT); | |
pinMode(encoderPin2, INPUT); | |
digitalWrite(encoderPin1, HIGH); //turn pullup resistor on | |
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on | |
//call updateEncoder() when any high/low changed seen | |
//on interrupt 0 (pin 2), or interrupt 1 (pin 3) | |
attachInterrupt(0, updateEncoder, CHANGE); | |
attachInterrupt(1, updateEncoder, CHANGE); | |
} | |
void loop(){ | |
//Do stuff here | |
Serial.println(encoderValue); | |
delay(1000); //just here to slow down the output, and show it will work even during a delay | |
} | |
void updateEncoder(){ | |
int MSB = digitalRead(encoderPin1); //MSB = most significant bit | |
int LSB = digitalRead(encoderPin2); //LSB = least significant bit | |
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number | |
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value | |
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; | |
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; | |
lastEncoded = encoded; //store this value for next time | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment