Raffaele Ilardo


Misurare l'intervallo di tempo tra due successive pressioni di un pulsante


© La parziale riproduzione dei contenuti di questa pagina è consentita a patto di citare l'indirizzo del sito e l'autore.


Può essere utile farsi un'idea delle possibilità di arduino di effettuare misure di intervalli temporali, anche in vista di successive applicazioni.
Il progetto descritto in questa pagina si prefigge di calcolare quanti secondi intercorrono tra due successive pressioni di un pulsante. Per questa esperienza è possibile usare ad esempio il circuito già visto in precedenza, e che riporto di seguito:
scheda arduino con aggiunta di pulsante
Contrariamente a quanto si potrebbe supporre, la stesura dello sketch può risultare abbastanza impegnativa. Occorre ad esempio prevenire i malfunzionamenti dovuti ad una pressione troppo prolungata del pulsante; può essere talvolta necessario aggiungere un "delay", o usare una variabile in più. Personalmente ritengo di aver trovato una soluzione valida con il codice che riporto di seguito, e che mi sembra funzionare piuttosto bene.

Codice da caricare in memoria

int pinState = 0;        // variabile pinState (memorizza lo stato del pin 7)
int countOn = 0;        // variabile countOn (ha valore 1 quando il conteggio è in corso)
int released = 0;        // variabile released (ha valore 1 quando il pin 7 è LOW)
float tempo0 = 0;        // valore del tempo a inizio conteggio
float tempoX = 0;        // valore del tempo a fine conteggio

void setup() { pinMode(7, INPUT);        // imposta come input il pin 7
Serial.begin(9600);        // imposta la comunicazione seriale
}

void loop() {
pinState = digitalRead(7);        // legge il pin 7
if (pinState == LOW) {
released = 1;        // se il pin 7 è LOW setta a 1 la variabie released
}

if (pinState == HIGH && countOn == 0 && released == 1) {        // verifica le condizioni per iniziare il conteggio
tempo0 = millis();
Serial.println ("inizio conteggio");
countOn = 1;
released = 0;
delay(500);
}

if (pinState == HIGH && countOn == 1 && released == 1) {        // verifica le condizioni di conteggio terminato
tempoX = millis();
Serial.print ("fine conteggio: ");
Serial.print ((tempoX-tempo0)/1000);
Serial.println (" secondi");
countOn = 0;
tempo0 = 0;
tempoX = 0;
released =0;
delay(500);
}

}

Nella prima sezione si dichiarano le variabili che si prevede di utilizzare: tre sono del tipo "int" (numero intero) perchè devono solo memorizzare due valori: uno zero oppure un uno.
Le due variabili float servono a memorizzare i valori letti con la funzione millis(); sono variabili che occupano 4 bytes ciascuna, e possono contenere numeri con la virgola.
Seguono poi la dichiarazione del pin 7 come input e la definizione della comunicazione seriale Serial.begin(9600). Infatti il valore del tempo misurato sarà leggibile sul monitor seriale, ovvero in quella particolare finestra dell'IDE che visualizza i dati inviati al PC da Arduino.
Il loop, cioè la fase ciclica del programma, procede leggendo lo stato del pin 7; se è LOW setta a 1 la variabile "released"
reading boy
Successivamente, se pin 7 è HIGH, se il conteggio non è in corso, e ancora se il pulsante è stato rilasciato, viene letto il tempo con millis() e memorizzato in "tempo0"
Nell'istruzione if che segue, si verifica il caso che siano pin7 = HIGH, il conteggio in corso, ed il pulsante rilasciato; in tal caso viene letto il tempo, ed il valore è assegnato alla variabile "tempoX"
Essendo terminato il conteggio, i dati vengono inviati al monitor seriale con l'istruzione "Serial.print". Viene calcolata la differenza (tempoX - tempo0) ed il valore viene diviso per 1000, per poter leggere il tempo in secondi.
I ritardi "delay(500)" servono a consentire un uso più tranquillo del pulsante (cioè non del tipo "premi e scappa").
Riepilogando, la prima volta che si preme il pulsante, appare la scritta "inizio conteggio"; premendo la seconda volta, il conteggio termina e il valore del tempo conteggiato appare sul monitor.

Ecco come viene mostrato il valore sul serial monitor:

monitor seriale con valore finale del conteggio





 raffaele ilardo