Vai al contenuto

Buttons

In questo capitolo andremo a provare alcuni esperimenti in cui costruiremo progetti hardware basati sui pulsanti e i led, governati da un ESP32 e controllati tramite codice MicroPython.

I pulsanti hardware hanno due caratteristiche fisiche che vanno sempre considerate quando se ne inserisce uno in un circuito:

  • floating inputs: all'inizio l'ESP32 è confuso perché non sa se lo stato iniziale del pulsante è cliccato oppure no. Questo problema si può risolvere con una resistenza di pull-up o di pull-down.

  • chattering: se si clicca il pulsante molto rapidamente (ad esempio sparando in un gioco), l'ESP32 potrebbe pensare ad un'unica pressione prolungata. Questo problema si può risolvere con tecniche di debouncing.

Vediamo come è fatto internamente un pulsante:

Buttons Internals

E vediamo in quali modi è possibile collegarlo al nostro ESP32:

Buttons Connections

In qualunque dei 4 modi indicati sopra, tutto il circuito passerà sempre per il pulsante, che avrà la possibilità di aprirlo o chiuderlo.

Capito che servono due collegamenti, ci sono due modi il cui il pulsante può essere collegato al circuito:

  1. in modalità pull-down, con una estremità connessa al GPIO, l'altra alla tensione di 3.3V: in questo caso, quando il pulsante è premuto il valore è HIGH, altrimenti è LOW.
  2. in modalità pull-up, con una estremità connessa al GPIO, l'altra al GND: in questo caso, quando il pulsante è premuto il valore è LOW, altrimenti è HIGH.

Gestione debouncing

Quando si preme un pulsante fisico, il circuito si apre e si chiude decine o centinaia di volte. Questo fenomeno è chiamato bouncing. Ciò accade a causa della natura meccanica dei pulsanti: quando i contatti metallici si uniscono, c'è un breve periodo in cui il contatto non è perfetto, il che causa una serie di rapide transizioni di apertura/chiusura.

Il pulsante del simulatore

Ovviamente, il pulsante del simulatore non ha problemi di contatti fisici, ma è in grado di simularli impostando la variabile Bounce del pulsante:

  • Se la imposti a True, il simulatore creerà un centinaio di segnali aperto/chiuso ad ogni pressione del pulsante
  • Se la imposti a False, il simulatore creerà una singola coppia di segniali aperto/chiuso per ogni pressione.

Il seguente codice presenta una semplice tecnica di debouncing software. Permette di tenere traccia delle pressioni utente di un pulsante.

debouncing software
from machine import Pin

button = Pin(19, Pin.IN,Pin.PULL_UP)

print("valore iniziale del pulsante: ", button.value())
lastValue = True

while True:
    actualValue = button.value()
    if lastValue == actualValue:
        continue    

    if actualValue == False:
        print("hai cliccato il pusante...")

    lastValue = actualValue

Esempi con i pulsanti

(da sistemare)

Nel secondo progetto abbiamo un pulsante collegato ad un LED nel nostro circuito. Incredibilmente... quando si clicca il pulsante dovrebbe accendersi la luce!!!

Vediamo lo schema elettrico del progetto:

Schema LED Button

Quello che manca è il codice di funzionamento. Eccolo:

from machine import Pin

# xx è il numero del GPIO a cui hai collegato il led
# yy è il numero del GPIO a cui hai collegato il pulsante
led = Pin(xx, Pin.OUT)
button = Pin(yy, Pin.IN,Pin.PULL_UP)

while True:
    if not button.value():
        led.off()
    else:
        led.on()

Esercizi

Button LED...Bar

Pulsante e barra dei led.

Quando si clicca il pulsante, parte il caricamento della barra, che poi si scaricherà quando è tutta piena.

Difficoltà ulteriore: quando si clicca di nuovo il pulsante il caricamento si interrompe.