วนซ้ำไม่ทำงานจนกว่าฉันจะใช้ 'พิมพ์'


11

รหัสนี้ไม่ได้เปิดและปิดไฟ 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()

แต่เมื่อฉันพิมพ์หมายเลขในลูปมันจะทำงาน:

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

ความคิดใด ๆ ที่เป็นสาเหตุ?



2
@cat บิงโก "Heisenbugs เกิดขึ้นเนื่องจากความพยายามร่วมกันเพื่อแก้ปัญหาโปรแกรมเช่นการแทรกงบเอาท์พุท"
tazboy

1
"รหัสนี้ไม่ได้เปิดและปิดไฟ led" - ฉันขอแตกต่างกันไป
marcelm

คำตอบ:


22

พยายามที่จะเข้ามาแทนที่ของคุณโดยprint time.sleep(0.05)คุณอาจเกิดพฤติกรรมแปลก ๆ นี้เนื่องจาก GPIO.output เปลี่ยนเร็วเกินไปจากสูงเป็นต่ำที่จะตั้งค่า / ตรวจจับ / เห็น เพิ่ม / ลดระยะเวลาการนอนหลับจนกว่าโปรแกรมจะทำงานได้ดี (เพิ่มขึ้น) และเร็วพอ (ลดลง)

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

อ๋อ นั่นทำให้รู้สึก
tazboy

51

คลี่วงของคุณเพื่อทำความเข้าใจกับสิ่งที่เกิดขึ้นที่นี่:

for number in range(0,10):
    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)
    GPIO.output(21,GPIO.LOW)
    time.sleep(1)
    GPIO.output(21,GPIO.HIGH)
    # [and so on]

อย่างที่คุณเห็นการตั้งพินต่ำให้ดังต่อไปนี้ (ใกล้ถึง) ทันทีหลังจากหมุนมันสูง ในความเป็นจริง LED ของคุณจะอยู่ในสถานะเดียวตลอดเวลา (นั่นคือสิ่งที่เราสามารถรับรู้ได้ด้วยตาเปล่า)

แก้ไขได้เช่นนี้ (สำหรับรอบหน้าที่ 50:50):

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

ว้าว. ดูเหมือนจะชัดเจนในขณะนี้ ขอบคุณที่แสดงให้ฉัน
tazboy

4
นี่ควรเป็นคำตอบที่ยอมรับได้ จริง ๆ แล้วมันอธิบายสิ่งที่เกิดขึ้น

2
อาจเป็นเหตุผลที่print()ทำให้รหัสต้นฉบับทำงานเนื่องจากการเขียนไปยังหน้าจอเป็นกระบวนการที่ช้าอย่างบ้าคลั่งและทำหน้าที่ตามที่sleep(1)คุณแนะนำ
Jacobm001

แม้ว่าคำตอบนี้จะทำงานได้ดีขึ้นในการทำลายมันลงฉันเลือกคำตอบอื่น ๆ เพราะมันเป็นทางออกแรกที่เขียนถึงปัญหาของฉัน การโหวตโดยรวมจะเป็นตัวกำหนดคำตอบที่ดีกว่า
tazboy

1
@tazboy ไม่จำเป็นต้องรู้สึกว่าตัวเองถูกกดดันในตัวเลือกใด ๆ เกี่ยวกับ "คำตอบที่ยอมรับ"
Ghanima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.