52 lines
1.4 KiB
C++
52 lines
1.4 KiB
C++
#include "RotaryEncoder.h"
|
|
|
|
RotaryEncoder::RotaryEncoder(int ENC_A, int ENC_B, int multiplier, int stepSize, int pauseLength) {
|
|
_ENC_A = ENC_A;
|
|
_ENC_B = ENC_B;
|
|
_multiplier = multiplier;
|
|
_stepSize = stepSize;
|
|
_pauseLength = pauseLength;
|
|
_oldENC_A = 0;
|
|
_oldENC_B = 0;
|
|
_lastENCread = 0;
|
|
_ENCcounter = 0;
|
|
_lastENCreadTime = micros();
|
|
//define pin modes
|
|
pinMode(_ENC_A, INPUT);
|
|
pinMode(_ENC_B, INPUT);
|
|
digitalWrite(_ENC_A,HIGH); //these pins do not have pull up resistors on an attiny...
|
|
digitalWrite(_ENC_B,HIGH); //you must pull them up on the board.
|
|
}
|
|
int RotaryEncoder::readEncoder() {
|
|
int a0Pin = digitalRead(_ENC_A);
|
|
int a1Pin = digitalRead(_ENC_B);
|
|
int changevalue = 1;
|
|
int returnVal = 0;
|
|
if(a0Pin != _oldENC_A || a1Pin != _oldENC_B) {
|
|
if(_oldENC_A == a1Pin && _oldENC_B != a0Pin) {
|
|
returnVal = 1;
|
|
} else if (_oldENC_B == a0Pin && _oldENC_A != a1Pin) {
|
|
returnVal = -1;
|
|
}
|
|
_oldENC_A = a0Pin;
|
|
_oldENC_B = a1Pin;
|
|
|
|
if(returnVal != 0) {
|
|
if(returnVal == _lastENCread) {
|
|
_ENCcounter++;
|
|
if((micros() - _lastENCreadTime) < _pauseLength) {
|
|
changevalue = max((_ENCcounter/_stepSize)*_multiplier,1);
|
|
}
|
|
_lastENCreadTime = micros();
|
|
} else {
|
|
_ENCcounter=0;
|
|
}
|
|
_lastENCread = returnVal;
|
|
}
|
|
|
|
return returnVal*changevalue;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|