Abbiamo visto come collegare e gestire un pulsante con il Raspberry Pi nella lezione precedente nonché analizzato le modalità Pull-Up, Pull-Down e i metodi della classe Button.
In questa lezione completiamo l'analisi dettagliata dei metodi della classe Button aiutandoci con esempi pratici in Python.
La classe Button
Il Pulsante (Button) all'interno della libreria GPIOZero appartiene alla classe di dispositivi di Input (DigitalInputDevice), ed è modellato da una semplice interfaccia intuitiva.
Controllo Led con Pulsante
Nel caso in esame modifichiamo il circuito come rappresentato in figura collegando un led al GPIO 23 del Raspberry Pi.
from gpiozero import LED, Button # linea 1
from time import sleep # linea 2
print("Inizializzazione Led") # linea 4
led = LED(23) # linea 5
print("Inizializzazion Pulsante") # linea 7
pulsante = Button(18, pull_up=True) # linea 8
while True: # linea 10
if pulsante.is_pressed: # linea 11
print("Pulsante Premuto - Led Acceso!") # linea 12
led.on() # linea 13
else: # linea 14
print("Pulsante non Premuto - Led Spento!") # linea 15
led.off() # linea 16
sleep(0.5) # linea 18
Se alla linea 11 il pulsante è premuto, allora accendiamo il led alla linea 13 altrimenti lo spegniamo alla linea 16.
La libreria GPIOZero ci permette di ottenere lo stesso risultato in maniera più stringata tramite l'uso degli eventi when_pressed e when_released.
from gpiozero import LED, Button # linea 1
from signal import pause # linea 2
print("Inizializzazione Led") # linea 4
led = LED(23) # linea 5
print("Inizializzazion Pulsante") # linea 7
pulsante = Button(18, pull_up=True) # linea 8
pulsante.when_pressed = led.on # linea 10
pulsante.when_released = led.off # linea 11
pause() # linea 13
In questo caso abbiamo collegato l'evento di pressione del pulsante (when_pressed) con l'esecuzione della funzione on() del led, mentre l'evento generato dal rilascio del pulsante è collegato all'esecuzione del metodo off() del led.
Otteniamo lo stesso risultato del codice precedente ma in modo maggiormente sintetico.
Esiste un terzo modo, ancora più compatto, che permette di collegare logicamente lo stato logico del pulsante come input del led.
from gpiozero import LED, Button # linea 1
from signal import pause # linea 2
print("Inizializzazione Led") # linea 4
led = LED(23) # linea 5
print("Inizializzazion Pulsante") # linea 7
pulsante = Button(18, pull_up=True) # linea 8
led.source = pulsante.values # linea 10
pause() # linea 12
In questo caso il valore di controllo del led tramite led.source viene pilotato dallo stato logico del pulsante pulsante.values.
Pressione prolungata
Gestendo l'evento when_held realizziamo ora un codice che accende o spegne il led solo se il pulsante viene premuto per un tempo superiore a 2 secondi.
from gpiozero import LED, Button # linea 1
from signal import pause # linea 2
print("Inizializzazione Led") # linea 4
led = LED(23) # linea 5
print("Inizializzazion Pulsante") # linea 7
pulsante = Button(18, pull_up=True, hold_time=2) # linea 8
pulsante.when_held = led.toggle # linea 10
pause() # linea 12
Come si può vedere, alla linea 10, abbiamo utilizzato il metodo toggle() della classe LED per invertire lo stato di accensione del led.
Conclusione
In questa lezione e nella precedente abbiamo appreso alcuni concetti fondamentali e osservato l'uso della resistenze di Pull-Up e Pull-Down. Abbiamo, inoltre, descritto la classe Button della libreria GPIOZero e analizzato vari codici di controllo che sfruttano i metodi e gli eventi messi a disposizione dalla classe stessa. Nella prossima lezione andremo a pilotare tramite pulsante un carico che non può essere direttamente collegato al Raspberry Pi.