آموزش millis در آردوینو؛ چشمکزن بدون delay

در این آموزش millis در آردوینو چراغ داخلی برد را بدون delay() چشمکزن میکنیم. delay() برای تمرینهای ساده خوب است، اما هنگام انتظار، اجرای بخشهای دیگر حلقه را عقب میاندازد. با بررسی ساعت برنامه در هر دور حلقه، میتوان همزمان ورودیها را نیز پیگیری کرد.
millis چگونه کار میکند؟
تابع millis() زمان سپریشده از شروع اجرای برنامه را برحسب میلیثانیه برمیگرداند. در بردهای رایج Arduino، این مقدار در نوع unsigned long نگهداری میشود. بهجای انتظار ثابت، اختلاف زمان فعلی و زمان آخرین تغییر را با فاصلهٔ دلخواه مقایسه میکنیم. این روش با سرریز شمارنده نیز به شکل معمول درست کار میکند، به شرط آنکه از تفریق unsigned و بازهٔ مناسب استفاده کنیم.
کد چشمکزن بدون delay
const int ledPin = LED_BUILTIN;
const unsigned long interval = 500;
unsigned long previousMillis = 0;
bool ledState = false;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(ledPin, ledState ? HIGH : LOW);
}
// کارهای دیگر برنامه اینجا اجرا میشوند.
}
LED داخلی تقریباً هر نیم ثانیه تغییر وضعیت میدهد؛ بنابراین یک چرخهٔ کامل روشن و خاموش حدود یک ثانیه طول میکشد. previousMillis آخرین لحظهٔ تغییر را نگه میدارد. اگر بار پردازشی حلقه سنگین باشد، زمانبندی دقت سختافزاری نخواهد داشت. برای کارهای حساس به زمان، روش مناسب همان کاربرد را انتخاب کنید.
تفاوت با delay و خطاهای رایج
اگر در همین حلقه delay(500) بنویسیم، خواندن دکمه یا حسگر در این فاصله انجام نمیشود. نوع متغیر زمان را unsigned long بگذارید؛ int برای زمان سپریشده مناسب نیست. همچنین شرط را به صورت اختلاف زمان بنویسید، نه مقایسهٔ مستقیم زمان فعلی با جمع دو زمان. برای تمرین، دکمهٔ فشاری را بخوانید و وضعیت دکمه را در هر دور حلقه بررسی کنید.
تمرین
فاصله را به ۲۵۰ میلیثانیه تغییر دهید. سپس مقدار حسگر نور LDR را با مانیتور سریال نمایش دهید، در حالی که LED چشمک میزند. برای آشنایی با روش رسمی، نمونهٔ Blink Without Delay در مستندات آردوینو را ببینید.