সুইচ দিয়ে এলইডি চালু এবং বন্ধ করুন


10

আমি চালু হওয়ার সময় কোনও এলইডি চালু করার জন্য কোডটি লেখার চেষ্টা করছি এবং স্পর্শকাতর পুশ বোতামের সুইচটি ব্যবহার করার সময় এটি বন্ধ করার জন্য। আমি ওয়্যারিংপিআই লাইব্রেরির সাথে সঠিক কোড বলে আমি যা লিখেছি তা আমি লিখেছি, তবে আমি কেবল এটি বন্ধ হয়ে গেলে এটি চালু করতে পারি এবং তার পরে এটি বন্ধ করতে পারি না। খুব বিরল দৃষ্টান্তে এবং অনেক বারবার প্রেস করার পরে এলইডি চালু হয়ে গেলে আমি বোতামটি টিপব, তবে আমি নিশ্চিত যে এটি কীভাবে কাজ করবে বলে ঠিক নয়।

#include <wiringPi.h>
int main (void)
{
    wiringPiSetup ();
    pinMode (0, OUTPUT);
    pinMode (1, INPUT);
    digitalWrite (0, LOW);
    for(;;)
    {
        if(digitalRead (1) == LOW)
        {
            if(digitalRead (0) == HIGH)
                digitalWrite (0, LOW);
            else if(digitalRead (0) == LOW)
                digitalWrite (0, HIGH);
         }
     }
     return 0;
}

আমি কীভাবে সার্কিট তারযুক্ত তার একটি চিত্র সংযুক্ত করেছি।LEDciruit

c 

2
আপনার লাইব্রেরিতে কি স্যুইচের জন্য কোনও উত্স অন্তর্ভুক্ত রয়েছে? যদি না হয় আপনি সম্ভবত সফলভাবে এলইডি বন্ধ করে দিচ্ছেন এবং তারপরে তাত্ক্ষণিকভাবে এটি আবার চালু করুন। একবার আপনি যদি কোনও রাষ্ট্রের পরিবর্তন সনাক্ত করেন তবে অল্প সময়ের জন্য আরও কোনও সনাক্তকরণ উপেক্ষা করুন।

1
@ মাইকডাব্লু আমি তেমন বিশ্বাস করি না। যদি বিবৃতি প্রক্রিয়া হয় তবে আমি একটি বিলম্ব সন্নিবেশ করানোর চেষ্টা করব।

6
@ ডাস্কউফ এই প্রশ্নটি অবশ্যই প্রোগ্রামিং সম্পর্কে।

1
একটি স্থানীয় ভেরিয়েবল রাখুন যাতে নেতৃত্বের বর্তমান অবস্থা (ওএন / অফ) থাকে (সম্ভবত এনুমের মাধ্যমে) কোনও আউটপুট পিনের অবস্থা পড়ার চেষ্টা করবেন না। পরিবর্তে ইনপুট পিনের উচ্চ থেকে নিম্নে ইনপুট স্থিতির প্রান্তটি সনাক্ত করুন। তারপরে স্থানীয় চলক বর্তমানের অবস্থা আপডেট করুন: আউটপুটিমেশ্বর = (আউটপুটিজমেভার == উচ্চ)? কম বেশি; তারপরে ডিজিটাল রাইট (0, আউটপুটিমেজভার); তারপরে, যখন ইনপুটটি LOW থেকে HIGH এ পরিবর্তিত হয়, HIGH থেকে LOW সনাক্তকরণ যুক্তি পুনরায় সেট করুন। এছাড়াও, ইনপুট স্থিতিকে 'ডিবাউন' করতে ভুলবেন না, সম্ভবত 3 বার পঠন পাঠানোর আশ্বাস দিয়ে সমস্ত একই অবস্থা দেখায়।

আমি সবেমাত্র যা করেছি তা হ'ল প্রতিবেদনটির নীড়ের ভিতরে দেড় সেকেন্ড বিলম্ব সন্নিবেশ করা এবং এটি এই মুহুর্তে কাজ করছে বলে মনে হচ্ছে। কিছু আমাকে বলছে এটি একটি ব্রুটফোর্স পদ্ধতি যা সর্বদা কাজ করে না হিসাবে আমি অনুমান করতে পারি বোতামটি যদি অর্ধেক সেকেন্ডের চেয়ে বেশি দ্রুত টিপানো হয় এবং এটি সম্ভবত আমার মূল প্রকল্পে এর মতো কাজ করবে না, তাই আমি এটিকে দেখব বাকি উত্তর। আমি প্রত্যেকের ইনপুট প্রশংসা করি।

উত্তর:


4

তারের কোডটির জন্য সঠিক দেখাচ্ছে।

