Rilevazione velocità - come migliorare l'affidabilità

Salve a tutti, ho realizzato questo semplice programma per rilevare la velocità (per ora si limita al tempo).
Ci sono due fotocellule, e io devo trovare l'intervallo fra l'attivazione dell'una e dell'altra. (io sto simulando il sistema con due pulsanti normalmente aperti, quando si monterà il sistema andranno invertiti gli stati...)
Cioè il "tempo" che un oggetto ha impiegato per passare dalla prima alla seconda fotocellula :slight_smile:

Questo è lo sketch, sembra funzionare senza nessun problema, ma... visto che sono abbastanza inesperto, volevo sapere se c'è qualche accortezza da seguire per migliorarne l'affidabilità e l'accuratezza della lettura :slight_smile: ( tipo debounce, intervallo fra le letture... )

unsigned long int primalettura; 
unsigned long int secondalettura; 

int primosensore = 3; 
int secondosensore = 2; 
int statoprimosensore;
int statosecondosensore;
int statoprecprimosensore;
int statoprecsecondosensore;

long int intervallo; 

void setup () 
{ 
  Serial.begin( 9600 ); 
  pinMode( primosensore, INPUT); 
  pinMode( secondosensore, INPUT); 
  } 
  
void loop () { 
  
  statoprimosensore = digitalRead( primosensore );
  statosecondosensore = digitalRead( secondosensore );

  if ( statoprimosensore == HIGH  && statosecondosensore == LOW && statoprecprimosensore == LOW ) 
  { 
    primalettura = millis (); 
  } 
  
  if ( statosecondosensore == HIGH && statoprimosensore == LOW && statoprecsecondosensore == LOW) 
  { 
    secondalettura = millis (); 
    intervallo = ( secondalettura - primalettura );
    Serial.println( intervallo ); 
  } 
  
  statoprecprimosensore = statoprimosensore;
  statoprecsecondosensore = statosecondosensore;
  
  delay ( 10 );
 // Serial.print ( statoprimosensore );
 // Serial.println ( statosecondosensore );

}

Se vuoi una maggior accuratezza e sicurezza della rilevazione dell'impulso ti conviene usare gli interrupt agganciandone uno al pin di ricezione.
http://arduino.cc/en/Reference/AttachInterrupt

leo72:
Se vuoi una maggior accuratezza e sicurezza della rilevazione dell'impulso ti conviene usare gli interrupt agganciandone uno al pin di ricezione.
attachInterrupt() - Arduino Reference

Forte! :smiley:
Però non si può usare la funzione millis(), ci devo pensare un pò su come implementarlo :roll_eyes:

Aspetta, specifico una cosa.
Millis è una funzione che restistuisce i millisecondi trascorsi dall'avvio dell'Arduino. Questo conteggio è fatto tramite l'aggiornamento in automatico di una variabile a 32 bit aggiornata ogni 1 ms da un contatore interno del microcontrollore.

Quando tu usi l'interrupt, puoi leggere lo stato di quella variabile, ma è ovvio che non venga più incrementata. Quindi codici tipo
if (millis()>xxxxx) {...}
non funzioneranno all'interno di una routine di gestione dell'interrupt ma potrai comunque sempre assegnare la lettura di millis ad una variabile globale per registrare l'istante di attivazione dell'interrupt.
Oppure puoi mettere in sleep il micro e mettere una funzione di gestione dell'interrupt vuota, così da usare l'interrupt solo per risvegliare il micro e poi, nel punto del codice da dove riprende l'esecuzione, mettere i calcoli su millis.

leo72:
Aspetta, specifico una cosa.
Millis è una funzione che restistuisce i millisecondi trascorsi dall'avvio dell'Arduino. Questo conteggio è fatto tramite l'aggiornamento in automatico di una variabile a 32 bit aggiornata ogni 1 ms da un contatore interno del microcontrollore.

Quando tu usi l'interrupt, puoi leggere lo stato di quella variabile, ma è ovvio che non venga più incrementata. Quindi codici tipo
if (millis()>xxxxx) {...}
non funzioneranno all'interno di una routine di gestione dell'interrupt ma potrai comunque sempre assegnare la lettura di millis ad una variabile globale per registrare l'istante di attivazione dell'interrupt.
Oppure puoi mettere in sleep il micro e mettere una funzione di gestione dell'interrupt vuota, così da usare l'interrupt solo per risvegliare il micro e poi, nel punto del codice da dove riprende l'esecuzione, mettere i calcoli su millis.

Ah! Penso di aver capito, ora provo a fare qualcosina :slight_smile:

Grazie mille :smiley:

Ti passo questa pagina del playground:
http://arduino.cc/playground/Learning/ArduinoSleepCode
L'esempio, commentato, fa vedere proprio l'uso di una gestione degli interrupt che servono esclusivamente per risvegliare il micro dallo sleep.

leo72:
Ti passo questa pagina del playground:
http://arduino.cc/playground/Learning/ArduinoSleepCode
L'esempio, commentato, fa vedere proprio l'uso di una gestione degli interrupt che servono esclusivamente per risvegliare il micro dallo sleep.

Capito!
Grazie dei consigli, come ho un attimo di tempo mi metto a provare gli interrupts! (ora sono un poco in difficoltà con il debounce di un pulsante)...