আমি 'মুদ্রণ' ব্যবহার না করে লুপ কাজ করবে না


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
@ বিট বিঙ্গো, "হাইজেনব্যাগগুলি ঘটে থাকে কারণ আউটপুট স্টেটমেন্ট সন্নিবেশ করার মতো কোনও প্রোগ্রাম ডিবাগ করার সাধারণ প্রচেষ্টা"
তাজবয়

1
"এই কোডটি নেতৃত্ব চালু এবং বন্ধ করে না" " - আমি আলাদা করতে অনুরোধ করছি।
মার্সেলেম

উত্তর:


22

আপনার printদ্বারা প্রতিস্থাপন করার চেষ্টা করুন time.sleep(0.05)। আপনার এই অদ্ভুত আচরণটি ঘটতে পারে কারণ জিপিআইও.আউটপুট সেট / ডিটেক্ট / সনাক্ত করতে 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()

হাঁ। এটা বোধগম্য.
তাজবয়

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)আপনার পরামর্শ অনুসারে মূলত কাজ করে ।
জ্যাকব এম 1001

যদিও এই উত্তরটি এটি ভেঙে ফেলার জন্য আরও ভাল কাজ করে তবে আমি অন্য উত্তরটি বেছে নিয়েছিলাম কারণ এটি ছিল আমার সমস্যার প্রথম লিখিত সমাধান। সামগ্রিক ভোটদান আরও ভাল উত্তর নির্ধারণ করবে।
তাজবয়

1
@ তাজবয়কে "গৃহীত উত্তর" সম্পর্কিত যে কোনও পছন্দে নিজেকে চাপ দেওয়া হচ্ছে বলে মনে করার দরকার নেই
গনিমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.