در قسمت ششم از آموزش آردوینو به روش اضافه کردن بردهایی که در IDE نیستند به نرم افزار Arduino، پرداختیم. در این قسمت قصد داریم به بررسی برنامه نویسی آردوینو و انواع دادههای آن بپردازیم.
در ادامه سری آموزش آردوینو، به معرفی عناصر اصلی برنامهنویسی آردوینو میپردازیم. همچنین، بررسی میکنیم چگونه افرادی که برنامهنویس نیستند، میتوانند از ساختارهای زبان برنامهنویسی آردوینو استفاده کنند و برای افرادی که با زبان C یا C++ (زبانی که آردوینو از آن استفاده میکند) آشنا نیستند، یک توضیح مختصری درباره آن میدهیم.
زبان برنامهنویسی آردوینو
برای برنامهنویسی آردوینو، بهصورت پیشفرض از زبان C++ استفاده میشود. زبان برنامهنویسی آردوینو به سه بخش اصلی تقسیم میشود: توابع، مقادیر (متغیرها و ثابتها) و استراکچر. توابع برای کنترل برد آردوینو و انجام محاسبات استفاده میشوند. مقادیر شامل متغیرها و ثابتها هستند. همچنین، استراکچر شامل عناصر کد آردوینو میشوند.
یک اسکچ معمولی آردوینو
برنامههای آردوینو معمولاً بهعنوان اسکچ شناخته میشوند. اسکچ این امکان را برای طراحان فراهم میکند تا آنها ایده خود را سریع و آسان پیادهسازی کنند.
اصطلاحات اسکچ و برنامه، میتوانند بهجای هم استفاده شوند. اسکچها دارای کد دستورالعملهایی هستند که برد انجام خواهد داد. کدی که فقط یکبار اجرا میشود، باید در تابع setup قرار گیرد. این کد برای اجرا، بعد از اتمام راهاندازی اولیه به تابع loop میرود. در زیر یک اسکچ معمولی آردوینو آورده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // The setup() method runs once, when the sketch starts void setup() { pinMode(LED_BUILTIN, OUTPUT); // initialize the onboard LED as an output } // the loop() method runs over and over again, void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on delay(1000); // wait a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off delay(1000); // wait a second } |
بعد از آپلود کد آردوینو، هر بار که برد را روشن میکنید، دستورات از بالای اسکچ شروع و به ترتیب اجرا میشوند. همچنین، کد در تابع setup یکبار اجرا میشود و سپس به تابع loop میرود و هنگامی که به انتهای تابع loop میرسد (که با علامت } مشخص شده است)، تابع loop را دوباره فراخوانی میکند و این کار را تا زمانی که برد خاموش یا ریست شود، انجام خواهد داد.
در این مثال، اگر خروجیهای HIGH و LOW نوشته شوند، یک LED بهصورت پیوسته، چشمک میزند. هنگامی که اسکچ شروع میشود، کد در تابع setup پین مد را تنظیم میکند (تا بتواند یک LED را روشن کند). بعد از اتمام کدنویسی در تابع setup، تا زمانی که برد آردوینو روشن باشد، این کد در تابع loop بهصورت پیوسته فراخوانی میشود. (برای چشمکزدن LED)
برای نوشتن اسکچهای آردوینو لازم نیست این نکته را بدانید، اما ممکن است برای برنامهنویسان حرفهای C یا C++ سؤال باشد که پس تابع ورودی main()کجاست. در واقع، این تابع وجود دارد، اما توسط محیط برنامهنویسی آردوینو پنهان شده است.
فرایند برنامهنویسی آردوینو، یک فایل میانی ایجاد میکند که شامل کد اسکچ و دستورات اضافی زیر میباشد. در زیر تابع main بردهای 8 بیتی آمده است: (برای بردهای 32 بیتی نیز مشابه همین است):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int main( void ) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } |
تابع init() که سختافزار آردوینو را مقداردهی اولیه میکند، اولین تابعی است که فراخوانی میشود. بعد از آن، تابع initVariant() فراخوانی میشود. اگر میکروکنترلر بر روی برد دارای سختافزار USB اختصاصی باشد، تابع main آن را برای استفاده آماده میکند.
سپس تابع setup() و در نهایت، تابع loop()بهصورت پیوسته فراخوانی میشود. به دلیل اینکه لوپ for هرگز پایان نمییابد، دستور return هرگز اجرا نمیشود.
بلافاصله بعد از هر تماس به لوپ، تابع main ،serialEven را فراخوانی میکند. اگر serialEven روی برد شما پشتیبانی میشود،tRun را اجرا کنید (tRun در بردهایی که بر پایه ATmega32U4 ساخته شدهاند، پشتیبانی نمیشود. مانند لئوناردو و serialEven) اگر سیستم شما قابلیت پشتیبانی داشته باشد، این امکان فراهم میشود که شما یک تابع خاص به نام serialEvent را به اسکچ خود اضافه کنید تا هر زمان که داده در پورت سریال موجود باشد، فراخوانی شود.
انواع دادههای آردوینو
آردوینو دارای انواع مختلفی از دادهها (متغیرها) برای نمایش مقادیر است. در ادامه با نحوه انتخاب و استفاده از انواع دادههای آردوینو، آشنا خواهید شد.
نوع داده int (مخفف integer) برای نمایش مقادیر عددی در برنامههای آردوینو، بیشترین کاربرد را دارد. شما میتوانید از جداول 1 و 2 استفاده کنید تا نوع دادهای که بازه مقادیر برنامه شما را پوشش میدهد، تعیین کنید. جدول 1 نوع دادهها را برای بردهای 8 بیتی و جدول 2 نوع دادهها را برای بردهای 32 بیتی نشان میدهد.
جدول 1 انواع داده های آردوینو برای بردهای 8 بیتی مانند Uno را نشان می دهد. این جدول به شرح زیر است:
نوع داده | تعداد بایت | محدوده | کاربرد |
---|---|---|---|
int | 2 | 32768– تا 32767 | مقادیر اعداد صحیح مثبت و منفی |
unsigned int | 2 | 0 تا 65535 | فقط مقادیر مثبت |
long | 4 | 2147483648- تا 2147483648 | یک بازه بسیار بزرگ از مقادیر مثبت و منفی |
unsigned long | 4 | 4294967295 | یک بازه بسیار بزرگ از مقادیر مثبت |
float | 4 | 3.4028235E+38 تا 3.4028235E+38- | اعداد کسری؛ قابل استفاده برای اندازه گیری های تقریبی واقعی |
double | 4 | مشابه float | در آردوینو؛ Double نام دیگر Float است |
bool | 1 | false(0) یا true(1) | مقادیر درست و غلط (True و False) |
char | 1 | 128- تا 127 | کاراکتر منفرد برای مقادیر علامت دار بین ۱۲۸ـ و ۱۲۷ |
byte | 1 | 0 تا 255 | مشابه مورد قبل یعنی char اما برای مقادیر بدون علامت |
سایر داده ها | کاربرد |
---|---|
String | مجموعه ای از کاراکترها که معمولاً برای تکست (متن) استفاده می شود. |
void | فقط در اعلان های تابعی که هیچ مقداری برگردانده نمی شود. |
جدول 2 انواع داده های آردوینو برای بردهای 32 بیتی مانند Zero و 101 را نشان میدهد. جدول 2 به شرح زیر است:
نوع داده | تعداد بایت | محدوده | کاربرد |
---|---|---|---|
short int | 2 | 32768– تا 32767 | مشابه int در بردهای ۸ بیتی |
unsigned short int | 2 | 0 تا 65535 | مشابه unsigned در بردهای ۸ بیتی |
int | 4 | 2147483648- تا 2147483648 | مقادیر اعداد صحیح مثبت و منفی |
unsigned int | 4 | 0 تا 4294967295 | مقادیر مثبت؛ مشابه int |
long | 4 | 2147483648- تا 2147483648 | مشابه int |
unsigned long | 4 | 4294967295 | مشابه int unsigned |
float | 4 | ±3.4028235E+38 | مشابه int unsigned |
double | 1 | ±1.7976931348623158E+308 | بردهای ۳۲ بیتی که بازه و دقت بیش تری نسبت به بردهای ۸ بیتی دارند. |
bool | 1 | false(0) یا true(1) | مقادیر درست و غلط (True و False) |
char | 1 | 128- تا 127 | کاراکتر منفرد. برای مقادیر علامت دار بین ۱۲۸ـ و ۱۲۷ |
byte | 1 | 0 تا 255 | مشابه مورد قبل یعنی char اما برای مقادیر بدون علامت |
سایر داده ها | کاربرد |
---|---|
String | مجموعه ای از کاراکترها که معمولاً برای تکست (متن) استفاده می شود. |
void | فقط در اعلان های تابعی که هیچ مقداری برگردانده نمی شود. |
به جز در مواردی که کارایی حداکثر یا کارایی حافظه موردنیاز است، متغیرهایی که با استفاده از int تعریف شدهاند، برای مقادیر عددی مناسب هستند؛ البته درصورتیکه مقادیر از محدوده (نشاندادهشده در جدول 1) بیش تر نباشند و نیازی به کار با مقادیر اعشاری نداشته باشید.
بیشتر کدهای نمونه رسمی آردوینو، متغیرهای عددی را بهعنوان int تعریف میکنند. اما گاهی اوقات باید نوع دادهای که با برنامه شما بیشتر مرتبط است، انتخاب کنید. این مسئله بهخصوص در صورتی مهم است که شما توابع کتابخانهای را فراخوانی کنید که مقادیری به جز int را برمیگردانند.
بهعنوانمثال، تابع millis، یک مقدار unsigned long برمیگرداند. اگر شما از int برای ذخیره نتایج آن تابع در یک برد 8 بیتی استفاده کنید، هشداری دریافت نمی کنید، اما نتایج اشتباهی حاصل خواهد شد؛ زیرا int برای نگهداری حداکثر مقدار long کافی نیست و بعد از رسیدن به مقدار 32،767، به مقدار 32،768- برمیگردد. اگر شما سعی کنید long را در unsigned int قرار دهید، بعد از عبور از حداکثر مقدار unsigned int (65،535)، به مقدار صفر برمیگردید.
- در برنامهنویسی، نوع دادههای عددی به دو نوع signed و unsigned تقسیم میشوند. مقادیر unsigned همیشه مثبت هستند. متغیرهایی که کلیدواژه unsigned در ابتدای آنها نیست، signed هستند تا بتوانند مقادیر مثبت و منفی را نمایش دهند.
- یک int در یک برد 32 بیتی در مقایسه با یک برد 8 بیتی، به دو برابر بایت نیاز دارد. با این حال، اکثر کدهای 8 بیتی روی بردهای 32 بیتی اجرا می شوند.
بهعنوانمثال، برای نگهداری اعداد صحیح 32 بیتی، باید از نوع داده int32 استفاده کنیم. در این صورت، هیچگاه نباید فرض کنیم که اعداد صحیح در حافظه با 2 بایت نمایش داده میشوند. این موضوع در برنامهنویسی به عنوان یک استثناء نادر شناخته شده است و باید از آن پرهیز کرد.
- نوع داده bool یا boolean دارای دو مقدار است: true یا false. این داده معمولاً برای نگهداری مقادیری که یک شرط بله/خیر را نشان میدهند، استفاده میشود. همچنین، ممکن است این داده در جایگاه HIGH و LOW نیز استفاده شود که برای تغییر وضعیت پین ورودی/خروجی دیجیتال استفاده میشوند.
بهعنوانمثال، عبارت ; ) HIGH digitalWrite(LED_BUILTIN یعنی پینی که LED به آن متصل است را به برق وصل کنید.
اگر از LOW بهجای HIGH استفاده کنید، برق قطع خواهد شد. همچنین، شما میتوانید از true یا false بهجای HIGH یا LOW استفاده کنید. بااینحال، در اکثر موارد شما مجبورید از ثابتهای HIGH و LOW استفاده کنید؛ زیرا بسیار بعید است که در یک برد آردوینو، HIGH برابر با false باشد.
برای کسب اطلاعات بیشتر درباره کلیه داده های آردوینو به صفحه رفرنس آردوینو مراجعه کنید.