খুব দীর্ঘ বিলম্ব () সম্ভব?


9

আমি একটি খোলার এবং ছোট দরজা বন্ধ করার চেষ্টা করছি যা প্রতি 12 ঘন্টা পরে খোলা বা বন্ধ হওয়া উচিত। আমি ভাবছিলাম যে আমি যদি 12 ঘন্টা দেরী () সাথে বিলম্ব (43 200 000 000) দিয়ে একটি ছোট লুপিং স্ক্রিপ্ট তৈরি করতে পারি; আমি অনুমান করি? তবে এটি সম্ভব এবং / অথবা প্রস্তাবিত কিনা তা আমার কোনও ধারণা নেই। কিছু প্রতিক্রিয়া / বিকল্প (প্রয়োজনে) চমৎকার হবে :)


ঠিক আছে, আমি মনে করি বিলম্বের সর্বাধিক 65535 µ সেতু রয়েছে তবে এখন আমার একটি বিকল্প প্রয়োজন ...
ফ্রেড পান্নেকেক

4
আরও পরিপক্ক হওয়ার সময়, এমসিইউ-একা সিস্টেমগুলি সাধারণত এমসিইউর একটি হার্ডওয়্যার টাইমার চ্যানেল প্রোগ্রামিং দ্বারা নিয়মিতভাবে একটি বিঘ্নিতভাবে আগুন জ্বালানোর জন্য করা হয়, এবং তারপরে এগুলি গণনা করা হয় - যা এর মধ্যে প্রসেসরকে অন্যান্য কাজ করতে দেয় এবং সংক্ষিপ্তভাবে যথাযথ হিসাবে সঠিক হয় ক্লক স্ফটিক
ক্রিস

3
দেরি ব্যবহার করা কখনও কখনও সামান্য ওভারহেড ত্রুটি বাড়িয়ে তোলে। একটি ভাল ভাল সময় সম্পর্কে একটি বাধা ব্যবহার করা ভাল এবং তারপরে সেখান থেকে গণনা করা ভাল। এখানে আমার ব্যক্তিগত ওয়েবসাইটে ধারণার একটি প্রমাণ দেওয়া আছে: blog.linformatronics.nl/213/electronics/…
জিপ্পি

1
যদি একেবারে সময়োপযোগী না করতে হয়, আপনি সকাল এবং সন্ধ্যা অনুধাবনের জন্য হালকা সেন্সরের মতো অপ্রচলিত জিনিসগুলি ব্যবহার করতে পারেন।
দ্য

হ্যাঁ, আমি সে সম্পর্কে ভেবেছিলাম, তবে আমার কাছে কেবলমাত্র একটি হালকা ডিটেক্টর অংশ রয়েছে এবং এটি আবহাওয়ার হাত থেকে কীভাবে রক্ষা করা যায় তা আমি নিশ্চিত নই (ছোট দরজাটি বাইরে)
ফ্রেড পান্নেকেক

উত্তর:


10

রিয়েল টাইম ক্লক পদ্ধতিটি সবচেয়ে সঠিক উপায় তবে অন্যথায় ব্যবহার millis

unsigned long startMillis = millis();
while (millis() - startMillis < LONG_DELAY_MS);

এটি প্রায় বিলম্ব করবে। 4294967295 মিমি (2 ^ 32-1) বা 49 দিন, এর পরে টাইমার এর মান ধরে ফেলবেstartMillis


1
শুধু ব্যবহার করে ভুল কি delay(LONG_DELAY_MS)? Arduino বাস্তবায়ন স্বাক্ষরবিহীন জন্য longs গ্রহণ করে। আমি পুরোপুরি নিশ্চিত নই যে আপনার কোডটি millis()চারপাশে মোড়ানো সময় সঠিকভাবে কাজ করে এবং তার চেয়ে ছোটstartMillis
গারবেন

আমি সঠিক কিনা তা অপেক্ষা করতে বিলম্ব আপনার আরডুইনোটিকে সম্পূর্ণ নিষ্ক্রিয় করে তোলে। মিলিস 0 এ ফিরে আসার পরে এটি কীভাবে আচরণ করবে তা আমি জানি না
ফ্রেড

