// Projeto: Controle de Servo com Encoder Rotativo
// Girando o encoder o servo acompanha o movimento
// Ao clicar no botão do encoder o servo vai para 90°
// Biblioteca do servo
#include <Servo.h>
// Pinos do encoder
int CLK = 2;
int DT = 3;
int SW = 4;
// Servo motor
Servo motor;
// Variáveis
int posicao = 90; // posição inicial do servo
int estadoCLK;
int ultimoCLK;
void setup()
{
// Configura pinos
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP);
// Servo no pino 9
motor.attach(9);
// Inicia servo
motor.write(posicao);
// Lê estado inicial do encoder
ultimoCLK = digitalRead(CLK);
Serial.begin(9600);
}
void loop()
{
// Leitura do encoder
estadoCLK = digitalRead(CLK);
// Detecta mudança
if (estadoCLK != ultimoCLK)
{
// Sentido horário
if (digitalRead(DT) != estadoCLK)
{
posicao = posicao + 5;
}
else // Sentido anti-horário
{
posicao = posicao - 5;
}
// Limita servo entre 0 e 180 graus
posicao = constrain(posicao, 0, 180);
// Move servo
motor.write(posicao);
// Mostra no monitor serial
Serial.print("Posicao: ");
Serial.println(posicao);
}
// Salva estado atual
ultimoCLK = estadoCLK;
// Se apertar o botão do encoder
if (digitalRead(SW) == LOW)
{
// Vai para posição central
posicao = 90;
motor.write(posicao);
Serial.println("Botao pressionado - Servo em 90 graus");
delay(300); // debounce
}
}