Essa técnica é muito melhor que o pooling, pois agente só ocupa o processador quando realmente acontece uma mudança de estado no pino que está ligado ao encoder.
Ela ainda não é tão boa como o contador externo pois cada pulso que ocorre na roda agente usa o processador embora seja bem poquinho.
Como usar:
De acordo com o Tutorial do arduino, só podemos usar os pinos 2 ou 3 como interrupção externa, a não ser que esteja com um Mega.
Antes de mais nada vamos declarar uma variável global onde ficará nossa contagem.
static int contadorDireira = 0;
O de baixo é para contar o tempo.
static int tempoanterior = 0;
Para ligar a interrupção, agente só precisa configurar a interrupção lá no setup. O 0 quer dizer que vamos ligar o encoder no pino 2 do arduino (se fosse o três era 1), o segundo parâmetro é o n ome da função que será executada quando ocorrer a interrupção, e o CHANGE quer dizer que vai executar sempre que mudar o estado de LOW pra HIGH ou de HIGH pra LOW.
void setup()
{
attachInterrupt(0, ContarRodaDireita, CHANGE);
}
Agora a nossa super função que vai incrementar o contador:
void ContarRodaDireita()
{
contadorDireira ++;
}
De vez enquando agente tem que ler o contador e zera ele para não estourar o int. Isso pode ser deito no loop mesmo, ou dentro de uma máquina de estados que agente tiver usando, lembre-se que o comando delay() nunca é bem vindo nesse caso.
void loop()
int destancia;
{
if ((millis() - tempoanterior) > 10000){
distancia = contadorDireira / NUMERODEPULSOSPARA1CM;
contadorDireira = 0;
}
}
Ou