1 #ifndef ROTARYENCODER_h
2 #define ROTARYENCODER_h
12 volatile int _state[2];
13 volatile int _position;
15 volatile bool _inputFlag =
false;
16 bool _changeFlag =
false;
18 unsigned long _previousTimer;
24 int movements[5][4][4] = {
55 void _setState(
int a,
int b) {
60 void _incrementPosition(
int delta) {
61 _position = _position + delta;
64 int _findChange(
int state1[2],
volatile int state2[2]) {
65 int stateAppend[] = {state1[1], state1[0], state2[1], state2[0]};
67 for (
int i = 0; i < 3; i++) {
68 for (
int j = 0; j < 4; j++) {
69 if (_compareArrays(stateAppend, movements[i][j])) {
89 for (
int i = 3; i < 5; i++) {
90 for (
int j = 0; j < 2; j++) {
91 if (_compareArrays(stateAppend, movements[i][j])) {
101 Serial.println(
"INVALID DATA");
105 boolean _compareArrays(
int a[4],
int b[4]) {
130 RotaryEncoder(
int pinA,
int pinB,
int id = 99) : _pinA(pinA), _pinB(pinB), _id(id) {
131 pinMode(_pinA, INPUT_PULLUP);
132 pinMode(_pinB, INPUT_PULLUP);
134 _previousTimer = millis();
135 _setState(digitalRead(_pinA), digitalRead(_pinB));
140 attachInterrupt(_pinA,
function, CHANGE);
141 attachInterrupt(_pinB,
function, CHANGE);
161 unsigned long timer = millis();
162 unsigned long deltaTime = timer - _previousTimer;
164 if (_inputFlag ==
true) {
168 _previousTimer = timer;
173 if (_changeFlag ==
true && deltaTime > _interval) {
181 int tempState[] = {digitalRead(_pinA), digitalRead(_pinB)};
182 int delta = _findChange(tempState, _state);
184 _incrementPosition(delta);
187 _setState(tempState[0], tempState[1]);