Arduino / Programmazione · 18 aprile 2012 11

Nuova libreria secTimer per Arduino e MCU Atmel

Ho notato che ultimamente molti si lamentano del fatto che la funzione millis() vada in overflow dopo 49,7 giorni, creando non pochi problemi nel calcolo di intervalli temporali maggiori di tale periodo.
Riprendendo il lavoro fatto per la mia libreria swRTC ho deciso di creare una nuova libreria che ho, molto semplicemente, rinominato secTimer.

Questa libreria altro non fa che attivare un timer interno dell’Arduino (o del micro nel caso si voglia usare su progetti in standalone) per gestire un contatore di secondi. Quindi il tempo minimo che può gestire questa libreria è il SECONDO, non può gestire intervalli inferiori. Ma questo intervallo va più che bene per operazioni che devono essere eseguite molto tempo l’una dall’altra, come ad esempio attivare dispositivi (relé per accensione luci, LED ecc…) oppure per leggere ogni tanto un sensore (temperatura, ecc…).

Qual è il vantaggio di secTimer rispetto all’uso di millis()? Che millis(), come detto, va in overflow dopo 49,7 giorni. Timer, invece, va in overflow dopo 136 ANNI! Questo significa che il vostro dispositivo cesserà di funzionare ben prima che la libreria riparta da zero!

La libreria si scompatta nella propria cartella delle librerie. Consiglio l’uso della cartella /libraries all’interno della propria cartella degli sketch (/home/utente/sketchbook per Linux o /Documenti/Arduino per Windows). Una volta installata, basta includerla nel proprio progetto, crearne un’instanza, far partire il contatore e poi leggere i secondi al momento del bisogno. Tutto è ben capibile aprendo lo sketch timerLed incluso con la libreria.

Ho scelto di dotare la libreria delle funzioni di avvio e arresto del contatore perché, visto che va ad utilizzare un timer hardware del microcontrollore, potrebbe capitare la necessità di usare temporaneamente quel timer per altri compiti per cui si può arrestare la libreria, prendere il controllo del timer, eseguire i propri compiti e poi riavviare la libreria.

L’impatto sulla dimensione del codice è limitato, circa 350 byte (compilando per Arduino): BlinkWithoutDelay genera sul mio sistema uno sketch di 992 byte mentre timerLed genera uno sketch di 1342 byte.

La libreria supporta numerosi microcontrollori, dagli Atmega328 (Arduino UNO) agli Atmega32U4 (Arduino Leonardo) agli Atmega2560 (Arduino MEGA) per finire agli Atmega644/1284 (l’elenco completo è presente nel file readme.txt) nonché tutti i microcontrollori supportati dal core Tiny (Attiny84/85/2313 ecc.).

La licenza è, ovviamente, GNU GPL versione 3.0 o successive.

NOVITA’:

ho aggiornato la libreria modificando il nome in secTimer, per evitare confusione con un’altra libreria che si chiama Time. Inoltre nel file allegato trovate anche una modifica per il core Arduino 002x nel caso utilizziate questa versione dell’IDE. Questa modifica permette di avere una nuova funzione denominata delaySeconds usando lo stesso algoritmo di calcolo temporale utilizzato dall’Arduino, non perdendo quindi un timer. La modifica funziona però solo con l’Arduino IDE.

secTimer
secTimer
secTimer_1.0.0.zip
Version: 1.0.0
105.4 KiB
6610 Downloads
Dettagli...