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.