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.
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 ]
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!
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
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