چرا نباید از Delay آردوینو استفاده کرد؟ (مزیت Millis)

در این مقاله تفاوت بین delay() و millis() در آردوینو را بررسی میکنیم و نتیجه میگیریم که چرا نباید از delay استفاده کنید.
اولین باری که از برد آردوینو استفاده کردید، احتمالاً چنین کاری انجام دادید:
- یک LED به آردوینو وصل کردید
- کد پیشفرض Blink را آپلود کردید تا LED هر ثانیه روشن و خاموش شود
این برنامه به اصطلاح «Hello World» آردوینو است و نشان میدهد که فقط با چند خط کد میتوانید چیزی بسازید که در دنیای واقعی کاربرد دارد.
عملکرد تابع delay()
در مثال بالا، از تابع delay برای تعیین فاصله زمانی بین روشن و خاموش شدن LED استفاده میکنید.
اما نکته اینجاست: در حالی که delay() برای مثالهای ساده مفید است، در پروژههای واقعی نباید از آن استفاده کنید.
بیایید ببینیم چرا.
تابع delay() بهصورت ساده کار میکند. این تابع یک عدد صحیح (integer) میگیرد که مقدار آن مدت زمان انتظار برنامه را به میلیثانیه مشخص میکند. مثلاً در دستور delay(1000)، آردوینو به مدت 1 ثانیه متوقف میشود و هیچ کار دیگری انجام نمیدهد.
به این نوع تابعها تابع مسدودکننده (Blocking Function) گفته میشود. توابع مسدودکننده باعث میشوند برنامه تا پایان یک کار، هیچ وظیفهی دیگری انجام ندهد. بنابراین اگر پروژهای دارید که باید همزمان چند کار مختلف را انجام دهد، نمیتوانید از delay() استفاده کنید.
اگر برنامهتان نیاز دارد که دائماً دادههایی را از ورودیها بخواند یا ذخیره کند، بهتر است از delay استفاده نکنید.
خوشبختانه یک راهحل بهتر وجود دارد.
تابع millis() راه حل بهتر برای مدیریت زمان
تابع millis وقتی صدا زده میشود، تعداد میلیثانیههایی که از شروع اجرای برنامه گذشته را برمیگرداند.
اما چرا این مفید است؟
چون با کمی محاسبه میتوانید بفهمید چقدر زمان گذشته، بدون اینکه برنامه را متوقف کنید.
کد زیر نشان میدهد که چطور میتوانید با استفاده از تابع millis()، همان پروژه چشمکزن LED را بدون استفاده از delay بنویسید. این برنامه LED را برای 1000 میلیثانیه روشن و سپس خاموش میکند. اما بدون اینکه اجرای سایر بخشهای برنامه را متوقف کند.
const int ledPin = 13; // شماره پین LED
int ledState = LOW; // وضعیت فعلی LED
unsigned long previousMillis = 0; // ذخیره آخرین زمان تغییر LED
const long interval = 1000; // بازه زمانی چشمک (میلیثانیه)
void setup() {
pinMode(ledPin, OUTPUT); // تنظیم پین به عنوان خروجی
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // ذخیره زمان فعلی
// تغییر وضعیت LED (روشن یا خاموش)
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState); // اعمال وضعیت جدید به پین
}
}
در این کد، زمان فعلی (currentMillis) از زمان قبلی (previousMillis) کم میشود. اگر نتیجه بیشتر از مقدار فاصلهی زمانی (interval) بود، LED تغییر وضعیت میدهد.
چون این روش غیرمسدودکننده است، هر کدی که خارج از شرط if قرار دارد، به صورت عادی اجرا میشود.
بنابراین شما میتوانید چند وظیفه دیگر به تابع loop() اضافه کنید و در عین حال LED هم هر ثانیه چشمک بزند.
کدام روش بهتر است؟
ما دو روش متفاوت برای کنترل زمان در آردوینو دیدیم:
- استفاده از
delay()→ ساده اما مسدودکننده - استفاده از
millis()→ کمی پیچیدهتر اما مناسب برای چندوظیفگی (Multitasking)
اگر پروژهتان نیاز به اجرای همزمان چند کار دارد، باید از تابع millis() استفاده کنید.









