در سلسله آموزش های برد Maixduino، قسمت هفتم به زمانبندی، ایجاد تاخیر در اجرا و… با تابع millis در sipeed می پردازیم. در قسمت های پیشین امکانات بسیاری از این برد فوق العاده را مورد بررسی قرار دادیم. در قسمت های پیشین این سلسله آموزش، امکانات جانبی برد و نحوه برنامه نویسی آن را مشاهده نمودیم. در این آموزش قصد داریم تا به یکی از مهم ترین دستورات و توابع برنامه نویسی جهت زمانبندی اجرای کدها و ایجاد تاخیر در اجرای برنامه ها، بپردازیم. در ادامه این آموزش با مرجع تخصصی برد هوش مصنوعی Sipeed به زبان فارسی، دیجی اسپارک همراه باشید.
ایجاد تاخیر در اجرای برنامه ها
یکی از موارد مهم در برنامه نویسی، ایجاد تاخیر لازم برای اجرای پروسه های زمانبر است. گاهی اوقات لازم است تا اجرای برنامه برای مدتی متوقف شده تا تابعی زمانبر اجرا گردد. بدین ترتیب برنامه متوقف شده، پروسه مد نظر اجرا شده و دوباره روال کلی کار از سر گرفته خواهد شد. به عنوان مثال هنگام کار با ماژول مخابراتی SIM800L، در هنگام ارسال دستورات AT، نیاز به مدتی زمانی جهت ارسال کامل دستورات به ماژول داریم. به این منظور به کمک تابع delay، می توانیم تاخیری به صورت میلی ثانیه ایجاد کنیم. این تابع به شکل زیر تعریف می شود.
delay(unsigned long ms)
مطابق تابع فوق، با قرار گیری عدد در ورودی، تاخیر به میلی ثانیه ایجاد خواهد گردید. در کنار این، تابع delayMicroseconds نیز وظیفه ایجاد تاخیر به میکروثانیه را دارد. این تابع نیز به شکل زیر تعریف می گردد.
delayMicrosends(unsigned int)
مطابق تابع فوق، می توان یک تاخیر به اندازه میکروثانیه ایجاد نمود. جهت روشن تر شدن موضوع، در ادامه به یک مثال عملی با تابع millis در sipeed توجه نمایید.
نمونه برنامه ایجاد تاخیر با delay
پس از معرفی توابع مربوط به ایجاد تاخیر، نوبت به اجرای یک نمونه برنامه می رسد. در این برنامه یک عبارت با تاخیر هر یک ثانیه(۱۰۰۰ میلی ثانیه) عبارتی را در سریال مانیتور چاپ می کند.
void setup() { Serial.begin(115200); delay(500); } void loop() { Serial.println("Maixduino"); delay(1000); }
پس از آپلود برنامه فوق روی برد، سریال مانیتور را باز کنید. مطابق تصویر زیر، هر یک ثانیه یکبار عبارت Maixduino در خروجی سریال مانیتور چاپ می شود.
در رابطه با توابع delay و delayMicroseconds، دقت داشته باشید که این دو تابع اجرای برنامه را به میزانی که شما تعیین کرده اید، متوقف می کنند. در این حالت با فراخوانی این توابع، برنامه متوقف شده و هیچ دستور دیگری تا اتمام تاخیر اجرا نخواهد شد. در بسیاری از برنامه نیاز است تا یکسری از دستورات به صورت هر چند ثانیه یکبار به طوری اجرا شوند که سایر دستورات نیز متوقف نشوند. به این منظور می بایست از تابع millis و یا microsکه در قسمت بعدی معرفی می گردد، استفاده گردد.
توابع millis و micros در Maixduino
همانطور که در قسمت پیشین مشاهده گردید، توابع delay و delayMicroseconds تاخیر را به همراه توقف برنامه ایجاد می کنند. اما به کمک دو تابع micros و millis می توان به ایجاد تاخیر بدون توقف برنامه اقدام نمود. تابع micros مدت زمان طی شده از لحظه اجرای برنامه تاکنون را به صورت میکروثانیه محاسبه کرده و در خروجی قرار می دهد. در کنار این، تابع millis مدت زمان طی شده از اجرای برنامه روی برد تاکنون را به صورت میلی ثانیه محاسبه کرده و در خروجی قرار می دهد. این تابع پس از ۵۰ روز شمارش، سر ریز کرده و از ابتدا شروع به شمارش می کند. برای اطلاعات بیشتر در رابطه با تابع millis، آموزش آن را با کلیک روی این لینک، مطالعه کنید. توجه داشته باشید که خروجی هر دو تابع millis و micros، از نوع unsigned long است. جهت استفاده از تابع millis می توان به صورت زیر عمل کرد.
unsigned long tm=millis();
به کمک این تابع اجرای یک تابع را می توانید زمانبندی کرده و در فواصل زمانی مشخص، آن را اجرا کنید. جهت روشن تر شدن موضوع، قسمت بعدی را مطالعه نمایید.
زمانبندی اجرا به کمک millis
پس از بررسی تابع millis، نوبت به اجرای یک نمونه برنامه می رسد. در این برنامه هر ۳ ثانیه یکبار، زمان سپری شده از لحظه راه اندازی آردوینو در خروجی چاپ می شود.
unsigned long tm = 0; //متغیر جهت ذخیره زمان bool time_ch = false; //این متغیر کنترل می کند خواندن زمان هر سه ثانیه یکبار صورت گیرد مقدار پیشفرض false است. void setup() { Serial.begin(115200); //تعیین باودریت } void loop() { if (time_ch == false) { // در صورتیکه مقدار false است، زمان را بخوان tm = millis(); //خواندن زمان time_ch = true; //هرگاه که سه ثانیه بگذرد، این متغیر خوانده مجددا false شده تا بار دیگر قابل خواندن باشد. } if ((millis() - tm) > 3000) { //در صورتیکه زمان فعلی از آخرین باری که زمان اندازه گیری شده و در متغیر tm قرار گرفته بیش از ۳ ثانیه گذشته باشد. عبارت در خروجی چاپ خواهد شد. Serial.print("TIME:"); Serial.flush(); Serial.println(millis() / 1000); //با تقسیم خروجی millis بر ۱۰۰۰، زمان به ثانیه بدست خواهد آمد. Serial.flush(); time_ch = false; //تبدیل این متغیر به false جهت خواندن در دفعات بعدی } }
با اجرای برنامه فوق، خروجی در سریال مانیتور به صورت تصویر زیر ظاهر می گردد.
لوازم مورد نیاز
بردهای مبتنی بر هوش مصنوعی Sipeed
جمع بندی
در سلسله آموزش های برد Maixduino قسمت هفتم به توابع مربوط به زمانبندی می پردازیم. به کمک توابع زمانبندی می توانیم با ایجاد تاخیر، اجرای برنامه را برای مدتی متوقف کنیم. در کنار این به کمک توابع دیگر می توانیم بدون ایجاد توقف در برنامه، اجرای دستوراتی را زمانبندی کنیم. در این آموزش همانند سایر آموزش ها، ابتدا به معرفی توابع پرداختیم. در ادامه با ارائه مثالی، نحوه استفاده از توابع در برنامه های عملی مشاهده گردید.
چنانچه هرگونه ابهامی در مطالب درج شده وجود دارد، می توانید با ثبت نظر در انتهای همین پست سوال خود را بپرسید. تاکنون در دیجی اسپارک بیش از ۲۶ هزار سوال و پاسخ ثبت شده است؛ پس نظرات بی جواب نمی مانند! همچنین اگر ایراد و یا اشکالی در مطالب درج شده وجود دارد، لطفا آن را با ثبت نظر، مطرح کنید. همچنین اگر مشکلی در کدها وجود داشته و یا اجرا نمی شوند، مورد را حتما در انتهای همین آموزش مطرح نمایید. نظرات شما برای ما بسیار ارزشمند هسنند!!