Arduino binära väckarklocka (12 / 16 steg)
Steg 12: Larmsignal
Det är ganska lätt att skapa ljud på arduino bara med digitalWrite() och delay() för att växla staten av högtalare klämmer fast i rätt frekvens. Men för detta projekt behöver jag ständigt kontrollera knapparna, uppdatera klockan och uppdatera displayen, även när larmsignalen spelar. Därför måste den sunda generationen vara icke-blockerande, vilket innebär att du slipper vänta på tonerna till slut innan du gör något annat.Därför använde jag tonar bibliotek skrivna av Brett Hagman för att generera ljud. Det är en riktigt trevlig bibliotek vilket gör det lätt att spela olika toner, och bäst av allt, det är icke-blockerande.
Eftersom den melodin bör vara icke-blockerande jag kunde inte bara använda en för-loop för att gå igenom tonerna. Istället använde jag if-satser. varje gång funktionen melodi är kallas det kontroller om den sista tonen har slutat spela, om den har det börjar nästa. "Melodin" Jag har använt är bara C, D, E, F, G, A, B, C först spelade en efter varandra, sedan alla andra, sedan varje tredje och så vidare.
_______________________________________________________________________
Funktionen play_melody():
"INRE" VARIABLER FÖR PLAY_MELODY FUNKTION:
int melodi [] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int melody_length = sizeof(melody) / 2; Melody längd, för looping.
sizeof() returnerar storleken på matrisen i byte, och eftersom
en int är 2 byte, sizeof returnerar 2 * (antalet vektorelement)
int jag = 0; loop variabel
booleska reset_loop = sant;
int hoppa = 1; Hur många anteckningar att hoppa i matrisen melodi
int position = 0; placera i melodi matris
void play_melody()
{
om (! () tone_maker.isplaying())) / / om den sista tonen har slutat
{
IF(i {
tone_maker.stop();
tone_maker.Play (melodi [läge], 300);
En paus mellan anteckningar...
Delay(300); Ersätt med icke-blockerande.
om (DEBUG)
{/ / Om felsökning, rapport loop, tonar, beat, och varaktighet
Serial.Print(position);
Serial.Print(":");
Serial.Print(Melody[position]);
Serial.Print("\n");
}
ställning + = hoppa;
om positionen är större än matrisen, starta från början av array:
läge = position % melody_length;
i ++;
}
annat
{
hoppa + +;
Jag = 0;
}
}
}
_______________________________________________________________________