Go Down

Topic: Come faccio a gestire tempi lunghi? (Read 5613 times) previous topic - next topic

astrobeed


non hai problemi di overflow.


La sua è solo una scusa per spronarti a realizzare il LeOS II  :smiley-mr-green:
Scientia potentia est

leo72

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

astrobeed


Il leOS2 esiste già  ;)


Allora vuole almeno il Service Pack 1  :smiley-mr-green:
Scientia potentia est

PaoloP


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?

astrobeed


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.

Code: [Select]

/* Millis reset

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

timer0_millis = 0; // per resettare millis()

Scientia potentia est

leo72


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

Non serve, usando dati di tipo unsigned long si parla sempre di numeri positivi.

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.


Ma si può resettare via software il millis()?

BaBBuino

Nello specifico devo far partire una sirena solo dopo 2 minuti che è avvenuto un evento, un HIGH, un CHANGE, quello che volete. Come fareste?

E la sirena suona per un minuto, poi si silienzia.

Evento();  //PIR che lancia un allarme
.
.
. (2 min di ritardo)
.
.
SirenaON();  //sirena che suona
.
. (1 min di ritardo)
.
SirenaOFF(); //sirena che si spegne

Janos

#23
Mar 19, 2013, 09:14 pm Last Edit: Mar 19, 2013, 09:17 pm by Janos Reason: 1
Code: [Select]

unsigned long int tempoEvento;
bool eventoAvvenuto;
if (evento()) {
 tempoEvento = millis();
 eventoAvvenuto = true;
}
if (eventoAvvenuto) {
 if (millis() - tempoEvento >= 2000) {
   digitalWrite(sirena,HIGH);
 }
 if (millis - tempoEvento >= 3000) {
   digitalWrite(sirena,LOW);
   eventoAvvenuto = false;
 }
}


Questo non tiene di conto della condizione che avvemga un secondo evento mentre stai gestendo il primo.

P.S. tempoEvento e eventoAvvenuto devono essere variabili globali o quantomeno (non sono sicuro che funzioni, prova) le devi definire static, altrimenti al ciclo successivo le perdi.

BaBBuino

E con questo allarme sempre collegato alla rete non ho i problemi dei 47 giorni?

leo72


Ma si può resettare via software il millis()?


Forse te la sei persa:

Code: [Select]

/* Millis reset

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

timer0_millis = 0; // per resettare millis()



BaBBuino



Ma si può resettare via software il millis()?


Forse te la sei persa:

Code: [Select]

/* Millis reset

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

timer0_millis = 0; // per resettare millis()





Grazie Leo, prendo e segno sul quadernetto del codice utile!

nid69ita

Quote

Grazie Leo, prendo e segno sul quadernetto del codice utile!


E come non ri-quotare?   Ma Leo, ma ma ma quante ne sai?!!!

Che cosa hai letto oltre ai manuali di Arduino? Manuali degli Amtel?
Li ci sono molte delle info che hai su Arduino e la sua programmazione avanzata, come gl interrupt?
my name is IGOR, not AIGOR

astrobeed


E come non ri-quotare?   Ma Leo, ma ma ma quante ne sai?!!!


Senza voler togliere nulla a Leo, però il metodo per resettare la millis() è opera mia, la prima volta l'ho postato un paio di anni fa qui :)
Scientia potentia est

leo72

@nid69 e Babbuino:
il metodo l'ha postato astrobeed, avete perso il post  ;)


Che cosa hai letto oltre ai manuali di Arduino? Manuali degli Amtel?
Li ci sono molte delle info che hai su Arduino e la sua programmazione avanzata, come gl interrupt?

Tutte le info che so le ho imparate leggendo il datasheet, sperimentando, e studiando il codice degli altri (ecco perché ringrazio l'opensource).

Go Up