Loop tidak berfungsi kecuali saya menggunakan 'cetak'


11

Kode ini tidak menghidupkan dan mematikan 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()

tetapi ketika saya mencetak nomor di loop itu berhasil:

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

Adakah yang tahu mengapa itu terjadi?



2
@cat Bingo, "Heisenbugs terjadi karena upaya umum untuk men-debug suatu program, seperti memasukkan pernyataan keluaran"
tazboy

1
"Kode ini tidak menyalakan dan mematikan led." - Saya mohon untuk berbeda.
marcelm

Jawaban:


22

Coba ganti printdengan a time.sleep(0.05). Anda mungkin mengalami perilaku aneh ini karena GPIO.output dialihkan terlalu cepat dari TINGGI ke RENDAH untuk ditetapkan / terdeteksi / dilihat. Menambah / mengurangi durasi tidur hingga program bekerja dengan baik (meningkat) dan cukup cepat (berkurang).

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

Ya. Itu masuk akal.
tazboy

51

Buka gulungan Anda untuk memahami apa yang terjadi di sini:

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

berubah menjadi:

    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]

Seperti yang Anda lihat, mengatur pin rendah mengikuti (dekat ke) segera setelah memutarnya tinggi. Akibatnya LED Anda akan tetap di satu negara untuk sebagian besar waktu (yaitu, apa yang bisa kita rasakan dengan mata telanjang).

Perbaiki seperti ini (untuk siklus tugas 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. Itu tampak sangat jelas sekarang. Terima kasih sudah menunjukkan padaku.
tazboy

4
Ini harus menjadi jawaban yang diterima. Ini sebenarnya menjelaskan apa yang terjadi

2
Mungkin juga perlu dicatat bahwa alasannya print()menyebabkan kode asli untuk bekerja adalah karena menulis ke layar adalah proses yang sangat lambat dan pada dasarnya bertindak seperti yang sleep(1)Anda sarankan.
Jacobm001

Meskipun jawaban ini melakukan pekerjaan yang lebih baik untuk memecahnya, saya memilih jawaban yang lain karena itu adalah solusi tertulis pertama untuk masalah saya. Pemilihan keseluruhan akan menentukan jawaban yang lebih baik.
tazboy

1
@tazboy tidak perlu merasa dirimu ditekan ke dalam pilihan tertentu mengenai "jawaban yang diterima"
Ghanima
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.