problema con time / comandi in parallelo

salve a tutti o una domanda che riguarda i comandi in parallelo se così si possono chiamare il mio problema sta ne l codice

faccio un codice più corto che assomiglia al mio in modo che è più facile da comprendere

esempio :

  void setup() {                
    pinMode(13, OUTPUT);
    Serial.begin(9600);   
  }
int x=0;
  void loop() {
    delay(10000);
    x=x+5;
    Serial.print(x);
    
    //altro codice che non deve essere bloccato
    digitalWrite(13, HIGH);   
    delay(5000);               
    digitalWrite(13, LOW);    
    delay(5000);              
    
  }

questo semplice codice prevede che ogni 10 sec venga stampato un testo e nel frattempo dovrebbe accendere e spegnere ogni 5 sec un led. ovviamente si vede a colpo d'occhio che il led si accende, passano 5 sec poi si spegne e invece di 5sec passano 15 sec perché ci sono i 10 sec del codice per stampare la variabile.

in conclusione quello che voglio dire e come posso fare due cose separate in modo che il tempo di attesa dei due blocchi di codice non influisca tra loro.

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

ok grazie provo a vedere anche se il mio reale problema non è proprio stampare e in più lampeggiare un led ma è contare il numero di impulsi in un pin e stamparli su monitor in più ogni 20 minuti deve fare una media e stampare anche quella insomma ci provo :)

e se proprio vuoi un esempio pronto con i led ti basta caricare "Blink without Delay" che trovi nei tutorial digital di arduino. Da quello che scrivi sembra che tu voglia contare gli impulsi del contatore enel ]:D

Certo, se devi fare qualcosa di impossibile il problema è un altro ma la funzione millis() ti ritorna i millesimi passati dall'accensione di arduino. Quindi si tratta solo di fare un controllo e di aggiornare una variabile, dovresti farcela! Occhio che dopo circa 50 giorni vai in overflow!

Comunque dovresti fare una cosa come questa http://arduino.cc/en/Tutorial/BlinkWithoutDelay scusami, ma pensavo quest'esempio fosse riportato nel link sopra

ecco grazie ora ho capito comunque se ogni 50 giorni torna a 0 posso calcolare prima che finisce il tempo trascorso non so dico che al giorno 30 una variabile "A" è uguale a "A+1" esempio se a è == a 4 so che sono passati 120 giorni si può fare? una volta arrivato a 30 giorni posso resettarlo io a 0??

Da quello che scrivi sembra che tu voglia contare gli impulsi del contatore enel

no ho una macchina che gira e fa tot giri al secondo, ogni giro mi da un impulso e con un pseudo flip flop memorizzo quanti impulsi sono stati fatti ogni secondo e riportarli in un display lcd in più ogni 20 minuti deve calcolare la media di giri al minuto non so cosa serve ma è una fabbrica che mi ha incaricato di farglielo. comunque riporterò anche per il pseudo flip flop una domanda ma forse domani prima voglio vedere fino dove arrivo :)

Il ragionamento non è sbagliato ma ogni 30 giorni dovresti portare millis() a 0.. e qui non so aiutarti! Altrimenti dovresti sapere esattamente il momento in cui va in overflow, e neanche qui so che dirti :D

Aspetta qualche veterano!

ok grazie :slight_smile:
allora c’è qualche veterano che sa come si porta il millis() a 0 ?

forse riesco ad auto rispondermi :slight_smile: se a qualcuno interessa ho trovato questo :http://www.provalotu.com/robotica-2/millis-scandiamo-il-tempo-del-nostro-arduino/

nel codice d’esempio c’è scritto

time = millis(); // azzera il conteggio del tempo

quindi se li dico

int trenta_giorni=0;
if((time+[30 giorni bisognerebbe calcolare i sec])<millis())//Se sono trascorsi 30 giorni
trenta_giorni=trenta_giorni+1
time = millis(); // azzera il conteggio del tempo
}

come faccio a dirli 30 giorni in secondi è lunghissimo??
comunque che ne dite dovrebbe andare no?

ilmandorlone: come faccio a dirli 30 giorni in secondi è lunghissimo??

Per i miei timer mi sono inventato questo

void BaseTempi(){
  
  TempoAttuale = millis(); // leggo i millisecondi
  
  //PULSE OGNI DECIMO DI SECONDO
  PulseDec = false ;
  if ( TempoAttuale > (TempoDecimi + 100)) {
    PulseDec = true ;
    TempoDecimi = TempoAttuale; // leggo i millisecondi
     }
  if (TempoDecimi > TempoAttuale ){
        TempoDecimi = TempoDecimi - 4294967295 ;
     }
  
    //PULSE OGNI SECONDO
  PulseSec = false ;
  if ( TempoAttuale > (TempoSecondi + 1000)) {
    PulseSec = true ;
    TempoSecondi = TempoAttuale; // leggo i millisecondi
     }
  if (TempoSecondi > TempoAttuale ){
        TempoSecondi = TempoSecondi - 4294967295 ;
     }
  
  } // Fine void BaseTempi()

TempoSecondi = TempoSecondi - 4294967295 ; Con questo controllo il ritorno a 0 di millis Come avrai letto millis arriva a 2^32

Non e' di una precisione estrema come usare gli interrupt ma per fare qualcosa ogni x minuti e tenere attivato un rele' 10" va piu' che bene

Poi lo uso cosi

if ( Error[0] && Error[1] && Error[2] ){
            digitalWrite(ledPin, HIGH);
            DifUp2 = false ;  // Attivo il rele' ed abilito il timer
        } // End if controllo errori

  if (PulseSec && DifUp2 == false){Timer2++;}
  if (Timer2 > 19 && DifUp2 == false){      // attende di arrivare a 20"
      Timer2 = 0 ;
      DifUp2 = true ;     // blocco il timer e spengo il rele
      digitalWrite(ledPin, LOW);
    }  // End Timer2

ilmandorlone: nel codice d'esempio c'è scritto

time = millis(); // azzera il conteggio del tempo

Non è che azzera millis(), cambia il valore alla variabile time. Quindi gli assegna un valore nuovo che in questo caso serve ad azzerare un conteggio

time = millis(); // azzera il conteggio del tempo

quindi non azzera il clock di arduino come se si fosse riavviato?

"Sfornata" proprio ora :P http://arduino.cc/forum/index.php/topic,101938.0.html