How to Use a Rotary Encoder with Arduino

A rotary encoder is essential in most analog to digital measurements. Everything from volume control to robot movement can be tracked with a good rotatry encoder. Conveniently, everything you need to know is in Wikipedia. This code is a variation on Metsfan’s contribution to the Sparkfun forums. This version avoids unnecessary if statements. SO NERDY.
#define PIN_HIGHBIT (7)
#define PIN_LOWBIT (5)
#define PIN_PWR (3)
#define BAUDRATE (9600)
#define DEBUG (1)
// globals
int state, prevState = 0, count = 0;
/* old state, new state, change (+ means clockwise)
* 0 2 +
* 1 0 +
* 2 3 +
* 3 1 +
* 0 1 -
* 1 3 -
* 2 0 -
* 3 2 -
*/
int encoderStates[4][4] = {
{ 0, -1, 1, 0 },
{ 1, 0, 0, -1 },
{ -1, 0, 0, 1 },
{ 0, 1, -1, 0 },
};
void setup() {
pinMode(PIN_HIGHBIT, INPUT);
pinMode(PIN_LOWBIT, INPUT);
pinMode(PIN_PWR, OUTPUT);
digitalWrite(PIN_PWR, LOW);
digitalWrite(PIN_LOWBIT, HIGH);
digitalWrite(PIN_HIGHBIT, HIGH);
Serial.begin(BAUDRATE);
}
void loop() {
state = (digitalRead(PIN_HIGHBIT) << 1) | digitalRead(PIN_LOWBIT);
count += encoderStates[prevState][state];
#ifdef DEBUG
if (state != prevState) {
Serial.print(state, DEC);
Serial.print(' ');
Serial.print(prevState, DEC);
Serial.print(' ');
Serial.println(count, DEC);
}
#endif
prevState = state;
}
