जब तक मैं 'प्रिंट' का उपयोग नहीं करता लूप काम नहीं करता है


11

यह कोड एलईडी को चालू और बंद नहीं करता है।

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 बिंगो, "हाइजेनबग्स इसलिए होते हैं क्योंकि एक प्रोग्राम को डिबेट करने की आम कोशिशें होती हैं, जैसे आउटपुट स्टेटमेंट डालना"
tazboy

1
"यह कोड एलईडी को चालू और बंद नहीं करता है।" - क्षमा करें मैं असहमत हूं।
मार्सेल

जवाबों:


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

हां। यह समझ आता है।
ताज़ोबे

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]

जैसा कि आप देख सकते हैं, उच्च मोड़ के तुरंत बाद पिन निम्न प्रकार (पास) सेट करना। वास्तव में आपकी एलईडी अधिकांश समय (यानी हम नग्न आंखों से देख सकते हैं) के लिए एक राज्य में रहेंगे।

इसे इस तरह ठीक करें (50:50 शुल्क चक्र के लिए):

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

वाह। अब इतना स्पष्ट लगता है। मुझे दिखाने के लिए धन्यवाद।
ताज़ोबे

4
यह स्वीकृत उत्तर होना चाहिए। यह वास्तव में बताता है कि क्या हुआ

2
यह भी ध्यान देने योग्य हो सकता है कि कारण print()मूल कोड को काम करने का कारण बनता है क्योंकि स्क्रीन पर लिखना एक बेहद धीमी प्रक्रिया है और अनिवार्य रूप से sleep(1)आपके द्वारा सुझाए गए अनुसार कार्य कर रहा है।
Jacobm001

हालाँकि यह जवाब इसे तोड़ने का एक बेहतर काम करता है लेकिन मैंने दूसरा जवाब चुना क्योंकि यह मेरी समस्या का पहला लिखित समाधान था। समग्र मतदान बेहतर उत्तर का निर्धारण करेगा।
ताज़ोबो

1
कोई अपने आप को "स्वीकार किए जाते हैं जवाब" के विषय में किसी विशेष विकल्प में दबाव डाले जाने के महसूस करने की जरूरत @tazboy
Ghanima
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.