//Sensor ultrasonico utilizando un buzzer como referencia. 
//si la distancia es menor a 20 cm, se encenderá el buzzer 

//INICIO DE LAS VARIABLES

int DISTANCIA = 0;//SERÁ UN VARIABLE DE TIPO DE ENTERO PARA ALGUNA OPERACIÓN. 
int pinLed=2; //PARA EL PIN DEL ANODO DEL LED
int pinEco=12;// PARA EL PIN DEL ECHO(RECEPTOR) RECIBE LA SEÑAL. 
int pinGatillo=13;//PARA EL PIN DEL TRIG (EMISOR) ENVIA LA SEÑAL
const int buzzerPin = 4;// Definir el pin del zumbador
const int frequency = 80; // Puedes ajustar la frecuencia para cambiar el tono. si la frecuencia es mayor es más agudo. 
                          // Frecuencia del sonido (en Hertz)
const int pwmChannel = 0;// Canal de PWM (el ESP32 tiene 16 canales de PWM: 0 a 15)
const int resolution = 8;// Resolución del PWM (de 1 a 16 bits)
const int dutyCycle = 128; // 50% de ciclo de trabajo
                           // Variable para almacenar la señal de duty cycle

//FIN DE LA ASIGNACIÓN DE VARIABLES. 


long readUltrasonicDistance(int triggerPin, int echoPin) //ESTO ES PARA SABER LOS VALORES Y EL RETARDO QUE REALIZA PARA OBTENER UN VALOR
{
  //Iniciamos el pin del emisor de reuido en salida
  pinMode(triggerPin, OUTPUT);//SALE LA SEÑAL.
  //Apagamos el emisor de sonido
  digitalWrite(triggerPin, LOW);//TENGO UNA SEÑAL BAJA, APAGO EL PIN DEL TRIG, PARA QUE NO SALGA NINGUNA SEÑAL
  //Retrasamos la emision de sonido por 2 milesismas de segundo
  delayMicroseconds(2);
  // Comenzamos a emitir sonido
  digitalWrite(triggerPin, HIGH);//EMITO UN SONIDO
  //Retrasamos la emision de sonido por 10 milesismas de segundo
  delayMicroseconds(10);//NOS DETENEMOS 10 MILISEGUNDOS
  //Apagamos el emisor de sonido
  digitalWrite(triggerPin, LOW);//APAGO EL PIN DEL TRIG
  //Comenzamos a escuchar el sonido
  pinMode(echoPin, INPUT);//ENTRA LA SEÑAL POR ESE PIN
  // Calculamos el tiempo que tardo en regresar el sonido
  return pulseIn(echoPin, HIGH);//RETORNO TODO ESE VALOR.
                                //EL COMANDO PULSEIN SIRVE PARA SABER EL TIEMPO QUE TARDÓ EN IR Y VENIR
}


//ACTIVACIÓN DE LAS VARIABLES
void setup() {
  Serial.begin(115200); //LO VEMOS EN EL MONITOR SERIAL PARA SABER SU VALOR RESPECTIVO
  pinMode(buzzerPin, OUTPUT);// Configurar el pin del zumbador como salida
  ledcSetup(pwmChannel, frequency, resolution);// Configurar el canal de PWM
  ledcAttachPin(buzzerPin, pwmChannel);  // Adjuntar el canal de PWM al pin del zumbador
  pinMode(pinLed, OUTPUT);//Configuramos el pin del led como salida
}

void loop() {
  //Calculamos la distancia en cm
  DISTANCIA = 0.01723 * readUltrasonicDistance(pinGatillo, pinEco);//COMO YA HICIMOS EL CALCULO ANTES, AQUI PONEMOS DE NUEVO EL COMANDO PERO REFIRIENDOSE A LOS PINES DONDE VAMOS A CALCULAR. 
  //Mostramos la disstancia
  Serial.println(DISTANCIA);//SE VE EN EL MONITOR SERIAL
  //Si la distancia es menor a 20 encendemos el led
  if (DISTANCIA < 20) {//AQUI DECIDO QUÉ DISTANCIA QUIERO QUE ENCIENDA MI LED. 
    digitalWrite(pinLed, HIGH);//SI ES MENOR A 20CM SE ENCIENDE EL LED
  ledcWrite(pwmChannel, dutyCycle);// Iniciar la señal PWM
  delay(1000);// Mantener el zumbador sonando durante 1 segundo
  } 
  //Si la distancia es mayor a 20 apagamos el led
  else {
    digitalWrite(pinLed, LOW);//SI ES MAYOR A 20CM SE APAGA EL LED
    ledcWrite(pwmChannel, 0);// Detener la señal PWM
      delay(1000);// Esperar 1 segundos
  }
  delay(10);  
}