'Print' kullanmadığım sürece döngü çalışmıyor


11

Bu kod, led'i açıp kapatmaz.

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()

ama döngüdeki numarayı yazdırdığımda işe yarıyor:

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()

Bunun neden olduğu hakkında bir fikrin var mı?



2
@cat Bingo, "Heisenbugs, çıktı deyimleri eklemek gibi bir programda hata ayıklama için ortak girişimler nedeniyle ortaya çıkar"
tazboy 23

1
"Bu kod led'i açıp kapatmaz." - Naçizane size katılmıyorum.
marcelm

Yanıtlar:


22

Şu Verilerinizi değiştirmek için deneyin printbir tarafından time.sleep(0.05). GPIO.output ayarlanması / algılanması / görülmesi için YÜKSEK'ten DÜŞÜK'e çok hızlı geçtiği için bu garip davranışla karşılaşabilirsiniz. Program düzgün çalışana kadar (artırma) ve yeterince hızlı (azaltma) olana kadar uyku süresini artırın / azaltın.

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()

Evet. Mantıklı.
tazboy

51

Burada neler olduğunu anlamak için döngünüzü açın:

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

dönüşür:

    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]

Gördüğünüz gibi, pimi alçak konuma getirdikten sonra pimi hemen aşağıya (yakın) takip edin. Aslında LED'iniz çoğu zaman tek bir durumda kalır (yani çıplak gözle algılayabileceğimiz şey).

Bunu şu şekilde düzeltin (50:50 görev döngüsü için):

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

Vay. Bu şimdi çok açık görünüyor. Bana gösterdiğin için teşekkürler.
tazboy

4
Bu kabul edilen cevap olmalı. Aslında ne olduğunu açıklar

2
Ayrıca print(), orijinal kodun çalışmasına neden olmasının, ekrana yazmanın son derece yavaş bir süreç olması ve esasen sleep(1)önerdiğiniz gibi hareket etmesinden kaynaklandığını da belirtmek gerekir .
Jacobm001

Her ne kadar bu cevap daha iyi bir iş çıkarsa da, diğer yanıtı seçtim çünkü bu benim sorunuma ilk yazılı çözümdü. Genel oylama daha iyi cevabı belirleyecektir.
tazboy

1
@tazboy "kabul edilen cevap" ile ilgili herhangi bir seçime baskı altında hissetmenize gerek yok
Ghanima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.