Sonidos de Bomberos

Buenos tardes comunidad.
Soy nuevo en el foro y trabajando con Arduino tmb.
Les cuento.. se me encargó hacer una caja de tonos de despacho vía radio (bomberos). en donde quiero hacerlo en Arduino UNO. Estuve buscando en la web y lo mas similar que encontré fue un proyecto "Piano" a lo cual lo escribí de nuevo el código siguiendo sus pasos pero a basado en lo que yo necesito. y bueno no me resultó :frowning: jajajaj y además de eso necesito otras características que pienso que son de alguien con mas experiencia.
dejo a continuación el código que yo modifique y el original. Al final de la pagina dejo lo que finalmente necesito poder realizar. Quedo atento a sus comentarios y un gran saludo... Gracias :slight_smile:

El original: https://paruro.pe/aprende/arduino/otros/piano-usando-pulsadores


/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
const int incendio = 80; 
const int otros = 90; 
const int atencion = 600; 

//se declaran los pina cada tono 
const int pulsador_incendio = 8; 
const int pulsador_otros = 7; 
const int pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ] = {incendio, otros, atencion}; 
int pulsadores[ ] = {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado = 0; 

void setup() { 
//se define los pin de entrada y salida 
for (int pin=6; pin>0; pin--) 
pinMode(pulsadores[pin] , INPUT); 
} 
} 

void loop() { 
int pulsador_actual; //se delcara como variable local 
//el bucle analiza el estado de los 3 pulsores 
for (int pulsador = 0; pulsador < 7; pulsador++) { 
pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
// si se presiono, se procede a reproducir la nota 
if (pulsador_actual == HIGH) { 
tone(13, sonidos_todos[pulsador]); // reproduce la nota 
// grabamos el pulsador que ha sido activado 
pulsador_activado = pulsadores[pulsador]; 
break; 
} 
} 
// si soltamos el pulsador activo apagamos cortamos el sonido 
if (digitalRead(pulsador__activado) == LOW) { 
notone(13); 
} 
}

Finalmente lo requiero es que solo con presionar y soltar el botón se genere el sonido por X tiempo.. sin necesidad de tenerlo presionado para siga sonando.

  • Tono 1: intermitente, de duración 4 segundos. Ej: tu- tu- tu- tu- tu ( 48Hz)
  • Tono 2: constante, de duración 4 segundos Ej: tuuuuuuuuuu. (80Hz)
  • Tono 3: alterno, de duracion 5 seg. Y usar dos frec : 600 Hz y 80 Hz por Ej: tiiiiiii / tuuuuuuu.
    jajahahaj espero se entienda un poco Xd.
    nuevamente agradezco a todos. :slight_smile:

Mi estimado amigo bombero, porque descarto que lo eres, te invito a que leas las normas del foro y que luego hagas varias correcciones debido a las faltas que has cometido.

  1. El título debe hablar del motivo de tu consulta. Ponle Sonido de sirena de bombero por ejemplo.
  2. El código debe postearse usándose el tag correspondiente </> asi que edita el post llendo abajo a la derecha donde dice More, luego Modify luego selecciona todo el código y click en </>

Por favor resuelve eso y comenzamos a ayudarte en la tarea que pides.

Estimado Surbyte.
Ya verifique las faltas que he cometido :).

Un error de código (explicado en el comentario):

for (int pulsador = 0; pulsador < 3; pulsador++) { // El array "pulsadores" solo tiene 3 elementos, no 7. Posiblemente tu programa acababa colgándose

El compilador no verifica límites en los "arrays".

Así como está tu código, solo te va a generar un pitido constante hasta que se suelte el botón. Si quieres hacer lo que antes dijiste:

vocho6:
Finalmente lo requiero es que solo con presionar y soltar el botón se genere el sonido por X tiempo.. sin necesidad de tenerlo presionado para siga sonando.

  • Tono 1: intermitente, de duración 4 segundos. Ej: tu- tu- tu- tu- tu ( 48Hz)
  • Tono 2: constante, de duración 4 segundos Ej: tuuuuuuuuuu. (80Hz)
  • Tono 3: alterno, de duracion 5 seg. Y usar dos frec : 600 Hz y 80 Hz por Ej: tiiiiiii / tuuuuuuu.
    jajahahaj espero se entienda un poco Xd.

Y asumiendo que el Arduino ignore los botones hasta que el sonido acabe, entonces habrá que producir esos sonidos en funciones separadas.

Si no quieres que los botones sean ignorados en ningún momento (durante la reproducción de los tonos), ahí ya habría que ir un paso adelante...

/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
const byte incendio 		 = 80; 
const byte otros 			 = 90; 
const byte atencion 		 = 600; 

//se declaran los pina cada tono 
const byte pulsador_incendio = 8; 
const byte pulsador_otros 	 = 7; 
const byte pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ] 	= {incendio, otros, atencion}; 
int pulsadores[ ] 		= {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado 	= 0; 

void setup() { 
	//se define los pin de entrada y salida 
	for (int pin=6; pin>0; pin--) 
	     pinMode(pulsadores[pin] , INPUT); 
} 
} 

