// ---------------------------------------------------------------------------
// (| " Sirena_buzzer.ino                                                  "|)
// (| " Este es un sencillo ejemplo de Sirena de policía y ambulancia con  "|)
// (| " luces de emergencia incorporadas y un buzzer pasivo. Se utilizara  "|)
// (| " un resistor de 220Ω para limitar la corriente consumidad por el    "|)
// (| " buzzer y se activara el resistor de pull-up interno de Arduino para"|)
// (| " mantener el pin D12 en alto y leer asi un bajo cuando sea accionado"|)
// (| " el pulsador.                                                       "|)
// (| "                                                                    "|)
// (| " Un Buzzer es un zumbador piezoelectrico.                           "|)
// (| "                                                                    "|)
// (| " Un pin del pulsador va al pin 12 del Arduino UNO Rev3 / NANO y el  "|)
// (| " otro extremo va a GND.                                             "|)
// (| "                                                                    "|)
// (| " El pin positivo o signal del buzzer va al pin 10 del Arduino UNO   "|)
// (| " Rev3/NANO mediante un resistor de 220Ω  y el otro extremo va a GND."|)
// (| "                                                                    "|)
// (| " Este código de ejemplo es de dominio público.                      "|)
// (| "                                                                    "|)
// (| " Maker/Developer: jorgechac© - Técnico Laboral en Programación UNAB "|)
// (| " Visita https://jorgechac.blogspot.com/                             "|)
// (| "                                                                    "|)
// (| " Venta de accesorios Arduino/Raspberry Pi Pico/ESP32                "|)
// (| " Whatsapp y Ventas NEQUI +573177295861                              "|)
// (| " Bucaramanga - Colombia                                             "|)
// (| "                                                                    "|)
// (| " Simulación https://wokwi.com/projects/341312959649153618           "|)
// (| " Descarga gratis este sketch en:                                    "|)
// (| " https://create.arduino.cc/editor/jorgechac/bd9bc4ac-8d87-455b-b311-1d22b182d418/preview "|)
// ------------------------------------------------------------------------------------------------

// Configuracion de pines
int boton = 12;   // Pin 12 de Arduino para leer el botón "iniciar melodia"
int sonido = 10;  // Pin 10 de Arduino para el generador de sonido, el + (signal) del buzzer

// Variables para el control del tiempo
unsigned long tiempoAnterior = 0;  // Almacena el tiempo anterior
unsigned long duracionTono = 10;   // Duración de los tonos en milisegundos

// Configuración inicial
void setup() {
  pinMode(boton, INPUT_PULLUP); // Configura el pin para el botón como entrada y habilita resistencia pull-up interna
  pinMode(sonido, OUTPUT);      // Configura el pin de sonido como salida para control del buzzer
}

// Bucle principal
void loop() {
  if (digitalRead(boton) == LOW) { 	      // Comprueba si el botón está presionado (nivel bajo)
    sirenaPolicia(1200, 800, 1, 400, 2);  // Llama a la función para simular una sirena de policía
    sirenaPolicia(1100, 700, 20, 20, 10); // Llama a la función nuevamente
    sirena2(); 			// Llama a otra función para reproducir otro patrón de sonido
    noTone(sonido); // Detiene cualquier tono que se esté reproduciendo en el pin de sonido
  }
}

// Función para simular una sirena de policía, se utiliza un bucle for para
// variar la frecuencia de los tonos y crear el efecto de sirena

void sirenaPolicia(int fMAX, int fMIN, int divisor, int numMAX, int repet) {
  int fMIN1 = fMIN;
  int fMAX1 = fMAX;
  for (int i = 0; i < repet; i++) {
    for (int j = 0; j <= numMAX; j++) {
      tone(sonido, fMIN1); // Genera un tono en el pin de sonido con frecuencia fMIN1
      while (millis() - tiempoAnterior < duracionTono) {
        // Espera durante la duración del tono
      }
      tiempoAnterior = millis(); // Actualiza el tiempo anterior
      fMIN1 = fMIN1 + divisor;  // Aumenta la frecuencia para cambiar el tono
    }
    for (int k = numMAX / 2; k >= 0; k--) {
      tone(sonido, fMAX1); // Genera un tono en el pin de sonido con frecuencia fMAX1
      while (millis() - tiempoAnterior < duracionTono) {
        // Espera durante la duración del tono
      }
      tiempoAnterior = millis();   // Actualiza el tiempo anterior
      fMAX1 = fMAX1 - divisor * 2; // Disminuye la frecuencia para cambiar el tono
    }
    fMIN1 = fMIN; // Restablece la frecuencia mínima
    fMAX1 = fMAX; // Restablece la frecuencia máxima
  }
}

// Función sirena2() para reproducir un patrón de sonido, esta función genera
// tonos de 1200 Hz y 800 Hz alternadamente, con pausas entre ellos

void sirena2() {
  for (int l = 0; l <= 4; l++) {
    tone(sonido, 1200); // Genera un tono de 1200 Hz en el pin de sonido
    while (millis() - tiempoAnterior < 500) {
      // Espera durante 500 milisegundos
    }
    tiempoAnterior = millis(); // Actualiza el tiempo anterior
    tone(sonido, 800); // Genera un tono de 800 Hz en el pin de sonido
    while (millis() - tiempoAnterior < 500) {
      // Espera durante 500 milisegundos
    }
    tiempoAnterior = millis(); // Actualiza el tiempo anterior
    // Agrega un tiempo de espera entre tonos
    while (millis() - tiempoAnterior < 100) {
      // Espera durante 100 milisegundos
    }
    tiempoAnterior = millis(); // Actualiza el tiempo anterior
  }
}

// --------------------------------------------------------------------------

/* esta parte del codigo esta comentada para que en el fututuro mientras
   reproduce el sonido y se manejan las temporizaciones con la funcion millis,
   se iluminen los led de emergencia rojos y azules.
   Si desea probar solo esta función comente todo el programa anterior
   y deje solo esta parte que comienza con /* y termina con * slash

  int boton = 12;    //Pin 12 de arduino para leer el boton "iniciar melodia"
  int tiempo = 10;
  int sonido = 10;   //Pin 10 de arduino para el + (signal) del zumbador

  void setup() {

  pinMode(boton, INPUT_PULLUP); // Pulsador para accionar la alarma
  pinMode(sonido, OUTPUT);      // Pin para reproducir la frecuencia del tono
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  }

  void loop() {

  for (int i = 0; i < 7; i++)
  { digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);

    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);

    delay(100);

    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);

    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);

    delay(100);

  }

  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);

  //Segunda parte

  for (int i = 0; i < 5; i++)
  {

    for (int b = 0; b < 5; b++)
    {
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);

      delay(50);

      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);

      delay(50);
    }

    for (int b = 0; b < 5; b++)
    {
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      digitalWrite(9, HIGH);

      delay(50);

      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      delay(50);
    }
  }
} */