اولین پروژه ای که هر نفر پس از شروع کار با آردوینو اجرا کرده است، پروژه ی چشمک زدن ال ای دی است که با استفاده از یک Delay تاخیر در برنامه ایجاد کرده و خروجی ال ای دی به مدت چند ثانیه یک بار چمشک میزند. اما اگر پس از گذشت چندین ماه بخواهیم یک برنامه نویسی چالشی تری داشته باشیم و سطح برنامه نویسی میکروها را افزایش دهیم، دیگر استفاده از Delay منطقی نخواهد یود. در این حالت به جای Delay بایستی از State Machine استفاده کنید. تابع millis یک تابع فوق العاده از کتابخانه های آردوینو است که به روش خودش تاخیر در برنامه ایجاد میکند. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
تابع millis و کاربرد
تابع millis() در آردوینو مدت زمان شروع به کار را محاسبه کرده و عدد را بر حسب میکروثانیه برمیگرداند. از زمانی که برق به آردوینو متصل شده است تا زمانیکه قطع ارتباط شود، این زمان محاسبه شده و در نهایت پس از ۴۹ روز سرریز Overflow خواهد شد. تا این مرحله برای ایجاد تاخیر در برنامه از این اصطلاح استفاده شده است که یک مدت زمان مشخص تاخیر ایجاد شوذ میتوانیم از چه مدت زمان سپری شده است استفاده کنیم تا برنامه ها را در سطح حرفه ای تری اجرا کنیم. به عنوان مثال یک تاخیر در برنامه با Delay به صورت نمونه کد زیر است.
byte led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
در این برنامه یک تاخیر یک ثانیه ای برای اجرای هر بار دستور نوشته شده در Loop برنامه اعمال میشود. به عنوان نمونه یک ال ای دی LED به پایه شماره ۱۳ متصل شده است که هر یک ثانیه یک بار روشن HIGH و خاموش LOW میشود. اما اگر بخواهیم برنامه را millis اجرا کنیم و مدت زمان سپری شده در زمان روشن بودن و مدت زمان سپری شده در زمان خاموش بودن را مشخص کنیم دیگر Delay برای ما کافی نیست و بایستی از تابع دیگری یعنی millis استفاده کنیم. میلیس millis یک کتابخانه داخلی آردوینو است که مدت زمان شروع به کار برنامه را در آردوینو به ما برمیگرداند. برای استفاده از تابع میلیس millis بایستی آن را با متغیری دلخواه و نوع داده long در برنامه فراخوانی کنیم.
long myarduinotime; void setup() { Serial.begin(9600); } void loop() { myarduinotime = millis(); Serial.print("myarduinotime"); Serial.println(myarduinotime); delay(500): }
در این برنامه پس از اجرا در سریال مانیتور مدت زمان سپری شده پس از اتصال برق به آردوینو محاسبه شده و بر حسب میکروثانیه نمایش داده میشود.
در این مرحله اگر بخواهیم همان برنامه ی Blink را با millis() بنویسیم؟ باید چه کاری انجام دهیم؟ برای استفاده از تابع millis باید دو زمان حال و زمان سپری شده را در کد برنامه لحاظ کنیم. سپس با تکنیک کدنویسی ifelse در برنامه بایستی مشخص کنیم که آخرین باری که ال ای دی چشمک زده است چه زمانی بوده است و چه زمانی به روز رسانی میشود. به عنوان مثال اگر مدت زمان چشمک زدن را ۵ ثانیه یکبار در نظر بگیریم، برنامه بررسی میکند که آیا ۵۰۰۰ میلی ثانیه مد نظر سپری شده است یا خیر که اگر شده باشد، ال ای دی به مدت ۵ ثانیه روشن است و دوباره به وضعیت قبل بازمیگردد. با سپری شدن هر ۵ ثانیه شرط برنامه صحیح شده و ال ای دی چشمک خواهد زد.
int led = 13; // برای تغییر وضعیت led نیاز به یک متغیر داریم boolean ledstate = LOW; //آخرین باری که LED تغییر وضعیت داده و آپدیت شده را ذخیره میکنیم long premillis = 0; //مشخص میکنم led چند ثانیه یه بار چشمک بزن // اینجا یک ثانیه یک بار قراره چشمک بزنه long interval = 1000; void setup() { Serial.begin(9600); pinMode(led, OUTPUT); } void loop() { //زمان شروع برنامه در آردوینو در زمان حال حاضر یعنی current مدام ذخیره میشه //مدام چک میکنه ببینه زمان تغییر وضعیت led رسیده یا نه long currentmillis = millis(); if(currentmillis - premillis >= interval){ // ذخیره ی آخرین زمانی که ال ای دی چشمک زده premillis = currentmillis; // اگر ال ای دی خاموش بود، روشنش کنه // if LED== OFF => LED ==ON if(ledstate == LOW){ ledstate = HIGH; }else{ ledstate = LOW; } // تغییرات را روی ال ای دی چاپ کنه digitalWrite(led, ledstate); }}
در این برنامه از millis, Premillis, Currentmillis برای محاسبه مدت زمان سپری شده برای روشن بودن و مدت زمان سپری شده برای خاموش بودن استفاده خواهیم کرد. سپس در ifelse یک شرط مینویسیم به این صورت که اگر اختلاف بین زمان حال و زمان سپری شده از زمان تاخیر بزرگتر باشد، تغییرات را در خروجی ال ای دی اعمال کند.
long currentmillis = millis(); // چک میکنه اگر currentmillis و premillis اختلافشون بزرگتر یا مساوره اینتروال بود if(currentmillis - premillis >= interval){ // ذخیره ی آخرین زمانی که ال ای دی چشمک زده premillis = currentmillis;
کد برنامه همراه با کامنت فارسی در اختیار شما قرار گرفته شده است تا بتوانید هر حط از برنامه را تحلیل کنید. با توجه به اینکه خروجی در این برنامه یک ال ای دی است، یک متغیر برای وضعیت ال ای دی در برنامه مشخص شده است، در صورتی که مدت زمان سپری شده در آردوینو از ۵ ثانیه بیشتر بود، وضعیت ال ای دی اگر خاموش باشد، روشن شده و به همان میزان زمان ۵ ثانیه روشن بماند،در غیر اینصورت غیرفعال شود. منظور از ledstate همان متغیر برای وضعیت ال ای دی است که چه زمانی LOW و چه زمانی HIGH است و در صورت LOW بودن، اگر بازه های زمانی برقرار باشد، HIGH شده و در غیر اینصورت غیرفعال است.در نهایت بایستی تغییرات را به صورت سخت افزاری هم مشاهده کنیم که از یک digitalWrite استفاده خواهیم کرد.
// if LED== OFF => LED ==ON if(ledstate == LOW){ ledstate = HIGH; }else{ ledstate = LOW; } // تغییرات را روی ال ای دی چاپ کنه digitalWrite(led, ledstate);
برای استفاده از تابع millis نیاز به تمرین تکرار و نوشتن الگوریتم برای روند کار در برنامه خواهید داشت. در کارگاه های آردوینو مثال های متعددی برای اجرای milllis و استفاده از آن آموزش خواهیم داد.
وسایل مورد نیاز
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام و خسته نباشید کار کردن با میلیس دشواره اما خیلی خوب و روان توضیح دادید
مرسی مهندس
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم مفید واقع شده باشد.
کامل ترین آموزش که میشه millis و نحوه ی زمان بندی رو توضیح داد دیدم واقعا ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
سلام
منظور از زمان interval در کد برنامه چیست؟
با سلام
منظور از interval مدت زمان تاخیر در برنامه است.
millis تاخیر در برنامه ایجاد میکند؟
با سلام
خیر، میلیس مدت زمان شروع به کار برنامه را محاسبه میکند.
سلام و خسته نباشید آیا برای کاهش خطا و نویز هم millis تاثیری در برنامه میگذارد؟
با سلام
بله استفاده از millis کد آردوینو نوشته شده دقیق تر عمل خواهد کرد.
با سلام
آیا millis برای بردهای esp هم کار میکنه مثلا همین آموزش رو روی برد nodemcu تست کنیم؟
با سلام
بله تفاوتی ندارد و قابل اجرا است. بررسی و نتیجه را اعلام کنید.
کاربرد millis در برنامه نویسی آردوینو دقیقا چیه
با سلام
کاربر گرامی در همین آموزش صفر تا صد معرفی millis همراه با تست کد قرار گرفته شده است، بررسی کنید.
با سلام
برای استفاده از millis باید کتابخانه ی خاصی را در کد اضافه کنیم؟
با سلام
خیر نیازی به استفاده از کتابخانه نیست و کافی است آن را در یک متغیر ذخیره کرده و از آن در برنامه استفاده کنید.
در کد دو currentmillis premillis از هم کم شده اند چرا ؟ لطفا توضیح دهید.
با سلام
در این خط بررسی میشود آیا مدت زمان سپری شده بیشتر از عدد interval تعریف شده در کد هست یا خیر، اگر بیشتر یود، ال ای دی را به مدت مثلا ۳ ثانیه روشن کند و سپس خاموش کند.
سلام
با تغییر اینتروال کد با مشکل رو به رو نمیشود؟
با سلام
کاربر گرامی در این کد منظور از interval مدت زمان روشن بودن و خاموش بودن ال ای دی است که میتوانید هر عددی را جایگزین کنید. مثلا اگر ۶ قرار دهید، ۶ ثانیه روشن و ۶ ثانیه خاموش خواهد شد.
با سلام
خانم مهندس چرا millis در current ذخیره میشه؟
با سلام
هر بار بایستی بازه ی زمانی آپدیت شود.
برای توضیحاات کامل شما ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم مفید واقع شده باشد
سلام
واحد شمارش millis میلی ثانیه است یا میکروثانیه?
با سلام
بر حسب میلی ثانیه است.