در این آموزش توابع آردوینو به کمک 4 تابع فوق (توابع زمانی)، تاخیر و تایمر (زمان سنجی) در میکروکنترلر را برسی میکنیم.
جهت شرکت در دوره، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.
;()delay
شرح:
این تابع، برنامه را به اندازه دلخواه (بر حسب میلی ثانیه) متوقف می کند. هر ثانیه شامل 1000 میلی ثانیه است.
ساختار کد دستور:
delay(ms)
مولفه ها:
- ms: تعداد میلی ثانیه هایی که برنامه باید متوقف شود. (داده مجاز: unsigned long)
مقدار بازگشتی:
ندارد.
نمونه کد:
در کد زیر قبل از این که وضعیت پین مورد نظر را تغییر بدهیم، برنامه را برای یک ثانیه متوقف کردهایم.
int ledPin = 11; // LED را به دیجتیال پین 11 متصل کرده ایم
void setup() {
pinMode(ledPin, OUTPUT); // دیجیتال پین را به عنوان خروجی تنظیم کرده ایم
}
void loop() {
digitalWrite(ledPin, HIGH); // LED را روشن کرده ایم
delay(1000); // یک ثانیه برنامه را متوقف میکنیم
digitalWrite(ledPin, LOW); // LED را خاموش کرده ایم
delay(1000); // یک ثانیه برنامه را متوقف میکنیم
}
یادداشت ها و اخطارها:
راه اندازی برنامه چشمک زن با استفاده از توابع زمانی delay بسیار سادهاست. به همین خاطر در بسیاری از پروژه ها برای ایجاد تاخیرهای کوتاه مدت از این تابع استفاده میشود. مثلا با استفاده از delay یک تاخیر بسیار کوتاه ایجاد میکنیم تا سوییچ عملکرد بهتری داشتهباشد. با این وجود لازم است معایب این تابع را بشناسیم.
در صورتی که با استفاده از delay در برنامه تاخیر ایجاد کرده باشید، برنامه متوقف خواهد شد. در نتیجه خواندن مقدار سنسورها، انجام محاسبات ریاضی، تغییر وضعیت پین ها و… نیز متوقف خواهد شد تا مدت زمان تعیین شده سپری شود. به همین خاطر بهتر است از برنامه های جایگزین مثل چشمک زن بدون تاخیر یا تابع millis() در برنامه استفاده شود. این تابع در ادامه بررسی شده است.
برنامه نویسان حرفه ای معمولا برای برنامه های کمتر از 10 میلی ثانیه سراغ تابع delay میروند. البته که در پروژه های ساده مثل چمشک زن میتوان از تابع delay به راحتی استفاده کرد، چون هیچ اختلالی در برنامه ایجاد نمیشود.
با این حال، این تابع تنها دستوراتی که در حلقه تکرار قرار گرفته اند را متوقف میکند. در واقع مواردی مثل روتین وقفه به صورت منظم به فعالیت خود ادامه میدهند و مقدار تاخیر delay هیچ اثری روی آنها نخواهد داشت. ارتباط سریال و دیتای پین Rx، مقادیر PWM، وضعیت قبلی پینها و روتین وقفه بدون توجه به دستور delay در برنامه اجرا میشوند.
;()delayMicroseconds
شرح:
برنامه را برای مدت زمان مشخص و بر حسب میکروثانیه متوقف میکند. هر ثانیه شامل یک میلیون میکروثانیه است.
اگر میخواهید یک تاخیر دقیق ایجاد کنید، باید حداکثر عدد 16383 را در این تابع قرار دهید. با استفاده از این تابع نمیتوان تاخیرهای خیلی طولانی ایجاد کرد و ممکن است آردوینو در ورژنهای بعدی این موضوع را تغییر و بهبود بدهد. در هر صورت اگر قصد دارید تاخیرهای بیشتر از 16 هزارمیکروثانیه ایجاد کیند، تابع delay بهترین گزینه خواهد بود.
ساختار کد دستور:
delayMicroseconds(us)
مولفه ها:
us: تعداد میکروثانیه هایی که برنامه باید متوقف شود. (داده مجاز: unsigned int)
مقدار بازگشتی:
ندارد.
نمونه کد:
در برنامه زیر پین 8 را به عنوان خروجی تعریف کرده ایم و یک تاخیر 100 میکروثانیه ایجاد کردهایم. با اجرای دستورات زیر میکروکنترلر یک رشته پالس 100 میکروثانیه را ایجاد میکند.
int outPin = 13; //یجیتال پین 13
void setup() {
pinMode(outPin, OUTPUT); // دیجیتال پین 13 را به عنوان خروجی تعریف کرده ایم
}
void loop() {
digitalWrite(outPin, HIGH); // پین مورد نظر را فعال کرده ایم
delayMicroseconds(50); // پالس 50 میکروثانیه ای تعریف کرده ایم
digitalWrite(outPin, LOW); // پین مورد نظر را غیرفعال کرده ایم
delayMicroseconds(50); // پالس 50 میکروثانیه ای تعریف کرده ایم
}
یادداشت ها و اخطارها:
از این تابع میتوانید برای ایجاد پالس های 3 میکروثانیه تا 1638 میکروثانیه استفاده کنید. این تابع تنها در این محدوده دقیق عمل میکند و برای ایجاد تاخیرهای بزرگ تر امکان خطای ناچیز وجود دارد. از آردوینو ورژن 18 تابع ()delayMicroseconds سایر وقفه ها را غیرفعال نمی کند.
;()micros
شرح:
این تابع تعداد میکروثانیه هایی که پس از روشن شدن آردوینو سپری شده را برمیگرداند. تقریبا هر 70 دقیقه یک بار این عدد سرریز شده و صفر میشود. در بردهای خانواده Arduino Portenta این تابع با رزولوشن یک ثانیه عمل میکند.
در بردهای آردوینو با فرکانس 16 مگاهرتز مثل Duemilanove و Nano این تابع با رزولوشن چهار میکروثانیه عمل میکند. به این معنی که عدد بازگشتی همیشه ضریبی از چهار است. همچنین در بردهای آردوینو با فرکانس 8 مگاهرتز مثل LilyPad عملکرد این تابع با رزولوشن 8 میکروثانیه خواهد بود.
ساختار کد دستور:
time = micros();
مولفههای توابع زمانی: micros()
بدون مولفه.
مقدار بازگشتی:
مقدار میکروثانیه سپری شده از زمان روشن شدن آردوینو تا حال حاضر را برمیگرداند. (داده مجاز: unsigned long)
نمونه کد:
کد زیر تعداد میکروثانیه های سپری شده پس از زمان شروع کار آردوینو را برمیگرداند و در سریال مانیتور چاپ میکند.
unsigned long time;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Time: ");
time = micros();
Serial.println(time); //مدت زمان سپری شده پس از روشن شدن آردوینو را پرینت میکند
delay(1000); //یک ثانیه صبر میکند و مجدد برنامه اجرا میشود
}
یادداشت ها و اخطارها:
هر یک میلی ثانیه شامل 1000 میکروثانیه بوده و هر ثانیه شامل 1000000 ثانیه است.
;()millis
شرح:
این تابع تعداد میلی ثانیه هایی که پس از روشن شدن آردوینو سپری شده را برمیگرداند. این عدد هر 49 روز یکبار سرریز و صفر میشود.
آموزش برنامه نویسی آردوینو (تکنیک استفاده از تابع millis)
ساختار کد دستور:
time = millis();
مولفه ها:
بدون مولفه.
مقدار بازگشتی:
مدت زمان روشن بودن آردوینو را برحسب میلی ثانیه برمیگرداند. (داده مجاز: unsigned long)
نمونه کد:
با استفاده از کدهای زیر، تعداد میلی ثانیه های سپری شده پس از روشن شدن آردوینو را روی سریال مانیتور چاپ میکنیم.
unsigned long myTime;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Time: ");
myTime = millis();
Serial.println(myTime); // prints time since program started
delay(1000); // wait a second so as not to send massive amounts of data
}