// Incluindo a biblioteca para o Servo
#include <Servo.h>
// Definição dos pinos utilizados
const int trigPin = 6;
const int echoPin = 7;
const int buttonPin = 2;
const int ledVerde = 10;
const int ledAmarelo = 12;
const int ledVermelho = 13;
const int buzzerPin = 1;
const int servoPin = 11;
// Declaração das variáveis globais
bool sistemaAtivado = false;
long distancia;
long duracao;
unsigned long tempoBuzzerAnterior = 0;
unsigned long tempoBotaoAnterior = 0;
unsigned long tempoDistanciaAnterior = 0;
unsigned long tempoSomAnterior = 0;
unsigned int passoSom = 0;
const unsigned long intervaloMedicao = 50; // Intervalo para medir a distância
Servo servoMotor;
void setup() {
// Configura os pinos
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledVerde, OUTPUT);
pinMode(ledAmarelo, OUTPUT);
pinMode(ledVermelho, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Inicia o servo motor
servoMotor.attach(servoPin);
// Inicia a comunicação serial para debug
Serial.begin(9600);
}
long medirDistancia() {
// Envia um pulso para o sensor ultrassônico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Calcula a duração do pulso de retorno
duracao = pulseIn(echoPin, HIGH);
// Calcula a distância em centímetros
distancia = duracao * 0.034 / 2;
return distancia;
}
void tocarSomAtivacao() {
unsigned long tempoAtual = millis();
// Configura cada tom da sequência de ativação com base no tempo
if (passoSom == 0 && tempoAtual - tempoSomAnterior >= 200) {
tone(buzzerPin, 1000, 200);
tempoSomAnterior = tempoAtual;
passoSom++;
} else if (passoSom == 1 && tempoAtual - tempoSomAnterior >= 300) {
tone(buzzerPin, 1200, 200);
tempoSomAnterior = tempoAtual;
passoSom++;
} else if (passoSom == 2 && tempoAtual - tempoSomAnterior >= 300) {
tone(buzzerPin, 1400, 200);
tempoSomAnterior = tempoAtual;
passoSom++;
} else if (passoSom >= 3) {
noTone(buzzerPin); // Finaliza o som de ativação
}
}
void loop() {
unsigned long tempoAtual = millis();
// Verifica se o botão foi pressionado para alternar o estado do sistema
if (digitalRead(buttonPin) == LOW && tempoAtual - tempoBotaoAnterior >= 300) { // Debounce
sistemaAtivado = !sistemaAtivado;
tempoBotaoAnterior = tempoAtual;
if (sistemaAtivado) {
passoSom = 0; // Reinicia a sequência de ativação
tocarSomAtivacao(); // Inicia a sequência de som
}
}
if (sistemaAtivado) {
// Executa a sequência de som de ativação enquanto o sistema está ativado
if (passoSom < 3) {
tocarSomAtivacao();
}
// Medir a distância periodicamente
if (tempoAtual - tempoDistanciaAnterior >= intervaloMedicao) {
distancia = medirDistancia();
Serial.print("Distância: ");
Serial.println(distancia);
tempoDistanciaAnterior = tempoAtual;
}
// Controla os LEDs de acordo com a distância
if (distancia > 50) { // Distância segura
digitalWrite(ledVerde, HIGH);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
noTone(buzzerPin); // Sem som
}
else if (distancia <= 50 && distancia > 20) { // Zona de alerta
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, HIGH);
digitalWrite(ledVermelho, LOW);
// Beep lento (1 segundo de intervalo)
if (tempoAtual - tempoBuzzerAnterior >= 1000) {
tone(buzzerPin, 1000);
tempoBuzzerAnterior = tempoAtual;
} else if (tempoAtual - tempoBuzzerAnterior >= 200) {
noTone(buzzerPin); // Desliga o beep após 200 ms
}
}
else if (distancia <= 20) { // Zona de perigo
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, HIGH);
// Beep rápido (0,2 segundo de intervalo)
if (tempoAtual - tempoBuzzerAnterior >= 200) {
tone(buzzerPin, 1000);
tempoBuzzerAnterior = tempoAtual;
} else if (tempoAtual - tempoBuzzerAnterior >= 100) {
noTone(buzzerPin); // Desliga o beep após 100 ms
}
}
// Controla o servo motor com base na distância
int anguloServo = map(distancia, 0, 100, 0, 180);
servoMotor.write(anguloServo);
} else {
// Desativa os LEDs e buzzer quando o sistema está desativado
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarelo, LOW);
digitalWrite(ledVermelho, LOW);
noTone(buzzerPin);
}
}