Paso 12: Señal de alarma
Es bastante fácil de generar sonido en arduino sólo usando digitalWrite() y delay() para alternar el estado de la clavija del altavoz en la frecuencia correcta. Pero para este proyecto necesito constantemente Revise los botones, actualizar el reloj y actualizar la pantalla, incluso cuando se está reproduciendo la señal de alarma. Por lo tanto la generación de sonido tiene que ser sin bloqueos, que significa que no tienes que esperar a que los tonos poner fin antes de hacer cualquier otra cosa.Por lo tanto utilicé la biblioteca tono escrito por Brett Hagman para generar sonido. Es una biblioteca muy agradable que hace que sea fácil reproducir tonos diferentes, y lo mejor de todo, es no bloqueando.
Porque el la melodía debe ser bloqueo no sólo no podía utilizar un bucle for para recorrer los tonos. En su lugar he usado declaraciones de if. cada vez que la función de la melodía es llamado comprueba si el tono último ha dejado de jugar, si tiene comenzará otro. La "melodía" que he utilizado es simplemente C, D, E, F, G, A, B, C primero jugó uno después de otro, entonces todos los demás, entonces cada tercera y así sucesivamente.
_______________________________________________________________________
La función play_melody():
FUNCIÓN DE VARIABLES "INTERNAS" PARA PLAY_MELODY:
melodía de int [] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int melody_length = sizeof(melody) / 2; Longitud de la melodía, para bucle.
sizeof() devuelve el tamaño de la matriz de bytes y porque
un int ocupa 2 bytes, sizeof devuelve 2 * (número de elementos de la matriz)
int i = 0; variable de bucle
Boolean reset_loop = true;
salto de int = 1; Cuántas notas para saltar en la matriz de la melodía
int posición = 0; posición en matriz de melodía
void play_melody()
{
Si (! () tone_maker.isPlaying())) / / si se ha detenido el último tono
{
if(i {
tone_maker.STOP();
tone_maker.Play (melodía [posición], 300);
Una pausa entre las notas...
Delay(300); reemplazar con no bloqueando.
si (depurar)
{/ / Si depuración, Informe lazo, tono, ritmo y la duración
Serial.Print(Position);
Serial.Print(":");
Serial.Print(Melody[Position]);
Serial.Print("\n");
}
posición += salto;
Si la posición es más grande que la matriz, a empezar desde el principio de matriz:
posición = posición % melody_length;
i ++;
}
otra cosa
{
salto ++;
i = 0;
}
}
}
_______________________________________________________________________