Come faccio a gestire tempi lunghi?

Come faccio a far partire un allarme solo dopo 2 minuti dall'innesco (HIGH su un Input), senza usare un delay da 200 milioni di millisecondi?

funzione millis();. Lavori on un if.Quando la funzione millis supera il tempo da te impostato allora fa partire l'allarme. Ti riporto il link di tutte le informazioni sulla funzione millis();

http://arduino.cc/en/Reference/millis

Volevo consigliarti la mia libreria secTimer, che misura il tempo in secondi invece che in ms come fa la millis ma non vorrei che poi trovassi dei bug anche in quella :sweat_smile:

Azz.. tira fuori subito il Link (sempre che non mi fai prendere un altro virus, questa volta della Guardia di finanza!)

In questo schetch non ho interrupt, Timer, Wire, ne GLCD. Un semplice LCD con LiquidCrystal, potrei non trovare bug... :D

Tutte le mie lib sono da un po' anche su GitHub, lì sei sicuro che non c'è "monnezza" :sweat_smile: https://github.com/leomil72

francescoprisco: funzione millis();. Lavori on un if.Quando la funzione millis supera il tempo da te impostato allora fa partire l'allarme. Ti riporto il link di tutte le informazioni sulla funzione millis();

http://arduino.cc/en/Reference/millis

No, millis mi è antipatica perchè va in overflow.

leo72: Tutte le mie lib sono da un po' anche su GitHub, lì sei sicuro che non c'è "monnezza" :sweat_smile: https://github.com/leomil72

Ma cosa usa? Sempre il millis? Non vorrei che dopo i soliti 47 giorni di continuamente acceso, mi va in crash...

Ho scaricato la libreria, grazie Leo. Domani vedo se funzia...

BaBBuino:
No, millis mi è antipatica perchè va in overflow.

Con un controllo oportuno non sbagli i tempi neanche durante un overflow. Le cose diventano problematiche solo quando un tempo é telmente lungo che ci capitano 2 o piú overflow.
Ciao Uwe

Per dirla tutta, c'è il modo (anzi ce n'è più d'uno) per evitare i problemi di millis. ;)

leo72: Per dirla tutta, c'è il modo (anzi ce n'è più d'uno) per evitare i problemi di millis. ;)

Avast mi dice che la pagina web contiene un cavallo di troia.

Ok. Oggi piallo il sito e metto Joomla, mi sono rotto il coccige....

Con un controllo oportuno non sbagli i tempi neanche durante un overflow. Le cose diventano problematiche solo quando un tempo é telmente lungo che ci capitano 2 o piú overflow.

Per dirla tutta, c'è il modo (anzi ce n'è più d'uno) per evitare i problemi di millis. smiley-wink

Ho letto l'articolo di Leo: evita anche i problemi accennati da Uwe? Io vorrei che il mio progetto funzioni per degli anni....

PS: Nella soluzione 1, la riga appena sotto l'immagine recita "La differenza (convertita in una variabile di tipo signed) fra millis() e overflow"... credo dovrebbe essere fra millis() e intervallo.

BaBBuino: No, millis mi è antipatica perchè va in overflow.

Il fatto che va in overflow dopo 47 e rotti giorni non significa che il tuo programma smette di funzionare, in tutti i casi puoi resettare a tuo piacere la millis(), evitando di fatto che vada in overflow, non appena hai terminato i vari cicli di delay che ti servono.

Se il controllo su millis() lo fai nella forma esposta nel mio articolo, ossia MILLIS - TEMPO_PRECEDENTE > INTERVALLO

non hai problemi di overflow.

leo72:
non hai problemi di overflow.

La sua è solo una scusa per spronarti a realizzare il LeOS II :grin:

Il leOS2 esiste già ;) Ho già iniziato a lavorare al leOS3 ma non ho molto tempo per starci dietro :sweat_smile:

leo72: Il leOS2 esiste già ;)

Allora vuole almeno il Service Pack 1 :grin:

leo72: Se il controllo su millis() lo fai nella forma esposta nel mio articolo, ossia MILLIS - TEMPO_PRECEDENTE > INTERVALLO

non hai problemi di overflow.

E se fai: abs(Millis - tempo_precedente) > Intervallo non è meglio?

PaoloP: E se fai: abs(Millis - tempo_precedente) > Intervallo non è meglio?

Ancora più semplice, e nel caso non ti servono ritardi maggiori di 6.5 secondi basta utilizzare valori interi invece di long int.

/* Millis reset

 */
extern unsigned long timer0_millis; // dichiarazione per accedere al contatore di millis

timer0_millis = 0; // per resettare millis()