Si può fare qualcosa mentre la nota suona ?
Stabilito che una volta lanciato il comando tone() il nostro codice prosegue nasce un problema, dobbiamo stabilire se questo è un bene o è un male.
Se dovessimo semplicemente eseguire delle sequenze di suoni, il fatto che il codice non si fermi ad aspettare che il suono termini è un problema ma, se guardiamo l’elenco delle cose che dobbiamo assolvere con il nostro programma scopriamo che la possibilità di fare altre cose mentre “suona” è una cosa ottima.
Ottima ma non senza qualche problemino, vediamo di capire quela potrebbe essere e come affrontarlo.
Per realizzare il nostro avvisatore acustico stabiliremo dei toni (frequenze) e la loro durata. Fra un tono e l’altro potremmo avere delle pause oppure no ma, per quanto ci riguarda, anche le pause sono dei toni o meglio, dei non toni e anche loro avranno delle lunghezze ben definite.
Per essere sicuri di non avere errori nell’esecuzione della nostra sequenza sonora una delle soluzioni è portare il conto del tempo che passa dopo che abbiamo lanciato un tono e, mentre gestiamo le altre funzionalità richieste dal nostro programma, controlliamo se è il momento di passare al prossimo suono.
Questa soluzione non è l’unica soluzione ne è la migliore dal punto di vista dell’ottimizzazione del codice però, è una di quelle che possiamo attuare usando pochi comandi di base e che comunque ci da buone possibilità di ottenere un risultato accettabile.
Per misurare il tempo che è passato dobbiamo utilizzare una funzione di base che viene fornita dalle funzioni di base di Arduino, questa funzione è la millis() e ogni volta che la utiliziamo, ci dice quanti millisecondi sono passati dall’ultima volta che il microcontrollore è stato resettato.
In effetti le librerie Arduino ci metteno a disposizione anche un’altra funzione che indica il tempo trascorso ed è la micros() la quale ci fornisce il tempo trascorso dall’ultimo reset ma espresso in microsecondi. Questa informazione nel nostro caso è meno comoda da gestire di quella fornita dalla millis() per cui questa volta non la useremo.
Approfondimenti:
1) Arduino reference millis()
2) Arduino reference micros()
Lascia un commento