اولین پروژه ای که هر نفر پس از شروع کار با آردوینو اجرا کرده است، پروژه ی چشمک زدن ال ای دی است که با استفاده از یک Delay تاخیر در برنامه ایجاد کرده و خروجی ال ای دی به مدت چند ثانیه یک بار چمشک میزند. اما اگر پس از گذشت چندین ماه بخواهیم یک برنامه نویسی چالشی تری داشته باشیم و سطح برنامه نویسی میکروها را افزایش دهیم، دیگر استفاده از Delay منطقی نخواهد یود. در این حالت به جای Delay بایستی از State Machine استفاده کنید. تابع millis یک تابع فوق العاده از کتابخانه های آردوینو است که به روش خودش تاخیر در برنامه ایجاد میکند. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
تابع millis و کاربرد
در برنامه نویسی آردوینو، میلیثانیه (به انگلیسی: Millis) یک تابع است که در دسترسی به زمان میلیثانیهها از زمانی که آردوینو را راهاندازی کردهایم، به کار میرود. این تابع بازگشت زمانی را برمیگرداند که از زمان شروع برنامه گذشته است.زمان در آردوینو بر اساس تیکهای ساعت سیستم عامل میکروکنترلر واحد پردازشی مرکزی (میکروکنترلر) محاسبه میشود. این تیکها به طور معمول هر ۴ میکروثانیه یک بار تولید میشوند.تابع millis() را میتوان برای محاسبه مدت زمانی استفاده کرد که از زمان شروع برنامه گذشته است. با استفاده از این تابع، میتوانید بهروزرسانیهای منظم و زمانبندی دقیق را در برنامههای خود پیادهسازی کنید.
برای مثال، اگر بخواهید یک واحد زمانی ۱ ثانیهای را بررسی کنید، میتوانید از تابع millis() استفاده کنید و مقدار آن را با ۱۰۰۰ مقایسه کنید. در زیر یک نمونه کد آردوینو قرار داده شده است که نشان میدهد چگونه از تابع millis() برای ایجاد تاخیر در برنامه استفاده کنید:
void setup() {
// عملیات مورد نیاز در مرحله راهاندازی
}void loop() {
// کد اصلی برنامه// تاخیر ۱ ثانیهای
unsigned long currentMillis = millis(); // زمان کنونی
unsigned long delayMillis = 1000; // تاخیر مورد نظر (۱ ثانیه)
if (currentMillis >= delayMillis) {
// انجام عملیات مورد نظر
//
تابع 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 در آردوینو استفاده کنیم؟
استفاده از تابع millis() در آردوینو اگر بخواهید زمانی را بررسی کنید که یک عملیات خاص انجام شده است. با استفاده از millis() میتوانید زمان دقیقی که از زمان شروع برنامه گذشته است را بررسی کنید و در صورت نیاز، عملیاتی را اجرا کنید.تاخیرهای مدت زمانی را پیادهسازی کنید. با استفاده از تابع millis() میتوانید تاخیرهای دقیق و دلخواه را در برنامه خود ایجاد کنید. به عنوان مثال، میتوانید با استفاده از یک متغیر و مقایسه آن با millis()، تاخیرهایی ایجاد کنید که به شما اجازه میدهد عملیاتهایی را با فواصل زمانی خاص انجام دهید.زمان را برای زمانبندی دقیق ترتیب دهید. با استفاده از millis() میتوانید زمانبندی دقیقتری را پیادهسازی کنید، مانند اجرای عملیاتها در بازههای زمانی مشخص.از تابع millis() برای جابجایی در زمان استفاده نکنید، چرا که این تابع تنها زمان گذشته از زمان شروع برنامه را برمیگرداند و قابلیت جابجایی در زمان را ندارد. برای جابجایی در زمان، میتوانید از توابعی مانند delay() یا توابع مرتبط با تایمرها استفاده کنید.
با استفاده از تابع millis() میتوانید زمانبندی دقیقتری را در برنامه خود پیادهسازی کنید. میتوانید مقدار millis() را با یک مقدار ثابت یا متغیری که زمان مورد نظر را نشان میدهد مقایسه کنید و در صورت رسیدن به زمان مورد نظر، عملیاتی را اجرا کنید. ممکن است نیاز داشته باشید تا در طول اجرای برنامه، تاخیرهای مدت زمانی خاص را پیادهسازی کنید. با استفاده از تابع millis() میتوانید تاخیرهای دقیق و تنظیمپذیر را ایجاد کنید. برای این کار، میتوانید مقدار millis() را در یک متغیر ذخیره کنید و با مقایسه آن با مقدار دلخواه، تشخیص دهید که آیا تاخیر مورد نظر گذشته است یا خیر.با استفاده از millis() میتوانید زمان اجرای برنامه را ردیابی کنید و در صورت نیاز به آن مقادیری بر اساس زمان گذشته برنامه را محاسبه کنید.
اگر نیاز دارید چندین وظیفه را همزمان در برنامه اجرا کنید، میتوانید از تابع millis() استفاده کنید. با ذخیره زمان شروع هر وظیفه و مقایسه آن با millis()، میتوانید بفهمید که آیا زمان اجرای وظیفه فعلی رسیده است یا خیر. این به شما امکان میدهد برنامههایی با وظایف مختلف را همزمان اجرا کنید. با استفاده از millis() میتوانید زمان استفاده از منابع مختلف مانند سنسورها، ماژولها، و روشنایی را ردیابی کنید. با ثبت زمان شروع و پایان عملیاتهای مختلف و محاسبه زمان استفاده از هر منبع، میتوانید عملکرد و بهرهوری برنامه را بهبود بخشید.به طور خلاصه، تابع millis() در آردوینو برای مدیریت زمان و اجرای دقیق وظایف مختلف در برنامههای شما بسیار مفید است. با استفاده از این تابع، میتوانید زمانبندی دقیقتری را ایجاد کنید، تاخیرها و زمانبندیهای مورد نیاز را پیادهسازی کنید و عملکرد و بهرهوری برنامه را بهبود بخشید.
تفاوت MILLIS با DELAY در چیست؟
تفاوت اصلی بین millis() و delay() در آردوینو در روش عملکرد آنها و تأثیر آن بر جریان اجرای برنامه است:
- millis(): تابع millis() زمان گذشته از زمان شروع برنامه را به میلیثانیه بازمیگرداند. این تابع در برنامههایی که به زمانبندی دقیق و انجام عملیاتها در بازههای زمانی خاص نیاز دارند، بسیار مفید است. با استفاده از تابع millis() و مقایسه زمانها، میتوانید تاخیرهای دقیق و تنظیمپذیر را پیادهسازی کنید و کنترل دقیقتری بر روی جریان اجرای برنامه داشته باشید. علاوه بر این، استفاده از millis() به شما اجازه میدهد تا عملیاتهای همزمان را اجرا کنید و بهرهوری بیشتری را از منابع برداشت کنید.
- delay(): تابع delay() مدت زمان مشخصی را به میلیثانیه تأخیر میدهد و فرآیندها را در طول آن توقف میدهد. با استفاده از delay() میتوانید عملیاتها را در فواصل زمانی مشخص توقف دهید. اما یکی از مشکلات این روش این است که در طول تأخیر، برنامه به صورت غیرقابل برگشت متوقف میشود و هیچ عملیات دیگری انجام نمیشود. این مشکل میتواند در برنامههایی که نیاز به همزمانی وظایف دارند یا نیاز به پاسخگویی به وقایع خارجی دارند، مشکلساز شود. به عبارت دیگر، delay() مسدودکننده است و اجرای سایر وظایف را در این بازه زمانی متوقف میکند.
به طور کلی، میتوان گفت که تفاوت اصلی بین millis() و delay() در زمانبندی و جریان اجرای برنامه است.millis() امکان زمانبندی دقیقتری را فراهم میکند، زیرا این تابع زمان گذشته از زمان شروع برنامه را به صورت پیوسته و مستمر بازمیگرداند. با استفاده از millis() و مقایسه زمانها، میتوانید تاخیرهای دقیق و تنظیمپذیر را پیادهسازی کنید و عملیاتها را در زمانهای مشخص اجرا کنید، در حالی که جریان اجرای برنامه بهطور مداوم ادامه مییابد.delay() به صورت مسدودکننده عمل میکند.
جمع بندی لیدی پای
وقتی از delay() استفاده میکنید، برنامه تا مدت زمان مشخص شده متوقف میشود و هیچ عملیات دیگری انجام نمیشود. این در مواقعی که نیاز به توقف موقت برنامه در طول اجرا وجود دارد، مفید است، اما میتواند در برنامههایی که نیاز به همزمانی وظایف یا پاسخگویی به وقایع خارجی دارند، از عملکرد صحیح خارج شود.بنابراین، در صورتی که نیاز دارید زمانبندی دقیقتری را پیادهسازی کنید و همزمانی وظایف را حفظ کنید، استفاده از millis() توصیه میشود. اما اگر تنها نیاز به توقف موقت برنامه در طول اجرا دارید و سایر وظایف مهم نیستند، میتوانید از delay() استفاده کنید. همچنین، برای برنامههای ساده و کوتاه مدت، ممکن است delay() مناسب باشد، اما در برنامههای بزرگتر و پیچیده،
از millis() در برنامههایی استفاده کنید که نیاز به زمانبندی دقیقتر و همزمانی وظایف دارند. میتوانید با استفاده از millis() رویدادها را در زمانهای دقیق و با تاخیرهای مدت زمانی خاص اجرا کنید. با مقایسه زمان گذشته از یک حالت خاص با millis() میتوانید بفهمید که آیا زمان تاخیر مورد نظر گذشته است و عملیات مربوطه را انجام دهید.با استفاده از millis() میتوانید چندین وظیفه را همزمان اجرا کنید. با ذخیره زمان شروع هر وظیفه و مقایسه آن با millis()، میتوانید تشخیص دهید که آیا زمان اجرای وظیفه رسیده است یا خیر. این به شما امکان میدهد وظایف مختلفی را همزمان و هماهنگ اجرا کنید.با استفاده از millis() میتوانید تاخیرهای دقیق و تنظیمپذیر را پیادهسازی کنید. به جای استفاده از delay() که منجر به توقف کلیه عملیات میشود، میتوانید با مقایسه زمان گذشته با millis()، تشخیص دهید که آیا تاخیر مورد نظر گذشته است یا خیر و عملیات بعدی را انجام دهید.
وسایل مورد نیاز
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام و خسته نباشید کار کردن با میلیس دشواره اما خیلی خوب و روان توضیح دادید
مرسی مهندس
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم مفید واقع شده باشد.
کامل ترین آموزش که میشه millis و نحوه ی زمان بندی رو توضیح داد دیدم واقعا ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
سلام
منظور از زمان interval در کد برنامه چیست؟
با سلام
منظور از interval مدت زمان تاخیر در برنامه است.
millis تاخیر در برنامه ایجاد میکند؟
با سلام
خیر، میلیس مدت زمان شروع به کار برنامه را محاسبه میکند.
سلام و خسته نباشید آیا برای کاهش خطا و نویز هم millis تاثیری در برنامه میگذارد؟
با سلام
بله استفاده از millis کد آردوینو نوشته شده دقیق تر عمل خواهد کرد.
با سلام
آیا millis برای بردهای esp هم کار میکنه مثلا همین آموزش رو روی برد nodemcu تست کنیم؟
با سلام
بله تفاوتی ندارد و قابل اجرا است. بررسی و نتیجه را اعلام کنید.
کاربرد millis در برنامه نویسی آردوینو دقیقا چیه
با سلام
کاربر گرامی در همین آموزش صفر تا صد معرفی millis همراه با تست کد قرار گرفته شده است، بررسی کنید.
با سلام
برای استفاده از millis باید کتابخانه ی خاصی را در کد اضافه کنیم؟
با سلام
خیر نیازی به استفاده از کتابخانه نیست و کافی است آن را در یک متغیر ذخیره کرده و از آن در برنامه استفاده کنید.
در کد دو currentmillis premillis از هم کم شده اند چرا ؟ لطفا توضیح دهید.
با سلام
در این خط بررسی میشود آیا مدت زمان سپری شده بیشتر از عدد interval تعریف شده در کد هست یا خیر، اگر بیشتر یود، ال ای دی را به مدت مثلا ۳ ثانیه روشن کند و سپس خاموش کند.
سلام
با تغییر اینتروال کد با مشکل رو به رو نمیشود؟
با سلام
کاربر گرامی در این کد منظور از interval مدت زمان روشن بودن و خاموش بودن ال ای دی است که میتوانید هر عددی را جایگزین کنید. مثلا اگر ۶ قرار دهید، ۶ ثانیه روشن و ۶ ثانیه خاموش خواهد شد.
با سلام
خانم مهندس چرا millis در current ذخیره میشه؟
با سلام
هر بار بایستی بازه ی زمانی آپدیت شود.
برای توضیحاات کامل شما ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم مفید واقع شده باشد
سلام
واحد شمارش millis میلی ثانیه است یا میکروثانیه?
با سلام
بر حسب میلی ثانیه است.