Vòng lặp không hoạt động trừ khi tôi sử dụng 'in'


11

Mã này không bật và tắt 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()

nhưng khi tôi in ra số trong vòng lặp thì nó hoạt động:

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

Bất cứ ý tưởng tại sao đó là?



2
@cat Bingo, "Heisenbugs xảy ra do các nỗ lực chung để gỡ lỗi chương trình, chẳng hạn như chèn câu lệnh đầu ra"
tazboy

1
"Mã này không bật và tắt đèn led." - Tôi có ý kiến ​​khác.
marcelm

Câu trả lời:


22

Cố gắng thay thế của bạn printbằng a time.sleep(0.05). Bạn có thể xảy ra hành vi kỳ lạ này vì GPIO.output được chuyển quá nhanh từ CAO sang THẤP để được đặt / phát hiện / nhìn thấy. Tăng / giảm thời gian ngủ cho đến khi chương trình hoạt động tốt (tăng) và đủ nhanh (giảm).

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

Vâng. Điều đó có ý nghĩa.
tazboy

51

Bỏ vòng lặp của bạn để hiểu những gì đang xảy ra ở đây:

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

trở thành:

    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]

Như bạn có thể thấy, cài đặt pin thấp theo sau (gần) ngay sau khi bật cao. Trong thực tế, đèn LED của bạn sẽ ở một trạng thái trong hầu hết thời gian (đó là những gì chúng ta có thể cảm nhận bằng mắt thường).

Khắc phục sự cố như thế này (trong chu kỳ nhiệm vụ 50:50):

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

Ồ Điều đó dường như quá rõ ràng bây giờ. Cảm ơn đã chỉ cho tôi.
tazboy

4
Đây phải là câu trả lời được chấp nhận. Nó thực sự giải thích những gì đã xảy ra

2
Cũng có thể đáng lưu ý rằng lý do print()khiến mã gốc hoạt động là vì viết lên màn hình là một quá trình cực kỳ chậm và về cơ bản hoạt động như sleep(1)bạn đề xuất.
Jacobm001

Mặc dù câu trả lời này thực hiện tốt hơn việc phá vỡ nó nhưng tôi đã chọn câu trả lời khác vì đó là giải pháp bằng văn bản đầu tiên cho vấn đề của tôi. Việc bỏ phiếu tổng thể sẽ xác định câu trả lời tốt hơn.
tazboy

1
@tazboy không cần phải cảm thấy mình bị áp lực với bất kỳ lựa chọn cụ thể nào liên quan đến "câu trả lời được chấp nhận"
Ghanima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.