#8 Pulsante anti-rimbalzo con millis

Arduino è molto veloce a leggere i cambi di stato dei pin, questo comporta che spesso alla pressione di un pulsante possono verificarsi dei falsi contatti, che Arduino può interpretare come dei cambi di stato del pin.
Per evitare questi problemi, soprattutto quando all’interno del progetto sono presenti dei pulsanti, nello sketch si inserisce una parte di codice chiamata anti-debounce, o anti-rimbalzo.

Materiale Necessario

Se siete interessati al materiale, cliccate su questo e sarete indirizzati alla pagina Amazon

Il funzionamento di questa parte di codice è molto semplice, essa dirà ad Arduino di aspettare per un certo periodo di tempo prima di leggere il cambio di stato; per fare ciò ci sono due alternative:
1. inserire un delay subito dopo il comando per la lettura del pulsante, ma delay bloccherà per il tempo indicato tutto lo sketch, esempio:

2. usare millis e far leggere ad Arduino la differenza di tempo tra il tempo attuale ed il tempo trascorso dalla pressione, senza così bloccare l’intero sketch:

Dove tempo_debounce ed attesa_debounce sono due variabili, la prima con valore 0 la seconda con un valore scelto da noi; passiamo ad un esempio pratico.

Dopo aver montato la scheda di prova, iniziamo a scrivere lo sketch che permetterà di accedere e spegnere il led, inoltre darà uno stato al pulsante così da comportarsi come un interruttore.

Analizziamo il codi pezzo per pezzo:

Come sempre partiamo con assegnare il nome ai pin dove è collegato il led (pin6) ed il pulsante (pin4), successivamente definiamo le variabili su cui scriveremo lo stato di entrambi i pin, nel mio caso entrambi LOW.
Passiamo alle variabili per leggere il tempo, la variabile Debounce avrà un valore scelto da noi, io ho dato un valore di 50 ma potete anche aumentarlo, questa verrà poi usata da Arduino all’interno di un if per il calcolo del tempo trascorso dalla pressione del pulsante all’esecuzione del comando, la variabile ultimoDebounce invece verrà usato per memorizzare il valore di millis alla pressione del pulsante.

Salto la spiegazione del setup, avendo solo configurato il pin del led come uscita e quello del pulsante come ingresso.

Nel loop creo una nuova variabile di tipo int a cui do il nome letturaPulsante questa avrà il valore che Arudino leggerà sul pin del pulsante (HIGH o LOW).
Uso questa variabile appena creata, per dire ad Arduino di assegnare alla variabile ultimoDebounce il valore tempo di quell’istante, se la variabile letturaPulsante è diversa dalla variabile UltimoStatoPulsante.

Passiamo al successivo if, dove tramite una semplice sottrazione aritmetica (che sarà sempre soddisfatta), Arduino controllerà che il tempo attuale (millis()) meno la variabile in cui ha memorizzato il tempo alla pressione del pulsante, sarà maggiore di Debounce, la variabile dichiarata ad inizio sketch con il valore 50.
Se questa condizione è sodisfatta Arduino assegnerà un valore di LOW o HIGH al led tramite digitalWrite, e cambierà il valore della variabile StatoPulsante con il valore che avrà letturaPulsante
Chiudiamo tutte le parentesi degli if e cambiamo il valore di UltimoStatoPulsante con il valore ottenuto da letturaPulsante, quindi se aveva un valore LOW, adesso lo avrà HIGH e viceversa.

/ 5
Grazie per aver votato!

Allegati

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *