Nuova libreria secTimer

Delay non è propriamente un blocco, dice all'Arduino di infilarsi in un loop per un tot periodo di tempo. Non è giusto dire che "blocca" l'Arduino perché l'Arduino non è bloccato, sta solo eseguendo questo ciclo.

Secondo il mio punto di vista non vedo necessario un delay2: se devi fare un blocco molto lungo puoi usare seconds(). E non è un grosso problema.

tempo=seconds()+100;
while(seconds()<tempo){}; //attende 100 secondi

Oppure crearti tu una semplice funzione accessoria:
void delay(unsigned long intervallo) {
unsigned long tempo=seconds()+intervallo;
while(seconds()<tempo){};
}

Poi forse non ho capito le tue necessità. :sweat_smile:

io non ho necessita', mi faccio portavioce delle necessita' terrestri :slight_smile:

sarebbe utile avere oltre al delay normale, che e' giusto sia fatto cosi', un delay2, il quale invece di essere "bloccante" (passami questo termine, poco tecnico ma che fa capire) utilizzi non solo millis, ma anche il tuo metodo per arrivare ai 136 anni di overflow.

io la userei in tutti i progetti, capisco che gia' ora la tua secTimer fa questo, ma poter dire ad una persona che cerca aiuto, magari non esperta:

invece di delay(1000); usa delay2(1000);

e' molto piu' veloce, utile, pratico, di spiegargli il millis standard o la secTimer

Concettualmente non è fatta bene. Ti spiego.
delay è un comando che serve ad introdurre un ritardo, ossia infilare il micro in un ciclo dal quale uscire solo dopo un certo lasso di tempo.

Se non si vuole introdurre un ritardo che impedisce di eseguire altri compiti, allora il delay non è il comando che serve. Si deve usare qualcos'altro, come la funzione metro che programma l'esecuzione di compiti a predeterminati intervalli.

Mettere delay2(1000) e poi dopo qualcos'altro non ha senso perché allora non lo metto neanche il delay, se il micro continua ad eseguire il comando seguente. Spero di essermi spiegato bene. :sweat_smile:

certo, tu ti spieghi sempre benissimo,
ma se cambiassimo nome ? tipo usa millisVer2(1000);
l'utilita' resta, cioe' avere un ritardo su un'operazione, senza andare a dichiarare la variabile per poi usare millis sulla stessa, e senza pèreoccuparsi di doverla resettare prima dell'overflow

cioe' se anche arduino cambiasse la funzione millis al fine di gestire l'overflow, la millisVer2 continuerebbe ad avere utilita' in quanto immediata.
Non e' proprio questo l'obiettivo di arduino stesso ?

Ma per questo c'è la libreria Metro:
http://www.pjrc.com/teensy/td_libs_Metro.html

Programmi l'esecuzione di un evento ad intervalli regolari. Quale sarebbe la differenza rispetto al metodo da te proposto?
Oppure tu intendi l'esecuzione una tantum di una funzione al posto di metro che invece scadenza per esecuzioni periodiche?

si, una tantum, in qualsiasi momento serve si mette e via.

La cosa migliore sarebbe che l'arduinoteam stesso ci pensasse in modo da non dover usare librerie

Ma l'ArduinoTeam aggiunge funzioni ogni tanto ? o sono sempre le stesse dalla sua creazione ?

Testato:
si, una tantum, in qualsiasi momento serve si mette e via.

Boh. Si potrebbe fare.
L'unica cosa è che il micro, ogni volta che passa da quel punto del codice, controlla se ha eseguito già la funzione. Un piccolo aggravio di calcoli, tutto lì.

La cosa migliore sarebbe che l'arduinoteam stesso ci pensasse in modo da non dover usare librerie

Ma l'ArduinoTeam aggiunge funzioni ogni tanto ? o sono sempre le stesse dalla sua creazione ?

Ogni tanto qualcosa viene cambiato. Ad esempio con la 1.0 hanno introdotto la gestione delle stringhe in Flash (quindi PROGMEM trasparente agli utenti) , hanno riscritto la SoftwareSerial. ecc..

Siccome oggi mi è presa così, ecco una nuova versione del core di Arduino 0022 con implementata una nuova funzione, delaySeconds, che, ovviamente, è basata su seconds().
Sintassi:

delaySeconds(x);

con x che può essere un numero unsigned long di qualunque valore.
Il classico Blink compilato con i delaySeconds(1) al posto dei delay(1000) permette inoltre di risparmiare quasi 60 byte di flash.

Divertitevi :stuck_out_tongue:

PS:
in allegato i file wiring.h e wiring.c da sostituire a quelli presenti in /arduino-xxxx/hardware/arduino/cores/arduino ed il file keywords.txt da sostituire a quello presente in /arduino-xxxx/libs per avere la evidenziatura del comando colorata nell'IDE

delaySeconds.zip (6.18 KB)

Salve,
sono nuovo, volevo un info a riguardo la libreria elapsedMillis. in particolare ho letto da qualche parte che usa la funzione millis(), quindi va in overflow dopo 50 giorni anche questa libreria?
qualcuno sa aiutarmi?
grazie in anticipo

47 giorni e qualche ora.
Comunque se si opera correttamente, il fatto che il contatore si resetti non ha ripercussioni sul software.
--> http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/comment-page-1/

31 secondi più veloce di Testato! :grin:

non la conosco, ma comunque si puo' evitare il problema usando millis cosi' come fa l'esempio Millis Without Delay presente nell'IDE stesso
Ti rimando ad un articolo del "maestro" Leo che spiega il come viene evitato il problema, ma ripeto, l'implementazione di millis in BlinkWithoutDelay non ne soffre
http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/

p.s. x PaoloP abbiamo scritto insieme, noto con piacere che abbiamo avuto gli stessi "maestri" :stuck_out_tongue:

---- nota del moderatore del 29.02.2016
@nelu24: ho separato io il tuo post e ho creato un thread separato dato che questo è relativo ad una specifica libreria