#include <Encoder.h> // https://www.pjrc.com/teensy/td_libs_Encoder.html
const byte encoderCLKPin = 2; // encoder encoder CLK
const byte encoderDTPin = 3; // encoder encoder DT
Encoder encoder(encoderDTPin, encoderCLKPin);
const byte ledPins[] = {7, 6, 5, 4};
const byte pinCount = sizeof ledPins / sizeof * ledPins;
byte currentLedPos = 0;
enum : byte {LEFT2RIGHT, RIGHT2LEFT} direction = LEFT2RIGHT;
void checkDirection() {
static long currentPosition = 0;
long newPosition = encoder.read() >> 2; // this encoder generates 4 ticks per click so I divide by 4
if (newPosition > currentPosition) direction = LEFT2RIGHT;
else if (newPosition < currentPosition) direction = RIGHT2LEFT;
currentPosition = newPosition;
}
void animate() {
static const unsigned long tickPeriod = 250ul;
static unsigned long lastTick = -tickPeriod;
if (millis() - lastTick >= tickPeriod) {
lastTick += tickPeriod;
digitalWrite(ledPins[currentLedPos], LOW);
switch (direction) {
case LEFT2RIGHT:
if (currentLedPos >= pinCount) currentLedPos = 0;
else currentLedPos++;
break;
case RIGHT2LEFT:
if (currentLedPos == 0) currentLedPos = pinCount - 1;
else currentLedPos--;
break;
}
Serial.println(currentLedPos);
digitalWrite(ledPins[currentLedPos], HIGH);
}
}
void setup() {
for (auto &p : ledPins) {
pinMode(p, OUTPUT);
digitalWrite(p, LOW);
}
digitalWrite(ledPins[currentLedPos], HIGH);
Serial.begin(115200); Serial.println();
Serial.println(F("Ready"));
}
void loop() {
checkDirection();
animate();
}