#include <ToneESP32.h>
#include <ESP32Servo.h>
int DISTANCIA;
int tiempo;
int buzzer = 14;
int pinVerde=2;
int pinAmarillo=4;
int pinRojo=5;
int pinEcho=12;
int pinTrig=13;
int minLimit = 15;
int maxLimit = 18;
int servoPin = 27;
int boton = 21;
int valorBoton = 0;
Servo servo;
void setup() {
Serial.begin(115200);
pinMode(pinTrig,OUTPUT);
pinMode(pinEcho,INPUT);
//Configuramos el pin del buzzer como salida
pinMode(buzzer, OUTPUT);
//Configuramos los pines del led como salida
pinMode(pinVerde, OUTPUT);
pinMode(pinAmarillo, OUTPUT);
pinMode(pinRojo, OUTPUT);
pinMode(boton, INPUT);
//Servomotor
servo.attach(servoPin);
}
void loop() {
//codigo del ultrasónico
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
tiempo = pulseIn(pinEcho, HIGH);
//Calculamos la distancia en cm
DISTANCIA = tiempo/59;
//Mostramos la distancia
Serial.print("Distancia: ");
Serial.print(DISTANCIA);
Serial.println(" cm");
//Leemos el estado del boton (1 o 0)
valorBoton = digitalRead(boton);
/*Si la distancia está dentro del rango(15 a 17 cm) se prenden los leds uno por uno y se quedan encendidos,
se mueve el servo (0°) y espera dos segundos y vuelve a su posición normal (90°)*/
if (DISTANCIA >= minLimit && DISTANCIA <maxLimit) {
digitalWrite(pinVerde, HIGH);
delay(600);
digitalWrite(pinAmarillo, HIGH);
delay(600);
digitalWrite(pinRojo, HIGH);
noTone(buzzer);
delay(500);
servo.write(0);
delay(2500);
servo.write(90);
} else if (DISTANCIA < 15){
/*Si se presiona el pulsador, el servo se levanta y se apagan los leds y
el buzzer (Siempre y cuando la distacia sea menor a 15*/
if (valorBoton == HIGH) {
servo.write(0);
noTone(buzzer);
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarillo, LOW);
digitalWrite(pinRojo, LOW);
Serial.println("Apagando alarma...");
delay(1000);
/*Caso contrario, si la distancia es menor a 15 y no se
presiona el botón los leds parpadean y suena el buzzer*/
}else{
servo.write(90);
digitalWrite(pinVerde, HIGH);
digitalWrite(pinAmarillo, HIGH);
digitalWrite(pinRojo, HIGH);
delay(250);
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarillo, LOW);
digitalWrite(pinRojo, LOW);
Serial.println("***Alarma activada***");
tone(buzzer, 2000, 500);
}
}
//Si la distancia es mayor a 17, no ocurre nada
else {
servo.write(90);
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarillo, LOW);
digitalWrite(pinRojo, LOW);
noTone(buzzer);
valorBoton = 0;
}
}