@ গ্রাবেন ভাল জিনিস, এটি একটি উত্তর হিসাবে রাখুন!
জ্যামিতিকাল

2
@ ফ্রেডপ্যানেকেক ওভারফ্লো ঠিকঠাক কাজ করবে, যাতে স্বাক্ষরযুক্ত দীর্ঘ ব্যবহার করা হয়।
জ্যামিতিকাল

1
@ 23ars মূলত আরডুইনো এত সফল হওয়ার কারণ হ'ল এটি সহজেই ব্যবহারযোগ্য হার্ডওয়ার বিমূর্ত গ্রন্থাগার, যদি আপনি গ্রন্থাগারগুলি থেকে ফাংশনের বিরুদ্ধে থাকেন তবে আপনি নিজেকে কিছুটা সীমাবদ্ধ করছেন। যাইহোক, মন্তব্যের কাজটি উত্তরটি উন্নত করা, যদি আপনার আরও ভাল সমাধান থাকে তবে নিজের উত্তর লিখুন। ;)
জ্যামিতিকাল

7

delay()এর ব্যবহার রয়েছে, তবে দীর্ঘ বিলম্বের জন্য এটি কোনও ভাল নয়। এটি কেবল মাইক্রোকন্ট্রোলারকে xঘড়ির চক্রের জন্য কিছু না করতে বলে । এই সময়ের মধ্যে, আপনার আরডুইনো আর কিছু করতে পারে না।

আপনার সেরা বাজি হ'ল রিয়েল টাইম ক্লক (আরটিসি) নামক কোনও জিনিস ব্যবহার করা। এই চিপগুলি বিশেষত সময়ের ট্র্যাক রাখার জন্য তৈরি করা হয় এবং আপনি এগুলিকে সহজেই আপনার আরডুইনোর সাথে সংযুক্ত করতে পারেন। আপনি কীভাবে এটি করতে পারেন তার একটি উদাহরণ এখানে।


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

1
@ রিকার্ডো - একটি আরটিসি সম্ভবত একটি এমসিইউর চেয়ে বেশি নির্ভুল হওয়ার সম্ভাবনা নেই যার একটি ঘড়ির স্ফটিক তার একটি হার্ডওয়্যার টাইমার ব্যবহার করে পর্যায়ক্রমে বাধা দেওয়ার জন্য; এটি আপনাকে যা দেয় তা বিদ্যুতের ক্ষতি হারাতে এবং সম্ভবত ক্যালেন্ডার স্কিমগুলির কিছু জ্ঞান অর্জন করে।
ক্রিস

1
আফাইক ইউনিো তার ঘড়ির জন্য কোয়ার্টজ বিট সিরামিক রেজোনেটর ব্যবহার করে না, এইভাবে আরটিসি থেকে অনেক কম নির্ভুলতার সাথে।
jfpoil ব্যাখ্যা

@ ক্রিসট্রেটটন - ঠিক আছে। পয়েন্ট নেওয়া হয়েছে। যদি ওপিকে কোনও নির্দিষ্ট সময়ে দরজাটি খুলতে বা বন্ধ করতে হয় তবে আরটিসি আরও ভাল বিকল্প হবে।
রিকার্ডো

7

আপনি ওয়াচডগ ব্যাঘাত করতে পারেন এবং অপেক্ষা এবং শক্তি সঞ্চয় করার সময় আপনার এমসিইউ ঘুমিয়ে রাখতে পারেন।

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

এখানে কোডটি (অরীক্ষিত):

#include <avr/sleep.h>
// This variable is made volatile because it is changed inside an interrupt function
volatile int sleep_count = 0; // Keep track of how many sleep cycles have been completed.
const int interval = 720; // Interval in minutes between waking and doing tasks.
const int sleep_total = (interval*60)/8; // Approximate number of sleep cycles 
// needed before the interval defined above elapses. Not that this does integer math.

