Stap 12: Alarmsignaal
Het is vrij gemakkelijk voor het genereren van geluid op de arduino door alleen met behulp van digitalWrite() en delay() om te schakelen van de staat van de pin van de spreker in de juiste frequentie. Maar voor dit project moet ik voortdurend controleren van de knoppen, update de klok en de weergave, zelfs wanneer het alarmsignaal wordt afgespeeld. Daarom moet de goede generatie worden niet-blokkerende, wat betekent dat u niet hoeft te wachten voor de tonen te beëindigen voordat u iets anders kunt doen.Dus gebruikte ik de Tone library geschreven door Brett Hagman voor het genereren van geluid. Het is een werkelijk aardige bibliotheek die maakt het gemakkelijk om te spelen van verschillende tonen, en beste van allen, het is niet-blokkerende.
Omdat het de melodie moet niet-blokkerende kon niet gebruik ik gewoon een for-lus doorloopt de tonen. In plaats daarvan tweedehands mij if-statements. iedere keer dat die de functie van de melodie is noemde het controles als de laatste Toon gestopt is met spelen, als er het volgende zal beginnen. De "melody", ik heb gebruikt is gewoon C, D, E, F, G, A, B, C eerst speelde men na elkaar, dan iedere andere, vervolgens elke derde, enzovoort.
_______________________________________________________________________
De play_melody() functie:
"INTERNE" VARIABELEN VOOR PLAY_MELODY FUNCTIE:
int melodie [] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int melody_length = sizeof(melody) / 2; Melodie de lengte, voor een lus.
sizeof() geeft de grootte van de matrix in bytes, en omdat
een int is 2 bytes, sizeof keert 2 * (aantal arrayelementen)
int i = 0; lus variabele
Boole reset_loop = waar;
int sprong = 1; hoeveel notities om te springen in de melodie-matrix
int positie = 0; positie in de matrix van de melodie
VOID play_melody()
{
Als (! () tone_maker.isPlaying())) / / als de laatste Toon is gestopt
{
if(i {
tone_maker.stop();
tone_maker.Play (melodie [standpunt], 300);
Een pauze tussen notities...
delay(300); vervangen door nonblocking.
als (DEBUG)
{/ / Als foutopsporing, verslag lus, Toon, beat, en duur
Serial.Print(Position);
Serial.Print(":");
Serial.Print(Melody[position]);
Serial.Print("\n");
}
positie += sprong;
Als positie groter dan de array is, starten vanaf begin van array:
positie = positie % melody_length;
i ++;
}
anders
{
sprong ++;
Ik = 0;
}
}
}
_______________________________________________________________________