void loop() { 
	
	int pulsador_actual; //se delcara como variable local 
	//el bucle analiza el estado de los 3 pulsores 
	for (int pulsador = 0; pulsador < 3; pulsador++) { // solo hay 3 pulsadores definidos
		pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
		// si se presiono, se procede a reproducir la nota 
		if (pulsador_actual == HIGH) {  
			// grabamos el pulsador que ha sido activado 
			pulsador_activado = pulsadores[pulsador]; 
			break; 
		} 
	} 
	switch(pulsador_activado) {
		case 0: 
				tone(13, sonidos_todos[pulsador]); // reproduce la nota x 4000 mseg
				delay(4000);
				notone(13);
				delay(4000); // repetir si es el caso
				break;
		case 1: tone(13, sonidos_todos[pulsador]);
				delay(4000);
				notone(13);
				break;
		case 2: tone(13, sonidos_todos[2]);
				delay(5000);
				tone(13, sonidos_todos[1]);
				delay(5000); // repetir si corresponde
				break;
	}

	// si soltamos el pulsador activo apagamos cortamos el sonido 
	if (digitalRead(pulsador_activado) == LOW) { 
		notone(13); 
	} 
}

Solo tienes definido 3 posibles frecuencias y pulsadores de modo que es lo que te he puesto.
Se que no esta terminado. Lo pruebas y nos cuentas

/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
const byte incendio      = 80; 
const byte otros       = 90; 
const byte atencion      = 600; 

//se declaran los pina cada tono 
const byte pulsador_incendio = 8; 
const byte pulsador_otros    = 7; 
const byte pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ]   = {incendio, otros, atencion}; 
int pulsadores[ ]     = {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado   = 0; 

void setup() { 
 //se define los pin de entrada y salida 
 for (int pin=6; pin>0; pin--) 
      pinMode(pulsadores[pin] , INPUT); 
} 


void loop() { 
 
 int pulsador_actual; //se delcara como variable local 
 //el bucle analiza el estado de los 3 pulsores 
 for (int pulsador = 0; pulsador < 3; pulsador++) { // solo hay 3 pulsadores definidos
   pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
   // si se presiono, se procede a reproducir la nota 
   if (pulsador_actual == HIGH) {  
     // grabamos el pulsador que ha sido activado 
     pulsador_activado = pulsadores[pulsador]; 
     break; 
   } 
 } 
 switch(pulsador_activado)
{
    case 1: tone(13, sonidos_todos[pulsador]);  
        delay(4000);
       noTone(13);
       delay(4000); // repetir si es el caso
       break;

   case 2: tone(13, sonidos_todos[pulsador]);
       delay(4000);
       notone(13);
       break;

   case 3: tone(13, sonidos_todos[2]);
       delay(5000);
       tone(13, sonidos_todos[1]);
       delay(5000); // repetir si corresponde
       break;
 }

 // si soltamos el pulsador activo apagamos cortamos el sonido 
 if (digitalRead(pulsador_activado) == LOW) { 
   notone(13); 
 } 
}
[quote author=surbyte date=1464324688 link=msg=2773818]
[code]/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
const byte incendio 		 = 80; 
const byte otros 			 = 90; 
const byte atencion 		 = 600; 

//se declaran los pina cada tono 
const byte pulsador_incendio = 8; 
const byte pulsador_otros 	 = 7; 
const byte pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ] 	= {incendio, otros, atencion}; 
int pulsadores[ ] 		= {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado 	= 0; 

void setup() { 
	//se define los pin de entrada y salida 
	for (int pin=6; pin>0; pin--) 
	     pinMode(pulsadores[pin] , INPUT); 
} 
} 

void loop() { 
	
	int pulsador_actual; //se delcara como variable local 
	//el bucle analiza el estado de los 3 pulsores 
	for (int pulsador = 0; pulsador < 3; pulsador++) { // solo hay 3 pulsadores definidos
		pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
		// si se presiono, se procede a reproducir la nota 
		if (pulsador_actual == HIGH) {  
			// grabamos el pulsador que ha sido activado 
			pulsador_activado = pulsadores[pulsador]; 
			break; 
		} 
	} 
	switch(pulsador_activado) {
		case 0: 
				tone(13, sonidos_todos[pulsador]); // reproduce la nota x 4000 mseg
				delay(4000);
				notone(13);
				delay(4000); // repetir si es el caso
				break;
		case 1: tone(13, sonidos_todos[pulsador]);
				delay(4000);
				notone(13);
				break;
		case 2: tone(13, sonidos_todos[2]);
				delay(5000);
				tone(13, sonidos_todos[1]);
				delay(5000); // repetir si corresponde
				break;
	}

	// si soltamos el pulsador activo apagamos cortamos el sonido 
	if (digitalRead(pulsador_activado) == LOW) { 
		notone(13); 
	} 
}

