'print'를 사용하지 않으면 루프가 작동하지 않습니다


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 Bingo, "Heisenbugs는 출력문 삽입과 같은 프로그램을 디버그하려는 일반적인 시도 때문에 발생합니다"
tazboy

1
"이 코드는 LED를 켜거나 끄지 않습니다." -달라고 간청합니다.
marcelm

답변:


22

당신을 대체하려고 printa로 time.sleep(0.05). GPIO 출력이 HIGH에서 LOW로 너무 빨리 전환되어 설정 / 감지 / 표시되기 때문에이 이상한 동작이 발생할 수 있습니다. 프로그램이 잘 작동하고 증가 할 때까지 수면 시간을 늘리거나 줄입니다.

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 2016 년

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 2016 년

4
이것이 정답입니다. 실제로 무슨 일이 있었는지 설명합니다

2
print()원래 코드가 작동 하는 이유 는 화면에 쓰는 것이 엄청나게 느린 프로세스이며 본질적으로 sleep(1)제안한 대로 작동하기 때문 입니다.
Jacobm001

이 답변이 더 나은 결과를 낼 수는 있지만 다른 문제를 선택했습니다. 전체 투표는 더 나은 답변을 결정합니다.
tazboy 2016 년

1
@tazboy는 "허용 된 답변"에 관한 특정 선택에 압력을 가할 필요가 없습니다
Ghanima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.