ESP32 - Encoder Rotativo
Neste guia, você vai aprender a usar o encoder rotativo com um ESP32. Veja o que vamos aprender:
- Quais são as diferenças entre um encoder rotativo e um potenciômetro
- Como o encoder rotativo funciona
- Como conectar o encoder rotativo ao ESP32
- Como escrever código para o ESP32 ler a direção e a posição do encoder rotativo SEM interrupção.
- Como escrever código para o ESP32 ler a direção e a posição do encoder rotativo COM interrupção.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Encoder Rotativo
Um botão giratório, como o de um rádio, pode enviar sinais que se transformam em eletricidade. Ele nos ajuda a saber o quanto ele girou e em que posição está. Existem dois tipos principais:
- Encoder incremental: este usa sinais rápidos para medir o quanto algo mudou de posição.
- Encoder absoluto: este tipo fornece um código secreto para cada posição, o que nos ajuda a descobrir onde algo está, mesmo se a energia for cortada.
Esta lição trata principalmente do primeiro tipo, o encoder incremental.
Pinagem do Módulo Encoder Rotativo

Um módulo encoder rotativo tem 4 pinos:
- Pino CLK (Saída A): é o pulso principal que nos diz quanto de rotação ocorreu. Sempre que você gira o botão um detent (clique) em qualquer direção, o pino CLK emite um sinal que completa um ciclo completo (LOW → HIGH → LOW).
- Pino DT (Saída B): funciona como o pino CLK, mas emite um sinal atrasado 90 graus em relação ao sinal CLK. Ele nos ajuda a descobrir a direção da rotação (sentido horário ou anti-horário).
- Pino SW: vem do botão do encoder. Ele é normalmente aberto. Quando adicionamos um resistor de pull-up a este pino, o pino SW fica em HIGH quando o botão não está pressionado e em LOW quando está pressionado.
- Pino VCC (+): precisa ser conectado ao VCC (entre 3,3 e 5 volts)
- Pino GND: precisa ser conectado ao GND (0V)
Encoder Rotativo vs Potenciômetro
Você pode confundir o encoder rotativo com o potenciômetro, mas eles são componentes distintos. Aqui está uma comparação entre eles:
- O encoder rotativo é como a versão moderna do potenciômetro, mas pode fazer mais coisas.
- O encoder rotativo pode girar em um círculo completo sem parar, enquanto o potenciômetro só consegue girar cerca de três quartos do círculo.
- O encoder rotativo emite pulsos, enquanto o potenciômetro emite uma tensão analógica.
- O encoder rotativo é útil quando você só precisa descobrir o quanto o botão se moveu, e não exatamente onde ele está. O potenciômetro é útil quando você realmente precisa saber exatamente onde um botão está.
Como o Encoder Rotativo Funciona

Dentro do encoder, há um pequeno disco com ranhuras conectado a um pino chamado C, que funciona como um terra compartilhado. Você tem mais dois pinos, A e B.
- Quando você gira o botão, os pinos A e B tocam esse pino de terra compartilhado C, mas a ordem em que eles o tocam depende do sentido em que você gira o botão (horário ou anti-horário).
- Esses toques criam dois sinais. Eles são um pouco diferentes no tempo porque um pino toca o terra antes do outro. Esses sinais ficam defasados em 90 graus, o que é chamado de codificação em quadratura.
- Se você girar o botão no sentido horário, o pino A toca o terra antes do pino B. Mas se você girar no sentido anti-horário, o pino B toca o terra primeiro, antes do pino A.
- Verificando quando cada pino toca ou deixa o terra, podemos descobrir para que lado o botão está girando. Fazemos isso verificando o que acontece com o pino B quando o pino A muda.

Quando A muda de estado de LOW para HIGH:
- Se B estiver em HIGH, o botão foi girado no sentido anti-horário.
- Se B estiver em LOW, o botão foi girado no sentido horário.
※ Nota:
Os pinos A e B são conectados aos pinos CLK e DT. No entanto, dependendo do fabricante, a ordem pode ser diferente. Os códigos fornecidos abaixo foram testados com o encoder rotativo da DIYables
Como Programar o Encoder Rotativo
- O ESP32 lê o sinal do pino CLK
- Se o estado mudar de LOW para HIGH, então o ESP32 lê o estado do pino DT.
- Se o pino DT estiver em HIGH, o botão foi girado no sentido anti-horário, e o ESP32 aumenta o contador em 1
- Se o pino DT estiver em LOW, o botão foi girado no sentido horário, e o ESP32 diminui o contador em 1
Diagrama de Ligação

This image is created using Fritzing. Click to enlarge image
Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.
Código ESP32 – Encoder Rotativo
O código ESP32 abaixo faz o seguinte:
- Detecta a direção e a quantidade de rotação do encoder.
- Se detectar que o botão foi girado um detent (clique) no sentido horário, aumenta o contador em um.
- Se detectar que o botão foi girado um detent (clique) no sentido anti-horário, diminui o contador em um.
- Detecta se o botão está pressionado.
Para simplificar o código de debounce do botão, a biblioteca ezButton é utilizada.
Passos Rápidos
Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para o ESP32 na Arduino IDE.
- Instale a biblioteca ezButton na Arduino IDE.
- Copie o código acima e abra-o com a Arduino IDE
- Clique no botão Upload na Arduino IDE para carregar o código no ESP32
- Gire o botão no sentido horário e depois no sentido anti-horário
- Pressione o botão
- Veja o resultado no Serial Monitor.
Explicação do Código
Confira os comentários linha por linha no código
Código ESP32 – Encoder Rotativo com Interrupção
No código anterior, usar polling para verificar continuamente o estado do pino pode desperdiçar recursos do ESP32 e causar perda de contagens se a execução de outras partes do código for lenta.
Uma solução eficaz é utilizar a interrupção, que elimina a necessidade de polling. Isso permite que o ESP32 execute outras tarefas sem perder as contagens. Abaixo está o código ESP32 que usa a interrupção para ler a direção e a posição do encoder rotativo.
Agora, ao girar o botão, você verá informações aparecendo no Serial Monitor, de forma muito parecida com o que viu no código anterior.
※ Nota:
- Você pode encontrar tutoriais em outros sites que usam duas interrupções para um único encoder, mas isso é desnecessário e um desperdício. Apenas uma interrupção é suficiente.
- É importante usar a palavra-chave volatile para as variáveis globais usadas na interrupção. Ignorar isso pode causar problemas inesperados.
- Mantenha o código dentro da interrupção o mais simples possível. Evite usar Serial.print() ou Serial.println() dentro da interrupção.
Aplicação do Encoder Rotativo com ESP32
Com o Encoder Rotativo, podemos fazer as seguintes aplicações, entre outras:
- ESP32 - Encoder Rotativo controla a Posição do Servo Motor
- ESP32 - Encoder Rotativo controla o Brilho do LED
- ESP32 - Encoder Rotativo controla a Velocidade do Motor de Passo