সমস্যাটি হ'ল কোডটি খুব শক্ত লুপে রয়েছে। তত্ত্ব অনুসারে, বোতামটি টিপলে লুপের বডি বারবার এলইডি চালু এবং বন্ধ করে দেয়। তত্ত্ব অনুসারে, বোতামটি প্রকাশিত হওয়ার পরে এলইডিটি চালিত (বা বন্ধ) থাকার একটি 50/50 সুযোগ থাকবে। বোতামটি টিপলে আপনি কি উজ্জ্বলতার পরিবর্তন লক্ষ্য করেন? নজরে আসার মতো পর্যাপ্ত পরিমাণও নেই।

বাস্তবে, এলইডিটি ছেড়ে যাওয়ার প্রবণতার কারণ হ'ল এটি ইতিমধ্যে চালু আছে কিনা তা পরীক্ষা করার জন্য। পিন 0 HIGH রাইটিং আউটপুটটিতে 3.3 ভি প্রযোজ্য। তবে সেই তারটি এলইডি এবং পিনের সাথে আউটপুট হিসাবে কনফিগার করা আছে। এলইডি পড়তে পড়তে উচ্চতর হিসাবে নিবন্ধন করতে না পারার জন্য যথেষ্ট কম ভোল্টেজ ফেলে দিচ্ছে, তবে কখনও কখনও এটি কাটার অফের কাছাকাছি থাকায় এটি করে।

অনুশীলনে, এলইডি বন্ধ করার কোড এবং প্রতিটি বোতাম টিপুন দিয়ে একটি পতন-প্রান্ত-ট্রিগারযুক্ত বাধা ব্যবহার করবে। মন্তব্যে নির্দেশিত হিসাবে, আপনি সেক্ষেত্রে বিঘ্ন ঘটাতে চান। বাটনটির পূর্বের অবস্থাটি রেকর্ড করে বাটনটি স্থিতি পরিবর্তিত হলে কেবলমাত্র এলইডি পরিবর্তন করে আপনি বাধা ছাড়াই একই কাজ করতে পারেন। কোডটি লিখিত হিসাবে ডিবেস করা এখন কোনও অর্থবোধ করে না।

#include <wiringPi.h>
int main (void)
{
    wiringPiSetup ();
    pinMode (0, OUTPUT);
    pinMode (1, INPUT);
    digitalWrite (0, LOW);

    int prevButton = HIGH, LED = 0;

    for(;;)
    {
        if(prevButton == HIGH && digitalRead(1) == LOW)  // a falling edge
        {
            prevButton = LOW;

            if(LED)
            {
                LED = 0;
                digitalWrite(0, LOW);
            }
            else
            {
                LED = 1;
                digitalWrite(0, HIGH);
            }
        }
        else if(prevButton == LOW && digitalRead(1) == HIGH)  // a rising edge, do nothing
        {
            prevButton = HIGH;
        )

        // Add a delay here to debounce the button 

    }
    return 0;
}

0

বর্তমানের জিপিআইও অবস্থা থেকে এটি নির্ধারণ করার চেয়ে সাধারণ পরিবর্তনশীলগুলিতে "রাষ্ট্র" বজায় রাখা সম্ভবত সহজ।

এছাড়াও "ব্যস্ত-লুপ" প্রতিটি সিপিইউ চক্র গ্রহণ করবে ওএস প্রক্রিয়াটিকে অনুমতি দেবে; এত সাধারণ প্রক্রিয়াটির জন্য, আপনি দেখতে পাবেন যে আপনার সিপিইউ লোড 100% এ বৃদ্ধি পাবে! usleep()উদাহরণস্বরূপ কোনও কল দিয়ে আপনার এই প্রক্রিয়াটিকে সিপিইউকে অন্যান্য কার্যগুলিতে ছাড়তে দেওয়া উচিত । বিলম্ব এছাড়াও স্যুইচ ডি-বাউন্স করতে পরিবেশন করা হবে।

#include <wiringPi.h>
#include <unistd.h>

int main (void)
{
  wiringPiSetup ();
  pinMode (0, OUTPUT);
  pinMode (1, INPUT);
  digitalWrite (0, LOW);

  // Initial state
  int led = LOW ;
  bool button_down = (digitalRead(1) == LOW) ;

  for(;;)
  {
    // If button-down event (Hi-lo transition)...
    if( !button_down && digitalRead(1) == LOW )
    { 
      // Keep button state
      button_down = true ;

      // Toggle LED state
      led = (led == LOW) ? HIGH : LOW ;
      digitalWrite( 0, led ) ;
    }
    // Button up event...
    else if( button_down && digitalRead(1) == HIGH ) 
    {
      // Keep button state
      button_down = false ;
    }

    usleep( 10000 ) ;
  }

  return 0;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.