Estimado Surbyte. me arroja este un error "(Error al verificar : "Pulsador´was not declared in this scope") en el Caso 1 :frowning:

Ya veo... lo corrijo.

/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
int  incendio      = 80; 
int  otros        	= 90; 
int  atencion      = 600; 

//se declaran los pina cada tono 
const byte pulsador_incendio = 8; 
const byte pulsador_otros    = 7; 
const byte pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ]   = {incendio, otros, atencion}; 
int pulsadores[ ]     = {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado   = 0; 
int pulsador_actual; //se delcara como variable local 
int pulsador;

void setup() { 
 //se define los pin de entrada y salida 
 for (int pin=6; pin>0; pin--) 
      pinMode(pulsadores[pin] , INPUT); 
} 


void loop() { 
 

 //el bucle analiza el estado de los 3 pulsores 
 for ( pulsador = 0; pulsador < 3; pulsador++) { // solo hay 3 pulsadores definidos
   pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
   // si se presiono, se procede a reproducir la nota 
   if (pulsador_actual == HIGH) {  
     // grabamos el pulsador que ha sido activado 
     pulsador_activado = pulsadores[pulsador]; 
     break; 
   } 
 } 
 switch(pulsador_activado)
{
    case 1: tone(13, sonidos_todos[pulsador]);  
        delay(4000);
       noTone(13);
       delay(4000); // repetir si es el caso
       break;

   case 2: tone(13, sonidos_todos[pulsador]);
       delay(4000);
       noTone(13);
       break;

   case 3: tone(13, sonidos_todos[2]);
       delay(5000);
       tone(13, sonidos_todos[1]);
       delay(5000); // repetir si corresponde
       break;
 }

 // si soltamos el pulsador activo apagamos cortamos el sonido 
 if (digitalRead(pulsador_activado) == LOW) { 
   noTone(13); 
 } 
}

Me cuentas que hace

Estimado.
se puede programar bien, pero no tengo audio.. por lo demás probé cambiando el pin 13 (salida audio) por el 12.. y nada de nada.. Como detalle en vuestra configuración, el Led del pin 13 permanece encendido pero con menor intensidad... Si le quito la conexión se enciende con total luminosidad. :S

Pd: el autor del proyecto original destaca esto:
NOTA: Como se puede ver en la figura se hace uso del pin 0 o pin RX, dicho pin es usado por Arduino al momento de programar, por lo tanto si hacemos todas las conexiones y le damos a programar, nos aparecerá un error. Por tal motivo, al momento que se va programar se deberá desconectar la conexión que tiene el pin 0(pin RX). Después se conecta normalmente.

Gracias. :wink:

vocho6:
Estimado.
se puede programar bien, pero no tengo audio.. por lo demás probé cambiando el pin 13 (salida audio) por el 12.. y nada de nada.. Como detalle en vuestra configuración, el Led del pin 13 permanece encendido pero con menor intensidad... Si le quito la conexión se enciende con total luminosidad. :S

Qué estás utilizando para hacer el sonido? Si no estas seguro de lo que es, por favor postea una imagen de eso.

Lo del LED a baja intensidad me tiene preocupado, podrías estar excediendo la corriente máxima del pin. Para protegerlo de esto último, coloca una resistencia de 100 ohms entre pin y altavoz/buzzer.

Hola... Estoy utilizando un parlante de 5w y 4 ohm .. también tengo un buzzer. También está con una resistencia de 100 Ohm... como se indica en el proyecto original "Piano", el cual funca sin problemas..

saludos.

vocho6:
Hola... Estoy utilizando un parlante de 5w y 4 ohm ..

Definitivamente era sobrecarga del pin.

Con este parlante no se alcanza a escuchar nada que venga directamente del Arduino, debido que este no tiene la suficiente potencia para lidiar con algo así.
Si con el parlante no se alcanza a oír nada, entonces ya es hora que busques un amplificador adecuado.

Lucario.
Buscaré otro parlante de menor valor.. Pero lo que si me llama la atención es por qué funciona bien con la programación original, considerando que está basado en ese.

No.!!
Tienes que armar un filtro pasabajos y luego no uses un parlante si no esta amplificado.
Puedes usar un par de parlantes de PC, busca un adaptador hembra y luego del filtro pasabajos podrás hacer que funcione.
Aca tienes un enlace para calcular los valores del Filtro Pasa bajos en función de la frecuencia que vas a usar.

Chuu ya se me complicó... en resumen. Directamente con arduino solo y un simple parlante NO se puede hacer lo que necesito?

Un parlante es una carga de 4 u 8 ohms
Si tu le aplicas 5V como salida de un pin digital tienes

5/8 = 625 mA
Eso es mas que toda la corriente que permite el arduino (500mA) en total, ni siquiera en su salida.
Y si un pin solo puede entregar 40mA MAXIMO imagina donde estas metido.
Ahora.. vamos a lo concreto.
Si es para uso de los bomberos, tu quieres alertar a quien con un Arduino usando un pin y un parlante?
Necesitas POTENCIA!!!

mmmm claro claro.. ya entiendo, pero una ultima consulta.. Como bien dice Sonido para bomberos, este Sonido no Será emitido por un alto parlante ni nada por el estilo... Se pretende conectar a un Equipo de radio por unos de Sus Pin de accesorios ( configurables para otras funciones), entonces el sonido que se emite de la tarjeta iría conectado directamente al radio; Considerando esto, es necesario aun amplificarlo? .. Muchas gracias. Un abrazo

No tienes que amplificarlo pero si.. con mayor razón ponerlo en términos que corresponde.
MIra entonces que valores admite la entrada de radio que mencionas. Seguramente 1vpp pico a pico.
Asi que hay que ajustar eso.

Que tal estimado, disculpe la demora.. Pero le cuento.. de tanto rebuscar encontré el detalle que afectaba que no tuviese audio!! faltó una pequeña información, pero valla desde luego que me ha costado ajjaja..

Pero aun así siguiendo con vuestra programación cada sonido sigue siendo dependiendo del pulsador, es decir; si lo presiono suena y deja de sonar al momento de soltar el pulsador! :frowning: podrían continuar ayudándome con esto.

dejo el codigo:

/* 
Tonos para bombero 
*/ 

// se definen las constantes 
// se declaran las frec. 
int incendio      = 100;
int  otros        = 45; 
int  atencion     = 300; 

//se declaran los pina cada tono 
const byte pulsador_incendio = 8; 
const byte pulsador_otros    = 7; 
const byte pulsador_atencion = 6; 

// se define las notas a reproducir F:Hz 
int sonidos_todos [ ]   = {incendio, otros, atencion}; 
int pulsadores[ ]     = {pulsador_incendio, pulsador_otros, pulsador_atencion}; 
int pulsador_activado   = 0; 
int pulsador_actual; //se delcara como variable local 
int pulsador;

void setup() { 
//se define los pin de entrada y salida 
for (int pin=6; pin>0; pin--) {
     pinMode(pulsadores[pin] , INPUT); 
} 
}

void loop() { 

       //el bucle analiza el estado de los 3 pulsores 
for ( pulsador = 0; pulsador < 3; pulsador++) { // solo hay 3 pulsadores definidos
  pulsador_actual = digitalRead(pulsadores[pulsador]); //se lee el estado del pulsador 
      // si se presiono, se procede a reproducir la nota 
  if (pulsador_actual == HIGH) {  
  tone(13, sonidos_todos[pulsador]);
     // grabamos el pulsador que ha sido activado 
    pulsador_activado = pulsadores[pulsador]; 
  break; 
      // si soltamos el pulsador activo apagamos cortamos el sonido 
  if (digitalRead(pulsador_activado) == LOW) { 
  noTone(13); 
    
  } 
} 
switch(pulsador_activado)
{
   case 1:
      tone(13, sonidos_todos[pulsador]);  
      delay(150);
      noTone(13);
      delay(150); // repetir si es el caso
      break;

  case 2: 
      tone(13, sonidos_todos[pulsador]);
      delay(4000);
      noTone(13);
      break;

  case 3: 
      tone(13, sonidos_todos[2]);
      delay(5000);
      tone(13, sonidos_todos[1]);
      delay(5000); // repetir si corresponde
      break;
}


} 
}
if (digitalRead(pulsador_activado) == LOW) { 
  noTone(13); 
    
  }

Tendrá que desaparecer entonces...

Y para que se detenga, tendrás que ponerle un tiempo al último tone de cada case. O si necesitas que se repita durante un lapso predeterminado, entonces cada case deberá quedar así:

case 1:
      for (byte t = 0; t < 7; t++) {
      // Para que dure cierta cantidad de segundos, se calcula así: (segundos * 1000) / [sumatoria de todos los delay]. En este caso los segundos son 2.
      // Note que se está trabajando con números enteros,  por eso el resultado de esta operación matemática se debe "redondear" o "truncar"

      tone(13, sonidos_todos[pulsador]);  
      delay(150);
      noTone(13);
      delay(150); // repetir si es el caso
      }
      noTone(13); // En este caso la llamada acabó siendo redundante, pero para el resto de cases puede que no lo sea.
      break;