پرش به محتوا

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

یکی از کاربردی ترین توابع آردوینو که به صورت پیش فرض در آردوینو وجود دارد و از ابتدای برنامه شروع به کار میکند تابع پر کاربرد millis است. به طور کلی عملکرد اصلی این تابع شمارش زمان سپری شده از شروع برنامه است. در واقع هنگامی که شما برد آردوینو را روشن میکنید و برنامه از پیش تعریف شده شروع به کار میکند این تابع در ازای هر میلی ثانیه یک عدد به مقدار متغییر خود اضافه میکند. از آنجایی که بزرگ ترین متغییر عددی در آردوینو unsigned long هست ، حداکثر مدت زمان حدود 49 روز بر حسب میلی ثانیه را میتوانید در آن ذخیره کنید. البته با هر بار ریست شدن برد یا خاموش و روشن شدن آن، این متغییر مقدار خود را از صفر شروع میکند.

اگر با آردینو آشنایی ندارید آموزش مقدماتی آردوینو را ببینید.

				
					unsigned long myTime;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Time: ");
  myTime = millis();

  Serial.println(myTime); // زمان از شروع برنامه را چاپ می کند
  delay(1000);          // یک ثانیه صبر کنید تا حجم انبوهی از داده ارسال نشود
}
				
			

این کد مثال، تعداد میلی‌ثانیه‌های سپری شده از زمانی که برد آردوینو شروع به اجرای کد خود کرده است را روی پورت سریال چاپ می‌کند.

نکته: برای واحد میکرو ثانیه معادل همین تابع میتوانید از تابع ;()micros استفاده کنید.

یکی از کاربرد های تابع ;()millis

برای درک بهتر این کاربرد ابتدا آموزش آردوینو نحوه کد نویسی مثال زیر بدون تابع millis را برسی میکنیم.

برنامه ای بنویسید که دو خروجی آردوینو (7 و 8) که متصل به دو LED هستند با زمان های مختلف چشمک بزنند. LED اول که متصل به پایه 7 است، با تاخیر 200 میلی ثانیه و LED دوم که متصل به پایه 8 است، با تاخیر 800 میلی ثانیه چشمک بزنند.

برنامه عملی این مثال میتواند مانند کد زیر ساده و مبتدی اجرا شود. (صرفا جهت نمونه برنامه)

				
					#define LED1 7
#define LED2 8

void setup() {
  pinMode(LED1 ,OUTPUT);
  pinMode(LED2 ,OUTPUT);
}
void loop() {
  for(int count=0; count < 2; count++)
      {
      digitalWrite(LED1 ,HIGH);
      delay(200);
      digitalWrite(LED1 ,LOW); 
      delay(200);
      }
  digitalWrite(LED2 ,HIGH);
  for(int count=0; count < 2; count++)
      {
      digitalWrite(LED1 ,HIGH);
      delay(200);
      digitalWrite(LED1 ,LOW); 
      delay(200);
      }
  digitalWrite(LED2 ,LOW);      
}
				
			

همان طور که مشاهده کردید به سادگی این برنامه با دو حلقه for قابل اجرا هست؛ اکنون به کمک تابع millis حل این مثال را مرحله به مرحله برسی میکنیم.

آموزش آردوینو: ابتدا باید در شروع برنامه مقدار تابع millis را در یک متغییر ذخیره کنیم. این زمان واقعی را مشخص میکند. با هر بار اجرای شرط چشمک زن؛ زمان واقعی آن لحظه را در یک متغییر دیگر ذخیره میکنیم. برای شرط بعدی به کمک اختلاف زمان واقعی آن لحظه و زمان ذخیره شده از اجرا شرط قبلی ، زمان اجرای مجدد شرط مشخص می شود. برای درک بهتر برنامه زیر را مطالعه کنید.

				
					#define LED1TIME 200
now_time = millis();
  
  if( now_time - last_time1 > LED1TIME)
      {
      bool led1 = digitalRead(LED1);  
      digitalWrite(LED1 ,!led1); 
      last_time1 = millis();   
      } 
				
			

در برنامه بالا هر 200 میلی ثانیه یک بار شرط اجرا میشود. به کمک متغییر led1 وضعیت فعلی خروجی را ذخیره میکنیم و در تابع digitalWrite معکوس آن را فراخوانی میکنیم تا خروجی معکوس شود و عمل چشمک زدن انجام شود.

برنامه نهایی این پروژه

در آخر دو شرط مانند کد بالا می نویسیم تا هر کدام از خروجی های به طور مستقل عمل کنند. برای درک بهتر این تکنیک کد زیر را به طور عملی تست کنید.

				
					#define LED1 7
#define LED2 8

#define LED1TIME 200
#define LED2TIME 800

unsigned long last_time1;
unsigned long last_time2;
unsigned long now_time;

void setup() {
  pinMode(LED1 ,OUTPUT);
  pinMode(LED2 ,OUTPUT);
}
void loop() {
  now_time = millis();
  
  if( now_time - last_time1 > LED1TIME)
      {
      bool led1 = digitalRead(LED1);  
      digitalWrite(LED1 ,!led1); 
      last_time1 = millis();   
      } 
  if( now_time - last_time2 > LED2TIME)
      {
      bool led2 = digitalRead(LED2);  
      digitalWrite(LED2 ,!led2); 
      last_time2 = millis();   
      }       
}
				
			

برای اجرای برنامه بالا به دو حلقه نیاز داریم تا به طور مستقل از یکدیگر عمل چشمک زدن را انجام دهند. برخی از پردازنده ها این قابلیت را در اختیار شما قرار میدهند تا دو یا چند حلقه به طور موازی کد نویسی کنید. اما در برد های معمولی آردوینو مانند ARDUINO UNO شما فقط به یک حلقه برای کد نویسی دسترسی دارید.

در مثال اول آموزش ، برنامه ای ساده تر برای اجرای این پروژه نوشتیم؛ بدیهی است که در کد جدید، حجم برنامه مشابه یا حتی بیشتر از مثال ساده اول آموزش است. حال اگر به جای 2 خروجی 5 خروجی چشمک زن با زمان ها متفاوت داشتیم ، به روش ساده تر حجم برنامه چه مقدار افزایش پیدا میکرد؟

یکی از مهم ترین کاربرد های این تکنیک، زمانی است که علاوه بر تاخیر های برنامه باید به طور مستمر و سریع مقدار یک ورودی را چک کنید؛ مثلا اگر به موازات چشمک زدن LED ها مقدار یک کلید را بخوانید قطعا مثال ساده تر ابتدای آموزش توانایی انجام سریع این کار را ندارد.

نظر یا سوالات خود را در مورد این آموزش در قسمت دیدگاه ها بنویسید.

میلاد نیک پندار

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

نشانی ایمیل شما منتشر نخواهد شد.

ورود

عضو سایت نیستید؟ برای ثبت نام کلیک کنید

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

تماس با ما

این پیام توسط مدیریت سایت دریافت میشود.