Acquisizione tempi

Salve a tutti,
Sono un neofita di arduino e nonostante sia uno studente di ingegneria elettrica mi trovo qui a chiedere il vostro aiuto.
Non conosco bene i linguaggi di programmazione e i loro termini perciò mi scuso anticipatamente se alla fine il tutto dovesse rivelarsi una sciocchezza.
Il problema è il seguente:
Ho un recipiente con 4 sensori, posti ad altezze diverse, per controllare il livello del liquido che fluisce all'interno del contenitore.
Dai sensori ricevo un segnale analogico.
Appena il liquido raggiunge la sonda 4(la più bassa) inizia il conteggio dei tempi.
Appena il liquido arriverà alla sonda 3 dovrò memorizzare il tempo che è trascorso dal punto 4 al punto 3.
Così sarà per tutte le sonde, sempre riferendosi al punto di partenza 4(4-2 e 4-1).
Arrivato al punto 1 il liquido smetterà di fluire nel contenitore e i tempi rilevati dovranno essere memorizzati e scritti su un lcd.
Riporto di seguito la mia soluzione, so che è sbagliata per un mio errore di comprensione della funzione millis(), in quanto pensavo che essa iniziasse il conteggio solamente dopo che si fosse entrati nel ciclo in cui è posta (se così fosse non avrei nessun problema).

void loop() {
  
 tempo = millis();
 
 const int BOTTON_Start_State = digitalRead (Start);
 const int BOTTON_Print_State = digitalRead (Print);
 
 if (digitalRead (Start) == HIGH && enable_print == 0);{  // Verifico il pulsante di start   
    digitalWrite (Ele_V, HIGH);                           // Attivo l'elettrovalvola e il liquido fluisce nel contenitore
    enable_time = 1;
    enable_print = 0;
 } 
  if (digitalRead (Print) == HIGH && enable_time == 0 );{  // Verifico il comando di print-stop
    digitalWrite (Ele_V, LOW);  
    enable_time = 0;
    enable_print = 1;
 }


      
 while ((analogRead (sonda4) >= 1000) && (enable_time == 1)){ // Ciclo raccolta tempi
        
        T3 = (millis()-tempo)/1000;
        
        if (digitalRead (Print) == HIGH);{
        enable_time = 0;
        }
        
         if (analogRead (sonda3) >= 900){
           T2 = (millis()-T3)/1000;
           
           if (analogRead (sonda2) >= 900){
             T1 = (millis()-T2)/1000;;
             
             if (analogRead (sonda1) >= 900){
               digitalWrite (Ele_V, LOW);
               enable_time = 0;
       
              }
            
          }
      
      }
   
  lcd.setCursor(4, 1);
  lcd.print("T1 =");
  lcd.setCursor(10, 1);
  lcd.print(T1/1000);
  
  lcd.setCursor(0, 2);
  lcd.print("T2 =");
  lcd.setCursor(6, 2);
  lcd.print(T2/1000);
         
  lcd.setCursor(0, 3); 
  lcd.print("T3 =");
  lcd.setCursor(6, 3);
  lcd.print(T3/1000);       
 }

Ringrazio fin da ora tutti quelli che avranno la pazienza di aiutarmi.

Damiano

Edit by mod: Per favore includi il codice usando l'apposito tag code (pulsante "#")

la millis()conta il numero di millisecondi a partire dall'accensione del chip. Perciò savli il suo valore quando inizia il ciclo, lo sottrai a tutte le altre volte che usi millis() ed hai ottenuto lo stesso identico risultato che ti aspettavi!

non capisco bene il tuo codice (usa i tag [ code] e [/ code], oltre che sistemare l'identazione) ma mi pare che fai già qualcosa di simile

Mi piacerebbe anche capire a cosa servono:

const int BOTTON_Start_State = digitalRead (Start);
const int BOTTON_Print_State = digitalRead (Print);

dichiari due costanti nella loop leggendo il valore di 2 pin.
La loop dovrebbe eseguire queste istruzioni all'infinito, ma Arduino le esegue solo la prima volta siccome sono costanti?

no, servonop semplicemente per memorizzare lo stato dei pin all'avvio. così è indifferente che il bottone sia un normalmente chiuso o un normalmente aperto

Si, effettivamente è un po' disordinato.
Chiedo scusa ma mi accorgo di non capire quello che mi suggerisci.
Non riesco a capire come salvare un determinato valore di tempo. Di fatto, nel mio codice sottraggo sempre il valore iniziale di tempo = millis().
Ad esempio T3 sarà sempre uguale a 0 in quanto:
T3 = (millis()-tempo)/1000, con tempo = millis().
Se millis() di T3 anzichè iniziare il conteggio all'accensione iniziasse solo quando entro nel ciclo sarebbe tutto a posto.

Intende che cosa ti cambia iniziare da 0 o da un valore ?

se tempo iniziale = 0
dopo un pò lo leggi è ed 100
100-0=100 ovvero il delta dei due tempi

se tempo iniziale = 1000
dopo un pò leggi 1100

1100-1000=100 ovvero sempre il delta dei due tempi

cosa cambia? forse quel /1000 ?

Scusa, ma quante volte dividi il tempo per 1000?
Fai T3=(millis()-tempo)/1000
poi quando stampi T3 lo dividi ancora per 1000?

Si, a forza di modificarlo ho sbagliato. :sweat_smile:
i tempi li divido solo una volta.