Problema con la funzione millis


salve, siccome sto imparando da poco la funzione millis, vorrei un aiuto per risolvere un problema con il mio sketch.

questo sketch mi permette di simulare, per il mio modellino, l'accensione della luce interna dell'abitacolo all'apertura degli sportelli e contemporaneamente l'accensione delle frecce direzionali (dopo ogni 8 secondi si accendono prima le quattro frecce, poi solo quelle di sinistra ed infine solo quelle destra. poi dovrebbe ripartire da capo).
all'inizio ho utilizzato la funzione "for", ma la luce dell'abitacolo si accendeva dopo che aveva terminato il ciclo delle frecce direzionali.
ora studiano un po' la funziona millis, l'ho utilizzata e ora va meglio, però sorge un problema, cioè una volta che tutto il ciclo dell'accensione delle frecce direzionali è terminato, ovviamente non si accendono più, poiché quel dato tempo è passato.
ora vi chiedo come posso fare per azzerare il millis() e far ricominciare da capo il ciclo delle frecce direzionali?

grazie.

questo è lo sketch che ho creato:

code: [select]


/*
  sketch che permette di simulare l'accensione della luce nell'abitacolo
* all'apertura degli sportlli e contemporaneamente simulare l'accensione
* delle frecce direzionali alternando: quattrofrecce - frecce sx - frecce dx.
*/

int freccesx=13; //frecce direzionali sinistra
int freccedx=12; //frecce direzionali destra
unsigned long intervallosx=400;
unsigned long intervallodx=400;
int statofresx=low;
int statofredx=low;
unsigned long precedente_millissx=0;
unsigned long precedente_millisdx=0;
unsigned long tempo=0;
int lampada=11; //luce abitacolo
int sportello_sx_dx=10; //accende e spegne la lampada all'apertura degli sportelli

//inizializzazione
void setup()
  {
  pinmode(freccesx, output);
  pinmode(freccedx, output);
  pinmode(lampada, output);
  pinmode(sportello_sx_dx, input_pullup); //con la pullup ho attivato la resistenza interna dell'arduino
  }

//loop

void loop()
  {
   frecce();
   lampada();
  }
 
  //accende e spegne la luce abitacolo tramite le portiere sx e dx
 void lampada(){
 
  int lampada_interna = digitalread(sportello_sx_dx);
   
    if (lampada_interna==high) {
      digitalwrite(lampada, high);
  }
    else {
      digitalwrite(lampada, low);
  }
 }
 
 //frecce direzionali 
void frecce()
  {
  tempo=millis();
 
//accende contemporaneamente le frecce direzionali destra e sinistra per 8 secondi e poi le spegne
 if(tempo<10000){
  if(millis()-precedente_millisdx > intervallodx){
    precedente_millisdx=millis();
    statofredx ^= 1;
    digitalwrite(freccedx, statofredx);
  }
 
  if(millis()-precedente_millissx > intervallosx){
    precedente_millissx=millis();
    statofresx ^= 1;
    digitalwrite(freccesx, statofresx);
  }
 }

 //accende la freccia sinistra per 8 secondi e poi la spegne

  if((tempo>9000)&&(tempo<18000)){
  if(millis()-precedente_millissx > intervallosx){
    precedente_millissx=millis();
    statofresx ^= 1;
    digitalwrite(freccesx, statofresx);
  }
 }
 
 //accende la freccia destra per 8 secondi e poi la spegne

  if((tempo>18000)&&(tempo<29000)){
  if(millis()-precedente_millisdx > intervallodx){
    precedente_millisdx=millis();
    statofredx ^= 1;
    digitalwrite(freccedx, statofredx);
  }
 }
}


 

ora vi chiedo come posso fare per azzerare il millis() e far ricominciare da capo il ciclo delle frecce direzionali?
la funzione millis si azzera in automatico dopo circa 50 giorni di attività, non si influisce mai con il suo aggiornamento, per tanto viene resa pubblica una funzione e non la variabile in se, cosi si può definire questa in sola lettura.
la funzione millis va solo adoperata in operazioni differenziali (valoreattuale-valorediinizio) in questo modo contano le differenze tra la seconda lettura di millis e la prima e il valore assoluto di millis non rappresenta altro che un riferimento. adoperata in questo modo puo creare problemi solo in caso di reset, ma raramente un applicazione arduino rimane attiva per più di 50 giorni, e se anche questo dovesse capitare in molti casi non causa che errori minimali, negli altri si prendono precisi (e semplici) provvedimenti.


Arduino Forum > International > Italiano > Software (Moderator: leo72) > Problema con la funzione millis


arduino

Comments