Go Down

Topic: Acquisizione tempi (Read 807 times) previous topic - next topic

bogolo

Feb 15, 2013, 12:45 pm Last Edit: Feb 15, 2013, 05:14 pm by leo72 Reason: 1
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).


Code: [Select]
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 "#")


lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

nid69ita

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?
my name is IGOR, not AIGOR

lesto

no, servonop semplicemente per memorizzare lo stato dei pin all'avvio. così è indifferente che il bottone sia un normalmente chiuso o un normalmente aperto
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

bogolo

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.


nid69ita

#5
Feb 15, 2013, 03:54 pm Last Edit: Feb 15, 2013, 03:58 pm by nid69ita Reason: 1
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?
my name is IGOR, not AIGOR

bogolo

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

Go Up