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


collegamento di un pulsante alla scheda di arduino E' interessante farsi un'idea delle possibilità di arduino di effettuare misure di intervalli temporali, anche in vista di successive applicazioni. In questa pagina proveremo a calcolare quanti secondi intercorrono tra due successive pressioni di un pulsante.
Per questa esperienza è possibile usare uno dei circuiti già visti in precedenza, e che è riportato a lato.
La stesura dello sketch può risultare abbastanza impegnativa: ci si imbatte sempre in piccole cose da mettere a punto, come per esempio prevenire i malfunzionamenti dovuti al pulsante premuto per un tempo troppo lungo; a volte occorre aggiungere un "delay", o usare una variabile in più. A alla fine, una soluzione valida può essere il codice riportato di seguito, che sembra funzionare piuttosto bene.
Misurare il tempo fra due successive pressioni di un pulsante

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"
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:

dati del conteggio mostrati su monitor seriale di arduino



ebook "Introduzione all'elettronica"



Ritorna all'indice generale