Il ciclo non funziona se non utilizzo 'stampa'


11

Questo codice non accende e spegne il led.

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
GPIO.cleanup()

ma quando stampo il numero nel ciclo funziona:

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    print(number)
GPIO.cleanup()

Qualche idea sul perché?



2
@cat Bingo, "Heisenbugs si verificano perché tentativi comuni di debug di un programma, come l'inserimento di istruzioni di output"
tazboy,

1
"Questo codice non accende e spegne il led." - Mi permetto di dissentire.
marcelm

Risposte:


22

Prova a sostituire il tuo printcon a time.sleep(0.05). È possibile che si verifichi questo strano comportamento poiché GPIO.output viene commutato troppo rapidamente da ALTO a BASSO per essere impostato / rilevato / visto. Aumenta / riduci la durata del sonno fino a quando il programma funziona bene (aumenta) e abbastanza velocemente (diminuisci).

import  RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21,GPIO.OUT)
for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    time.sleep(0.05)
GPIO.cleanup()

Sì. Ha senso.
tazboy,

51

Srotola il tuo loop per capire cosa sta succedendo qui:

for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)

diventa:

    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    # [and so on]

Come puoi vedere, l'impostazione del pin in basso segue (vicino a) immediatamente dopo averlo ruotato in alto. In effetti il ​​tuo LED rimarrà in uno stato per la maggior parte del tempo (ovvero, ciò che possiamo percepire ad occhio nudo).

Risolvilo in questo modo (per un ciclo di lavoro 50:50):

for number in range(0,10):
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    time.sleep(1)

Wow. Adesso sembra così ovvio. Grazie per avermelo mostrato.
tazboy,

4
Questa dovrebbe essere la risposta accettata. In realtà spiega cosa è successo

2
Potrebbe anche valere la pena notare che la ragione per cui print()il codice originale funziona è perché la scrittura sullo schermo è un processo follemente lento e agisce essenzialmente come sleep(1)suggerito.
Jacobm001

Sebbene questa risposta abbia un lavoro migliore nel scomporla, ho scelto l'altra risposta perché era la prima soluzione scritta al mio problema. Il voto complessivo determinerà la risposta migliore.
tazboy,

1
@tazboy non c'è bisogno di sentirti sotto pressione in una particolare scelta riguardante la "risposta accettata"
Ghanima
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.