#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
int counter = 0;
void setup()
{
// Initialize encoder pins
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(0, readEncoder, FALLING); //Quando o pino 2 (interrupção zero) passe do estado alto para o baixo ("falling"), o arduino executará a função "readEncoder" Isso permite contar quantas vezes teve um Falling
Serial.begin(9600);
}
void readEncoder()
{
// Esta função é chamada cada vez que o ENCODER_CLK (PINO 2) Passa de alto para baixo. (ver linha 12 do código).
// Lo depois que a função é chamada, a função observa o estado do ENCODER_DT, para determinar o sentido de rotação
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH)
{
counter++; // Clockwise
}
if (dtValue == LOW)
{
counter--; // Counterclockwise
}
}
int getCounter()
{
//Esta função devolve o valor da variavel counter.
int result;
cli(); //Desabilita as interrupções
result = counter; // Guarda o valor da variavel counter na variavel result
sei(); // Habilita as interrupções
return result;
}
void resetCounter()
{
noInterrupts();
counter = 0;
interrupts();
}
void loop()
{
Serial.print("Pulsos = ");
Serial.println(getCounter());
if (digitalRead(ENCODER_SW) == LOW) //Verifica se alguem pressionou o botão do encoder, caso positivo, ele reseta o contador
{
resetCounter();
}
delay(150);
}