#include <Servo.h>
// ------------------- PINOS -------------------
const int botaoSistema = 6; // Botão verde
const int encoderCLK = 2;
const int encoderDT = 3;
const int encoderSW = 4; // Botão do encoder
const int ledVerde = 12;
const int ledAmarelo = 8;
const int ledVermelho = 10;
const int buzzerPin = 13;
const int servoPin = 5;
// ------------------- OBJETOS -------------------
Servo motor;
// ------------------- VARIÁVEIS -------------------
bool sistemaLigado = false;
bool modoAutomatico = false;
long encoderPos = 0;
int lastCLK = HIGH;
unsigned long lastBeep = 0;
// ------------------- FUNÇÕES AUXILIARES -------------------
void beepFofo() {
tone(buzzerPin, 2000, 80);
delay(20);
tone(buzzerPin, 2500, 80);
delay(20);
}
void piscaLed(int pin, int t = 120) {
digitalWrite(pin, HIGH);
delay(t);
digitalWrite(pin, LOW);
delay(t);
}
// -----------------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(botaoSistema, INPUT);
pinMode(encoderCLK, INPUT_PULLUP);
pinMode(encoderDT, INPUT_PULLUP);
pinMode(encoderSW, INPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(buzzerPin, OUTPUT);
motor.attach(servoPin);
motor.write(0);
lastCLK = digitalRead(encoderCLK);
}
// -----------------------------------------------------------
void loop() {
// -------- BOTÃO ON/OFF DO SISTEMA --------
if (digitalRead(botaoSistema) == HIGH) {
delay(50);
sistemaLigado = !sistemaLigado;
if (sistemaLigado) {
digitalWrite(ledVerde, HIGH);
beepFofo();
motor.write(0);
Serial.println("Sistema ligado.");
} else {
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
motor.write(0);
Serial.println("Sistema desligado.");
}
}
if (!sistemaLigado) return;
// -------- TROCA MODO (BOTÃO DO ENCODER) --------
if (digitalRead(encoderSW) == HIGH) {
delay(200);
modoAutomatico = !modoAutomatico;
Serial.println("Modo alterado. Modo automático =");
Serial.print(modoAutomatico);
}
// -------- LEITURA DO ENCODER --------
int clkState = digitalRead(encoderCLK);
if (clkState != lastCLK) {
if (digitalRead(encoderDT) != clkState)
encoderPos++;
else
encoderPos--;
if (!modoAutomatico) beepFofo();
}
lastCLK = clkState;
// ============================================================
// ======================== MODO MANUAL ========================
// ============================================================
if (!modoAutomatico) {
// LEDs sequenciais
digitalWrite(ledVerde, HIGH); delay(100);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH); delay(100);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, HIGH); delay(100);
digitalWrite(ledVermelho, LOW);
// Conversão encoder → ângulo servo (0 a 180)
int angulo = constrain(abs(encoderPos), 0, 180);
motor.write(angulo);
// Velocidade máxima = LED vermelho piscando
if (angulo >= 180) {
piscaLed(ledVermelho, 80);
}
return;
}
// ============================================================
// ====================== MODO AUTOMÁTICO ======================
// ============================================================
// LEDs ciclando
digitalWrite(ledVerde, HIGH); delay(120);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH); delay(120);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, HIGH); delay(120);
digitalWrite(ledVermelho, LOW);
// BuzzerPin tocando repetidamente
if (millis() - lastBeep > 600) {
tone(buzzerPin, 1200, 50);
lastBeep = millis();
}
// Servo movendo 0 → 180 → 0 continuamente
static int angulo = 0;
static int step = 3;
angulo += step;
if (angulo >= 180 || angulo <= 0) step = -step;
motor.write(angulo);
}