Limitare all’unità l’incremento ad ogni pressione prolungata
Per limitare l’incremento della variabile ad un valore non maggiore all’unità ad ogni pressione del pulsante, si può ricorrere a 2 soluzioni “quasi” equivalenti:
Soluzione 1
Dato che la pressione del pulsante porta a livello basso l’ingresso, possiamo imporre al programma di attendere che questo ritorni a livello alto dopo che la variabile è stata incrementata. E’ sufficiente inserire, dopo l’incremento, un while loop la cui condizione di esecuzione è lo stato dell’ingresso a livello basso. Quindi dopo aver incrementato la variabile, se il pulsante risulta ancora premuto, il ciclo “interrompe” l’esecuzione del programma finché la condizione di esecuzione non diventa falsa, cioè quando il pulsante viene rilasciato.
Questa soluzione è molto semplice in quanto richiede solo l’aggiunta di una riga al listato, ma presenta lo svantaggio di fermare il programma finché il pulsante non viene rilasciato.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
//Incrementa il valore di una variabile in seguito alla pressione del pulsante, stampandola a monitor seriale. //Si impiega un while loop che attende il rilascio del pulsante per procedere all'esecuzione del programma. #define button_pin 2 int val = 0; int previous_val; int debounceDelay = 20; boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); for(int counter=0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if( state != previousState) { counter = 0; previousState = state; } } return state; } void setup() { Serial.begin(9600); //inizializza comunicazione seriale a 9600bps pinMode(button_pin, INPUT_PULLUP); } void loop() { if(debounce(button_pin)==LOW) { val++; //incrementa di 1 se il pulsante è premuto while(debounce(button_pin)==LOW) { delay(5); } //attendi il rilascio del pulsante } if(val != previous_val) { //se val è cambiato, stampa a monitor seriale Serial.println(val); previous_val = val; } } |
Soluzione 2
E’ sufficiente imporre che la pressione del pulsante determini, oltre all’incremento della variabile, la variazione di un’altra variabile di controllo che ne impedisca un ulteriore incremento finché il pulsante non viene rilasciato.
E’ necessario dichiarare la nuova variabile state_incr
e impiegare la seguente struttura per il listato. Questa soluzione presenta il vantaggio di non fermare l’esecuzione del programma mentre il pulsante rimane premuto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//Incrementa il valore di una variabile in seguito alla pressione del pulsante, stampandola a monitor seriale. //Si impiega una struttura che impedisce un ulteriore incremento in seguito ad una pressione prolungata, senza fermare il programma. #define button_pin 2 int val = 0; int previous_val; boolean state_incr; int debounceDelay = 20; boolean debounce(int pin) { boolean state; boolean previousState; previousState = digitalRead(pin); for(int counter=0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if( state != previousState) { counter = 0; previousState = state; } } return state; } void setup() { Serial.begin(9600); //inizializza comunicazione seriale a 9600bps pinMode(button_pin, INPUT_PULLUP); } void loop() { if(debounce(button_pin)==LOW && state_incr==0) { val++; //incrementa di 1 se il pulsante è premuto state_incr = 1; } if(debounce(button_pin)==HIGH && state_incr==1) state_incr = 0; if(val != previous_val) { //se val è cambiato, stampa a monitor seriale Serial.println(val); previous_val = val; } } |
Nel video seguente è mostrata l’implementazione di questo listato che impedisce, ad una pressione prolungata del pulsante, un incremento della variabile maggiore dell’unità.
48,329 total views, 13 views today