Cómo hacer una sirena con Arduino

Este proyecto es una Sirena controlada por botón con diferentes transiciones de LED. Puedes cambiar el sonido de la sirena (por ejemplo, sirena de policía o de ambulancia, etc.) con cada pulsación. He añadido 2 patrones de LED diferentes para cada sirena utilizando 10 LEDs en total. Hay un total de 4 tonos de sirena disponibles. Puedes revisar el código de Arduino y la explicación a continuación:

Código Explicado:

  1. Como estamos utilizando un botón para cambiar entre los tonos, debemos solucionar el problema del rebote del botón. Esto lo resolví mediante una implementación de software utilizando una función booleana para el rebote.
  2. Se utiliza una estructura condicional if-else para cambiar entre diferentes funciones. Las funciones «one()» y «oneA()» son para el primer tono con dos transiciones de LED diferentes, y así sucesivamente. Los tonos para cada función están sincronizados con las transiciones de LED utilizando la función «delay()» de manera apropiada.

Funcionamiento de la Sincronización: La función «tone()» utiliza uno de los temporizadores integrados en Arduino y ese temporizador funciona de forma independiente al «delay()». En otras palabras, podemos decir que si quieres reproducir ritmos distintos, debes tener en cuenta la diferencia entre el tiempo de retardo («delay») y la duración de «tone()», ya que ambas funciones trabajan en paralelo. Lo que hice fue dividir el retardo en partes más pequeñas para utilizarlo con diferentes conjuntos de LEDs. Si deseas un tutorial en video sobre esto, puedes consultarlo aquí: [insertar enlace al tutorial de video]

Tomemos «three()» como ejemplo para entenderlo:

 

void three() { //This function produces the 3rd siren (AMBULANCE sound).tone(buzz,440,200);
delay(300);
for(int i=3;i<=6;i++)
digitalWrite(i,HIGH);
noTone(buzz);
tone(buzz,494,500);
delay(300);
for(int i=3;i<=6;i++)
{ digitalWrite(i,LOW);
digitalWrite(i+6,HIGH); }
noTone(buzz);
tone(buzz,523,300);
delay(200);
digitalWrite(7,HIGH);
delay(50);
digitalWrite(8,HIGH);
delay(50);
noTone(buzz);
}

 

Después de la última llamada a «tone()», dividí el retardo de 300 ms en 200, 50 y 50 para que el LED en el pin 7 y 8 tenga un efecto de parpadeo al final del tono de 523 Hz, mientras el tono se mantiene continuo en el fondo durante 300 ms (ya que no hay diferencia entre el retardo y la duración del tono, como se explicó anteriormente).