01/04/2019, 20:30
Salve a tutti,
Ho da pochissimo un Raspberry 3 B+.
Mentre cerco di familiarizzare con la libreria Gpiozero (su suggerimento di @Zzed), sto nel frattempo facendo un po’ di pratica con la libreria classica RPi e il rilevamento dei cambi di stato in input (Edge) tramite interrupt.
Semplice esperimento: pulsante collegato a 3.3V e BCM15, con resistenza da 220Ω; LED collegato a BCM17 e massa, con resistenza da 330Ω.
Nella mia intenzione, premendo una volta il pulsante il LED dovrebbe accendersi, premendo nuovamente dovrebbe spegnersi.
In realtà il programma non funziona bene: spesso non accende o non spegne il LED oppure accende e spegne consecutivamente e altre cose bizzarre.
Pare quasi che la parte di programma con if… else… non sia ben sincronizzata con il callback di GPIO.add_event_detect().
Non capisco dove sia l’errore…
Di seguito il listato e lo schema dell’esperimento.
Grazie a tutti.
----------------------
------------
Ho da pochissimo un Raspberry 3 B+.
Mentre cerco di familiarizzare con la libreria Gpiozero (su suggerimento di @Zzed), sto nel frattempo facendo un po’ di pratica con la libreria classica RPi e il rilevamento dei cambi di stato in input (Edge) tramite interrupt.
Semplice esperimento: pulsante collegato a 3.3V e BCM15, con resistenza da 220Ω; LED collegato a BCM17 e massa, con resistenza da 330Ω.
Nella mia intenzione, premendo una volta il pulsante il LED dovrebbe accendersi, premendo nuovamente dovrebbe spegnersi.
In realtà il programma non funziona bene: spesso non accende o non spegne il LED oppure accende e spegne consecutivamente e altre cose bizzarre.
Pare quasi che la parte di programma con if… else… non sia ben sincronizzata con il callback di GPIO.add_event_detect().
Non capisco dove sia l’errore…
Di seguito il listato e lo schema dell’esperimento.
Grazie a tutti.
----------------------
Codice:
# Accensione-spegnimento LED con interrupt
from RPi import GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT) # pin 17 (LED) impostato OUT
GPIO.output(17,GPIO.LOW)
def richiamo_pulsante(channel): # funzione: channel = pin 15
print('Pulsante premuto!')
if(GPIO.input(17) == GPIO.LOW):
GPIO.output(17,GPIO.HIGH)
print('LED acceso!')
else:
GPIO.output(17,GPIO.LOW)
print('LED spento!')
# Pin BCM 15 come INPUT e
# definirlo come PULL-DOWN = OFF = 0
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# Creazione di un EVENTO (INTERRUPT) per il pin BCM 15
GPIO.add_event_detect(15, GPIO.RISING, callback=richiamo_pulsante)
messaggio = input('Premi INVIO per uscire\n\n')
GPIO.cleanup()
------------