آردوینو آردوینو Arduino Uno آموزش آردوینو

آموزش آردوینو بخش هفدهم – استفاده کاربردی از تابع زمانی millis

arduino-basic-tutorial-part-sixteen-millis-function-digispark
نوشته شده توسط پریسا پوربلورچیان

اولین پروژه ای که هر نفر پس از شروع کار با آردوینو اجرا کرده است، پروژه ی چشمک زدن ال ای دی است که با استفاده از یک Delay تاخیر در برنامه ایجاد کرده و خروجی ال ای دی به مدت چند ثانیه یک بار چمشک می‌زند. اما اگر پس از گذشت چندین ماه بخواهیم یک برنامه نویسی چالشی تری داشته باشیم و سطح برنامه نویسی میکروها را افزایش دهیم، دیگر استفاده از Delay منطقی نخواهد یود. در این حالت به جای Delay بایستی از State Machine استفاده کنید. تابع millis یک تابع فوق العاده از کتابخانه های آردوینو است که به روش خودش تاخیر در برنامه ایجاد می‌کند. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

برد آردوینو uno بخش هفدهم آموزش برنامه نویسی - دیحی اسپارک

 


تابع millis و کاربرد


در برنامه نویسی آردوینو، میلی‌ثانیه (به انگلیسی: Millis) یک تابع است که در دسترسی به زمان میلی‌ثانیه‌ها از زمانی که آردوینو را راه‌اندازی کرده‌ایم، به کار می‌رود. این تابع بازگشت زمانی را برمی‌گرداند که از زمان شروع برنامه گذشته است.زمان در آردوینو بر اساس تیک‌های ساعت سیستم عامل میکروکنترلر واحد پردازشی مرکزی (میکروکنترلر) محاسبه می‌شود. این تیک‌ها به طور معمول هر ۴ میکروثانیه یک بار تولید می‌شوند.تابع millis() را می‌توان برای محاسبه مدت زمانی استفاده کرد که از زمان شروع برنامه گذشته است. با استفاده از این تابع، می‌توانید به‌روزرسانی‌های منظم و زمان‌بندی دقیق را در برنامه‌های خود پیاده‌سازی کنید.

برای مثال، اگر بخواهید یک واحد زمانی ۱ ثانیه‌ای را بررسی کنید، می‌توانید از تابع millis() استفاده کنید و مقدار آن را با ۱۰۰۰ مقایسه کنید. در زیر یک نمونه کد آردوینو قرار داده شده است که نشان می‌دهد چگونه از تابع millis() برای ایجاد تاخیر در برنامه استفاده کنید:

void setup() {
// عملیات مورد نیاز در مرحله راه‌اندازی
}void loop() {
// کد اصلی برنامه// تاخیر ۱ ثانیه‌ای
unsigned long currentMillis = millis();  // زمان کنونی
unsigned long delayMillis = 1000;  // تاخیر مورد نظر (۱ ثانیه)
if (currentMillis >= delayMillis) {
// انجام عملیات مورد نظر
//

 

در کد، هر ثانیه یک بار زمان گذشته از زمان شروع برنامه را نمایش می‌دهد. از تابع millis() برای محاسبه زمان گذشته و تعیین زمان بررسی‌ها استفاده می‌شود. توجه کنید که سرعت ارتباط سریال در این مثال ۹۶۰۰ بیت در ثانیه است و شما می‌توانید آن را براساس نیاز خود تغییر دهید.با اجرای این کد در آردوینو، می‌توانید تاخیر میان هر بررسی را با استفاده از تابع millis() کنترل کنید و عملیات مورد نظر خود را در هر بازه زمانی انجام دهید.
// زمان آخرین بررسی
unsigned long lastCheckTime = 0;
// مدت زمان بررسی‌ها (۱ ثانیه)
const unsigned long checkInterval = 1000;
void setup() {
  // عملیات مورد نیاز در مرحله راه‌اندازی
  Serial.begin(9600);  // شروع ارتباط سریال
}
void loop() {
  // کد اصلی برنامه
  // بررسی زمان
  unsigned long currentMillis = millis();
  if (currentMillis – lastCheckTime >= checkInterval) {
    // زمان بررسی‌ها فرا رسیده است
    // انجام عملیات مورد نظر
    // نمایش زمان بررسی
    Serial.print(“Time since program start: “);
    Serial.println(currentMillis);
    // به‌روزرسانی زمان آخرین بررسی
    lastCheckTime = currentMillis;
  }
  // ادامه بقیه کد برنامه
}

 

 

تابع 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):
}

 

در این برنامه پس از اجرا در سریال مانیتور مدت زمان سپری شده پس از اتصال برق به آردوینو محاسبه شده و بر حسب میکروثانیه نمایش داده می‌شود.

سریال مانیتور تابع millis در آردوینو - دیجی اسپارک

 

در این مرحله اگر بخواهیم همان برنامه ی 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 در برد آردوینو Uno - دیجی اسپارک

 

در این برنامه از 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()، تشخیص دهید که آیا تاخیر مورد نظر گذشته است یا خیر و عملیات بعدی را انجام دهید.

 


وسایل مورد نیاز


برد آردوینو Arduino UNO

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۶ دیدگاه