#include <Servo.h>
// === Pinos ===
#define pinTrig 22
#define pinEcho 23
#define ledVerde 13
#define ledAmarelo 12
#define ledVermelho 11
#define botao 8
#define buzzer 29
#define servoPin 7
// === Variáveis ===
long tempoHC;
float distancia;
Servo cancelaServo;
bool portaoAberto = false;
unsigned long tempoInicioFechamento = 0;
bool inicioContagemFechamento = false;
unsigned long ultimoBotaoTempo = 0;
unsigned long debounceDelay = 200; // debounce do botão
void setup() {
Serial.begin(9600);
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(botao, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
cancelaServo.attach(servoPin);
fecharPortao(); // estado inicial
Serial.println("Sistema iniciado - Portão fechado");
}
void loop() {
// --- Leitura do botão ---
if (digitalRead(botao) == LOW) {
if (millis() - ultimoBotaoTempo > debounceDelay) {
// Botão pressionado
if (portaoAberto) {
fecharPortao();
} else {
abrirPortao();
}
inicioContagemFechamento = false;
ultimoBotaoTempo = millis();
}
}
// --- Leitura do sensor ultrassônico ---
digitalWrite(pinTrig, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
tempoHC = pulseIn(pinEcho, HIGH, 30000);
distancia = (tempoHC * 0.034) / 2;
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
// --- Lógica automática ---
if (distancia < 20) { // Objeto detectado próximo
abrirPortao();
inicioContagemFechamento = false;
}
else if (portaoAberto) {
if (!inicioContagemFechamento) {
tempoInicioFechamento = millis();
inicioContagemFechamento = true;
}
else if (millis() - tempoInicioFechamento >= 5000 && distancia > 20) { // 5 segundos afastado
fecharPortao();
inicioContagemFechamento = false;
}
}
delay(100);
}
// === Funções auxiliares ===
void abrirPortao() {
if (!portaoAberto) {
Serial.println(">>> ABRINDO PORTÃO...");
piscarLedAmareloEBuzzer();
cancelaServo.write(90);
digitalWrite(ledVerde, HIGH);
digitalWrite(ledVermelho, LOW);
portaoAberto = true;
Serial.println(">>> PORTÃO ABERTO <<<");
}
}
void fecharPortao() {
if (portaoAberto) {
Serial.println(">>> FECHANDO PORTÃO...");
piscarLedAmareloEBuzzer();
cancelaServo.write(0);
digitalWrite(ledVerde, LOW);
digitalWrite(ledVermelho, HIGH);
portaoAberto = false;
Serial.println(">>> PORTÃO FECHADO <<<");
}
}
void piscarLedAmareloEBuzzer() {
for (int i = 0; i < 6; i++) { // Pisca e apita 6 vezes (~1.2s)
digitalWrite(ledAmarelo, HIGH);
tone(buzzer, 1000); // som de 1 kHz
delay(100);
digitalWrite(ledAmarelo, LOW);
noTone(buzzer);
delay(100);
}
}