dubbio gestione millis()

Ciao a tutti

come da titolo chiedo un consiglio sulla funzione millis()

Ho tre sensori che rilevano la presenza di un oggetto: presenza=HIGH assenza=LOW

Appena il sensore rileva la presenza dell'oggetto deve partire un contatore di tempo.

stato_s3=0;
void lettura() {

while (stato_s3 != 1){

s1 = digitalRead(sensore1);
s2 = digitalRead(sensore2);
s3 = digitalRead(sensore3);

if (s1==LOW){ts1=millis();stato_s1=1;}
if (s2==LOW){ts2=millis();stato_s2=1;}
if (s3==LOW){ts3=millis();stato_s3=1;}

  }

}

Il problema è che ts1, ts2 e ts3 vengono continuamente riscritti, e quindi il tempo finale memorizzato non è il primo istante nel quale il sensore rileva l'oggetto, bensì l'ultimo istante prima che l'oggetto esca dalla portata del sensore.

Esempio il sensore rileva l'oggetto, ma se l'oggetto si ferma sul sensore la variabile ts viene continuamente riscritta, in questo modo il tempo memorizzato nella variabile sarà il tempo dopo il quale quale l'oggetto è uscito dalla portata del sensore.

Pensavo di risolvere così:

if ((s1==LOW) && (stato_s1==0)){ts1=millis();stato_s1=1;}

cosa ne pensate? esistono altri modi?

Ringrazio in anticipo

ciao :)

max95: Appena il sensore rileva la presenza dell'oggetto deve partire un contatore di tempo.

quando dici che deve partire un contatore cosa intendi?

perchè la funzione millis() ti dice da quanto tempo è in esecuzione il programma in millisecondi (c'è anche un forum molto completo dove viene trattato in modo approfondito la funzione millis(), ma non ricordo il link)

il fatto che la variabile venga riscritta è normale... perchè millis() viene aggiornata ad ogni ciclo loop, e quindi se l'IF è ancora in TRUE la variabile si aggiorna....

MD

Puoi usare una flag, oppure un'interrupt ... se usi la flag, puoi fare come dici tu, ovvero, la flag a zero inizialmente, nell'if controlli sia che sia a zero sia che ci sia la lettura, quando c'e' la lettura memorizzi il valore di millis in una variabile e metti la flag ad uno, cosi non ripete piu l'operazione (ovviamente, quando il tutto finisce, devi anche rimettere la flag a zero ;)) ... se invece vuoi usare un'interrupt, lo setti come "rising", e leggera' solo il passaggio da zero ad uno, poi nella ISR memorizzi millis (oppure una flag che dira' al resto dello sketch cosa fare)

Ma se ti serve sapere per quanto tempo rimane l'oggeto davanti al sensore, la flag forse e' la cosa piu semplice ... metti due if consecutivi, il primo lo esegui solo se l'ingresso e' alto e la flag a zero, memorizzi millis e metti la flag ad uno, il secondo l oesegui solo se l'ingresso e' low e la flag ad uno, cosi leggera' solo il momento in cui l'oggetto se ne va, a quel punto li dentro ci calcoli il tuo tempo e rimetti la flag a zero ...

millis() è il tempo che parte da quando attivi il loop per sfruttarlo ti serve un cronometro.....unsigned long poi decidi quando accendere il cronometro e quando spegnerlo

Puso: millis() è il tempo che parte da quando attivi il loop ..

Parte da parecchio prima, praticamente da pochi microsecondi dopo aver avviato Arduino dato che è un contatore creato all'avvio (tra le prime cose) dal "core".

Guglielmo

max95: Ho tre sensori che rilevano la presenza di un oggetto: presenza=HIGH assenza=LOW Appena il sensore rileva la presenza dell'oggetto deve partire un contatore di tempo.

Ok, questa è l'esigenza. Ma prima di tutto metterci uno spezzone del tuo codice non ci permette di capire in che contesto lo stai usando, posta l'intero sketch.

Nel frattempo tu nel codice che ci hai mostrato hai messo una funzione "lettura()" che verifica l'output dei 3 sensori ma li confronti con LOW, ossia da tue specifiche "assenza di oggetto": quindi all'inizio se non c'è alcun oggetto tutte e tre le if() daranno esito positivo, quindi avrai non solo ts1, ts2 e ts3 impostati con praticamente lo stesso tempo, ma anche le 3 variabili stato_s1, stato_s2 e stato_s3 ad 1, per cui mi chiedo: a che serve 'sta cosa?

Secondo, nella lettura() hai un ciclo dal quale esce se stato_s3 (il terzo sensore) è uguale ad 1, ma lo sarà già al primo ciclo, per cui, di nuovo: ma a che serve?

Allora, a parte postare l'INTERO sketch, inizia a farne una versione con UN sensore, fallo funzionare (o postalo qui se non riesci), e solo allora potrai iniziare a pensare di espanderlo. Com'è adesso è solo una perdita di tempo ed un generatore di confusione mentale.. ;)