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.
Hi Leonardo, i’m using your library with a new Uno, however the timer is giving me 2 second accuracy, not 1second, any ideas?
thanks
james
To be more precise, if i take a timer reading, wait exactly 60 seconds then take another reading, the timer value change is only 30 seconds
thanks
james
I’ll check it. Can you provide me the code that you’re using or a portion of it that reproduce the problem?
Ciao Leonardo, innanzitutto grazie per le librerie e gli articoli che ci proponi.
Riguardo alla libreria SecTimer in versione 0.4 ho anche io il problema del secondo che non è un secondo (utilizzo ArduinoUno), bensì ogni secondo che conta la libreria, nel tempo reale trascorrono due secondi.
Nella libreria in versione 0.2 questo non accadeva, è ancora possibile scaricare la vecchia versione che ho malauguratamente perso causa un format?
Grazie mille,
Francesco.
Grazie per la segnalazione. Avevo commesso un grosso errore nella riscrittura della libreria. Ora la versione 0.4.1 funziona nuovamente.
salve Leonardo, innanzitutto complimenti per i tanti articoli e progetti messi a disposizione per tutti. Ti volevo chiedere per quanto riguarda la libreria SecTimer molto interessante sia per il funzionamento ma sopratutto per la sua durata, ovviamente mi riferisco ai 136 anni, ti volevo chiedere in primis ti dico subito è da poco che sono entrato nel mondo arduino quindi per l’uso della libreria vorrei usarla come timer ritardato per un accensione ad esempio di un led tipo alla premuta di un tasto si accende dopo 30 secondi oppure 60 ecc purtroppo con questa libreria no ci sono riuscito mentre con la miilis sono riuscito, ma ci tengo piu ad usare la tua libreria quindi se hai un po di pazienza di farmi un esempio ti sarei molto grado grazie in anticipo.
This is great, thank you Leonardo.
Is there an easy way of counting down with the library?
(otherwise I’ll subtract the timed time from a total time I suppose).
Thank you
The lib doesn’t count down by itself. You have to implement a little piece of code that subtracts a second each time the lib increments the seconds’counter
Ciao Leonardo volevo chiederti una delucidazione, anche io avrei necessità di ritardare l’accensione di una luce dopo aver premuto il pulsante ed ho provato ad inserire il timer dentro la funzione if ma in realtà non funziona,potresti instradarami meglio su come programmare un comando ritardato con la libreria sectime? Grazie mille in anticipo.
Ciao Leonardo, sto utilizzando egregiamente la tua libreria secTimer su Arduino UNO.
Per un ulteriore progetto la vorrei utilizzare anche con Arduino UNO R4 Minima. Purtroppo mi viene segnalato l’errore di compilazione “#error Sorry, microcontroller not supported!” e “#error Clock frequency not supported”. Sicuramente ne sarai al corrente e ti sarei grato se potessi indicarmi una soluzione in merito.
Ti ringrazio per la cortese attenzione.