Pages: [1]   Go Down
Author Topic: Acquisizione tempi  (Read 649 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 "#")
 
« Last Edit: February 15, 2013, 11:14:22 am by leo72 » Logged

0
Online Online
Shannon Member
****
Karma: 129
Posts: 10441
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 76
Posts: 4609
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

my name is IGOR, not AIGOR

0
Online Online
Shannon Member
****
Karma: 129
Posts: 10441
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 76
Posts: 4609
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: February 15, 2013, 09:58:33 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: