يمر كل مبتدئ تقريبا بالامر السهل delay(1000). الفكرة بسيطة: انتظر ثانية. ومع كبر المشروع يبدأ الروبوت بتصرف غريب. تضغط زرا فلا يستجيب، يظهر عائق فلا يتوقف، يخرج عن الخط وهو يتابعه.
لا تلم الحساس أو البطارية أولا. غالبا الجاني هو delay() الذي ينيم الروبوت كما لو خُدّر.
1) delay يجمد الدماغ
عندما يرى الأردوينو delay لا يفعل شيئا آخر طوال تلك المدة. مثال: أشعل الضوء، انتظر ثانيتين، ثم انعطف يسارا. خلال الثانيتين:
- لا يرى جدارا أمامه (لا تُقرأ الموجات فوق الصوتية)
- لا يسمع زر الإيقاف الطارئ
- لا يلاحظ خروجه عن الخط
delay ليست استراحة; إنها شلل قصير. حتى تنتهي المدة يكون الروبوت أعمى وأصم وأبكم.
2) تشبيه سلق البيض
أسلوب delay: تضع البيضة في الماء وتقف 5 دقائق دون حركة تنظر إلى القدر. رن الهاتف؟ تتجاهله. طرق الباب؟ تتجاهله.
أسلوب millis: تسجل الوقت: بدأت 14:00، أرفعها 14:05. ثم تُعد الطاولة وتقطع الخبز وتنظر للساعة بين الحين والآخر. لم يحن الوقت؟ تواصل عملك.
المحترفون لا يتركون الروبوت ينتظر عند الموقد; يعطونه قدرة مراقبة الساعة.
3) أكثر من مهمة في آن واحد (millis)
إن أردت وميض LED ومتابعة خط معا فلا تستخدم delay. أثناء انتظار الـ LED لن تقود المحركات.
استخدم millis() ساعة الأردوينو. تابع الخط وحرّك المحركات، وراقب الساعة. إن مر 1000 ms منذ آخر تغيير للـ LED فبدّله — لكن لا تتوقف.
unsigned long lastTime = 0;
int ledState = LOW;
void loop() {
followLine();
if (millis() - lastTime >= 1000) {
lastTime = millis();
ledState = !ledState;
digitalWrite(LED_BUILTIN, ledState);
}
}
ملاحظة الورشة:
delayليست محرمة دائما. انتظار قصير فيsetup()أو كود لمرة واحدة خارج السباق قد يكون مقبولا. داخلloop()مع حساسات ومحركات تصبح فخا.
إن كانت ردود الفعل بطيئة فابحث عن delay في الكود. لا تنم الروبوت; علمه إدارة الوقت. الحياة لا تتوقف; وحلقة loop أيضا لا يجب أن تتوقف.