الدالة delay()‎ في أردوينو

من موسوعة حسوب
< Arduino‏ | time
مراجعة 08:43، 18 أكتوبر 2018 بواسطة جميل-بيلوني (نقاش | مساهمات) (إضافة محتويات الصفحة.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

توقف الدالة delay()‎ تنفيذ البرنامج مؤقتًا لفترة محدَّدة من الزمن (بالميلي ثانية).

البنية العامة

delay(ms)

المعاملات

ms

عددٌ طويلٌ عديم الإشارة (unsigned long) يمثِّل الزمن في الميلي ثانية المراد إيقاف تنفيذ البرنامج مؤقتًا خلاله.

تذكير: يوجد 1,000 ميلي ثانية في الثانية الواحدة.

القيم المعادة

لا يعاد أي شيء.

أمثلة

استعمال الدالة delay()‎ لإيقاف البرنامج مؤقتًا عن العمل لمدة ثانية واحدة قبل قلب حالة رجل الخرج المتصلة بضوء ليد:

int ledPin = 13;                 // ضوء ليد متصل بالرجل 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // على أنَّها رجل خرج ledPin تهيئة الرجل 
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // تشغيل الضوء
  delay(1000);                  // الانتظار لمدة ثانية واحدة
  digitalWrite(ledPin, LOW);    // إطفاء الضوء
  delay(1000);                  // الانتظار لمدة ثانية واحدة
}

ملاحظات وتحذيرات

رغم أنَّه من السهل جدًا إنشاء ضوء ليد مومض مع الدالة delay()‎ كما أنَّ الكثير من الشيفرات تستعمل هذه الدالة لخلق تأخيرات زمنية تتطلبها بعض المهام -مثل استعمالها لتلافي مشكلة ارتداد الزر عند ضغطه (button debouncing)- إلا أنَّ استعمال الدالة delay()‎ في الشيفرة يرافقه الكثير من المساوئ. ففي أثناء تنفيذ عملية التأخير عند استدعاء الدالة، لن تٌقرَأ قيم الحساسات، ولن تُجرَى العمليات الحسابية، ولن تُعدَّل حالة أي رجل أو يُتحكَّم بها ...إلخ.، لذا فإنَّ استدعاء هذه الدالة يؤدي إلى مقاطعة بقية المهام والعمليات وإيقافها فترةً من الزمن. بدلًا من ذلك، اطلع على الدالة millis()‎ والمثال المذكور في الأسفل للتعامل مع التأخيرات الزمنية والتحكم بالتوقيت بطريقة فعَّالة. يتجنب المبرمجون ذوو الخبرة والمعرفة عادةً استعمال الدالة delay()‎ لتأخير الأحداث والتحكم بتوقيتها عندما تزيد فترة التأخير عن بضعة عشرات من الميلي ثانية سوى إذا كانت الشيفرة المكتوبة بسيطة جدًا.

هنالك بعض الأشياء تستمر في العمل خلال تحكم الدالة delay()‎ بالمتحكم Atmega مثل المقاطعات، إذ لا تعطِّل هذه الدالة عملها. يُسجَّل أيضًا الاتصال التسلسلي المستقبل من الرجل RX، ويُحافَظ على القيم PWM (المكتوبة باستعمال analogWrite()‎) وحالة الأرجل، وتستمر المقاطعات بالعمل بالشكل الذي يحلو لها.

انظر أيضًا

  • الدالة delayMicroseconds()‎: توقف تنفيذ البرنامج مؤقتًا لفترة محدَّدة من الزمن (بالميكرو ثانية).
  • الدالة micros()‎: تعيد زمن تشغيل لوحة أردوينو للبرنامج الحالي بالميكروثانية.
  • الدالة millis()‎: تعيد زمن تشغيل لوحة أردوينو للبرنامج الحالي بالميلي ثانية.
  • مثال عملي: جعل ضوء ليد يومض دون تأخير زمني.

مصادر