Referência do wokwi-ky-040
Módulo Encoder Rotativo KY-040 com 20 pulsos por revolução.
Nome dos Pinos
| Nome | Descrição | 
|---|---|
| CLK | Pino A do encoder rotativo (Pulso de clock) | 
| DT | Pino B do encoder rotativo (Pulso de direção) | 
| SW | Pino do botão de pressão. Normalmente aberto, em curto com GND quando pressionado | 
| VCC | Alimentação positiva | 
| GND | Terra | 
Operação
O encoder rotativo oferece duas formas de interação:
- Rotação - Você pode girar o botão clicando nas setas. A seta superior gira um passo no sentido horário, e a seta inferior gira um passo no sentido anti-horário. Girando o botão irá produzir sinais digitais nos pinos DT e CLK, como explicado abaixo.
 - Botão - Clique no botão para pressionar o botão. Enquanto pressionado, o botão conecta o pino SW ao pino GND.
 
Cada vez que o usuário gira o botão, ele produz um sinal BAIXO nos pinos DT e CLK:
- Girar no sentido horário faz com que o pino CLK gere um sinal baixo primeiro e, em seguida, o pino DT vai para o nível baixo também.
 - Girar no sentido anti-horário faz com que o pino DT gere um sinal baixo primeiro e então o pino CLK vai para nível baixo.
 
Ambos os pinos voltarão para o nível alto em alguns milissegundos. O diagrama a seguir ilustra isso:

Você pode fazer experimentos com os tempos dos pinos DT/CLK conectando-os ao Analisador Lógico Wokwi. Confira o Guia do Analisador Lógico para aprender como usar.
Esquemas
O módulo KY-040 inclui dois resistores internos de pull-up que colocam os pinos CLK e DT em VCC. A simulação sempre coloca esses pinos em nível alto, mesmo se você deixou o pino VCC flutuando.
Usando o Encoder Rotativo no Arduino
Lendo a rotação
Você pode ler a rotação verificando o status do pino CLK. Sempre que estiver BAIXO, leia o valor do pino DT para determinar a direção: HIGH significa rotação no sentido horário, LOW significa rotação anti-horária. Exemplo de código:
#define ENCODER_CLK 2
#define ENCODER_DT  3
void setup() {
  Serial.begin(115200);
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
}
int lastClk = HIGH;
void loop() {
  int newClk = digitalRead(ENCODER_CLK);
  if (newClk != lastClk) {
    // Houve uma mudança no pino CLK
    lastClk = newClk;
    int dtValue = digitalRead(ENCODER_DT);
    if (newClk == LOW && dtValue == HIGH) {
      Serial.println("Girando no sentido horário ⏩");
    }
    if (newClk == LOW && dtValue == LOW) {
      Serial.println("Girando no sentido anti-horário ⏪");
    }
  }
}
Você também pode executar este exemplo no Wokwi.
Nota: seu código precisará ler o estado dos pinos com frequência para detectar as rotações corretamente.
Se a sua rotina em loop() demorar muito tempo para ler o encoder (por exemplo: com o uso da função delay() em seu código), recomendamos usar attachInterrupt() para receber as alterações no pino CLK. Supondo que CLK esteja conectado ao pino 2 e DT ao pino 3 (como antes):
#define ENCODER_CLK 2
#define ENCODER_DT  3
void setup() {
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
  attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
}
void readEncoder() {
  int dtValue = digitalRead(ENCODER_DT);
  if (dtValue == HIGH) {
    Serial.println("Girando no sentido horário ⏩");
  }
  if (dtValue == LOW) {
    Serial.println("Girando no sentido anti-horário ⏪");
  }
}
void loop() {
  // Faça o que for preciso
}
Usando o botão
Para ler o estado do botão do encoder, conecte-o a qualquer pino IO do Arduino e inicialize o pino como INPUT_PULLUP. Em seguida, leia o estado do botão usando digitalRead().
A leitura será BAIXA enquanto o botão for pressionado.
O exemplo de código a seguir acenderá o LED integrado do Arduino (13) enquanto o botão estiver pressionado. Ele assume que você conectou o SW ao pino 4 do Arduino. Você também precisa conectar o pino GND a um dos pinos GND do Arduino.
#define ENCODER_BTN 4
void setup() {
  pinMode(ENCODER_BTN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  if (digitalRead(ENCODER_BTN) == LOW) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}
Controle pelo teclado
Para controlar o encoder com o teclado, clique nele primeiro, e em seguida, use as seguintes teclas:
| Tecla | Função | 
|---|---|
| Direita / Cima | Gira um passo no sentido horário* | 
| Esquerda / Baixo | Gira um passo no sentido anti-horário* | 
| Barra de espaço | Pressiona o botão do encoder | 
* Mantenha as teclas pressionadas para girar continuamente o encoder, gerando uma série de pulsos nos pinos CLK/DT.