void setup(void) {
    watchdogOn(); // Turn on the watch dog timer.
    // Disable the ADC by setting the ADEN bit (bit 7) to zero.
    ADCSRA = ADCSRA & B01111111;
    // Disable the analog comparator by setting the ACD bit (bit 7) to one.
    ACSR = B10000000;
    // Disable digital input buffers on all analog input pins by setting bits 0-5 to one.
    DIDR0 = DIDR0 | B00111111;
}

void loop(void) {
    goToSleep(); // ATmega328 goes to sleep for about 8 seconds
    // and continues to execute code when it wakes up
    if (sleep_count == sleep_total) {
        // CODE TO BE EXECUTED PERIODICALLY
    }
}

void goToSleep() {
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
    sleep_enable(); // Enable sleep mode.
    sleep_mode(); // Enter sleep mode.
    // After waking from watchdog interrupt the code continues
    // to execute from this point.
    sleep_disable(); // Disable sleep mode after waking.
}

void watchdogOn() {
    // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
    MCUSR = MCUSR & B11110111;
    // Set the WDCE bit (bit 4) and the WDE bit (bit 3) of WDTCSR. 
    WDTCSR = WDTCSR | B00011000; 
    // Set the watchdog timeout prescaler value to 1024 K 
    // which will yeild a time-out interval of about 8.0 s.
    WDTCSR = B00100001;
    // Enable the watchdog timer interupt.
    WDTCSR = WDTCSR | B01000000;
    MCUSR = MCUSR & B11110111;
}

ISR(WDT_vect) 
{
    sleep_count ++; // keep track of how many sleep cycles have been completed.
}

আমি অনুলিপি করা কোডটি এই পৃষ্ঠাটি থেকে রয়েছে: ওয়াচডগ টাইমার ব্যবহার করে লো-পাওয়ার আরডুইনো


1

আপনার কি ঘুম আছে (স্বাক্ষরবিহীন কোন সেকেন্ড) পাওয়া যায়?

যদি তা না হয় তবে এটি আপনাকে () একটি দীর্ঘ সময় বিলম্বিত করতে দেয়:

for (unsigned int bigloop=0; bigloop<65535; bigloop++)
{
   for (unsigned int smallloop=0; smallloop<65535; smallloop++)
   {
      for (unsigned int tinyloop=0; tinyloop<65535; tinyloop++)
      {
         delay(65535);
      }
   }
}

আমি এটি চেষ্টা করতে পারি যদি আমি টমের বলে মত আরটিসি পাওয়ার ব্যবস্থা না করি। সাহায্য করার জন্যে ধন্যবাদ!
ফ্রেড পান্নেকেক

1

এটি কাজ করবে:

longDelayInSeconds = 120; //two minutes;   
while (p < longDelayInSeconds) {

        delay(1000);
        p++;

}

4
সেরা সমাধান নয় এবং ওপি 2 মিনিটের জন্য নয়, 12 ঘন্টা চেয়েছিল।
মাদ্রিবাদ

1

যখন আমি মাঝে মাঝে জিনিসগুলি না করতে চাই তখন আমি কেবল লুপগুলির জন্য ব্যবহার করি:

for (int Hours = 0; Hours < 12; Hours++) {            //Creates 12 hours
  for (int Minutes = 0; Minutes < 60; Minutes++) {    //Creates 1 hour
    for (int Seconds = 0; Seconds < 60; Seconds++) {  //Creates 1 minute
      delay(1000);                                    //Creates 1 second
    }
  }
}

4
Explaing কিভাবে এই একটি সহজ বেশী ভালো delay(43200000)

1
আরম্ভ করার জন্য আপনি কতক্ষণ অপেক্ষা করতে চান তা সংশোধন করা সহজ হবে। মিলিসেকেন্ডে রূপান্তর না করে কেবল প্রতিটি ঘন্টা, মিনিট এবং সেকেন্ডের জন্য সংখ্যাটি পরিবর্তন করুন।
জিনকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.