أساسیات برمجة Arduino | الجزء الثالث

برمجة Arduino

أنواع بيانات اردوينو (Arduino Data Types)

تُستخدم أنواع بيانات Arduino لتحديد أنواع البيانات والدوال المرتبطة بمعالجة البيانات. يتم استخدامه للإعلان عن الدوال والمتغيرات والتي تحدد نمط البت ومساحة التخزين.

أساسيات Arduino | تحميل، تثبيت وميزات

أنواع بيانات Arduino التي سنستخدمها مذكورة أدناه:

  • void
  • int
  • Char
  • Float
  • Double
  • Unsigned int
  • short
  • long
  • Unsigned long
  • byte
  • word

نوع بيانات void

يحدد نوع البيانات الفارغة مجموعة القيم الفارغة ويستخدم فقط لتعريف الوظائف. يتم استخدامه كنوع إرجاع للدوال التي لا تُرجع أي قيمة.

دعونا نفهم الموضوع من خلال مثال في اردوينو.

شاهد الكود أدناه.

int Sum = 0;  
void setup( )  
{  
Serial.begin(9600);  
}  
void loop ( )  
{  
Sum++;  // on every loop, it adds 1 to the Sum int  
Serial.println ( Sum);  // it prints the current state of the Sum variable  
delay(1500);  // delay of 1.5 seconds  
}  

نوع البيانات Char

يمكن لنوع بيانات char تخزين أي عدد من مجموعات الأحرف. المعرّف الذي تم الإعلان عنه لأن الحرف char يصبح متغيراً للحرف. تمت كتابة الأحرف الحرفية داخل اقتباس واحد.

غالباً ما يُقال أن نوع الحرف هو نوع عدد صحيح. وذلك لأن الرموز والأحرف وما إلى ذلك يتم تمثيلها في الذاكرة بواسطة رموز الأرقام المرتبطة، إذ هي مجرد أعداد صحيحة.

حجم نوع بيانات الحرف لا يقل عن 8 بتات. يمكننا استخدام نوع بيانات البايت لنوع بيانات char غير الموقعة من 8 بت أو 1 بايت.

على سبيل المثال الحرف “A” له قيمة ASCII البالغة 65.

إذا حددنا A’ + 2’ فستكون لها قيمة ASCII تبلغ 67.

الصيغة هي:

char var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

دعونا نفهم الموضوع بمثال.

انظر إلى الكود أدناه.

char myvariable = ' B ';  
char myvariable = 66 ;  // both the value are equivalent  

يظهر جدول ASCII أدناه:

نوع البيانات Float

يعتبر الرقم الذي يحتوي على الجزء الكسري والجزء العشري رقم Float. على سبيل المثال 4.567 رقم فاصلة عائمة. الرقم 13 عدد صحيح بينما 13.0 هو رقم Float. نظرا إلى دقتها الكبرى تُستخدم الأرقام الكسرية لتقريب القيم المتجاورة والتناظرية.

يمكن أيضًا كتابة أرقام Float في صيغة الأس. يمكن أن تكون الأرقام كبيرة مثل 38+3.4028235E وصغيرة مثل 38+3.4028235E- حجم أنواع البيانات Float هو 4 بايت أو 32 بت.

الصيغة هي:

float var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

دعونا نفهم بمثال.

انظر إلى الكود أدناه.

int a ;  
int b ;  
float c ;  
void setup ( )  
{  
Serial.begin (9600);  
}  
void loop ( )  
{  
a = 3 ;  
b = a/2 ;  // b is an integer. It cannot hold fractions. The output will be 1.  
c = (float) a / 2.0 ;  // c now contains 1.5.  
// Here, we have to use 2.0 instead of 2.  
}  

يمكن أيضا تحويل أرقام Float إلى أعداد صحيحة. على سبيل المثال:

float a = 3.6 ;  
int b = a + 0.6 ; // output = 4  

نوع البيانات Double

يتم استخدام نوع البيانات المزدوج أيضا لمعالجة الأرقام العشرية أو float، إذ إنها تشغل ضعف مساحة الذاكرة التي تطفو. يخزن أرقام float بدقة أكثر ومدى أكبر. إنها تعني أرقام float ذات الدقة المزدوجة.

يشغل 4 بايت في لوحات ATmega و UNO بينما يشغل 8 بايت في Arduino Due.

الصيغة هي:

double var = val;  

أين var  = متغير

val = القيمة المخصصة للمتغير.

نوع بيانات Unsigned int

يخزن int غير الموقعة القيمة تصل إلى 2 بايت أو 16 بت. يخزن فقط القيم الإيجابية. يتراوح نطاق نوع البيانات غير الموقعة من 0 إلى 65.535 أو من 0 إلى (1-(16 ^ 2)).

يقوم Arduino Due بتخزين قيمة البيانات غير الموقعة البالغة 4 بايت أو 32 بت.

الفرق بين نوع البيانات غير الموقعة ونوع البيانات الموقعة هو بت التوقيع. النوع int في Arduino هو int. في رقم 16 بت يتم تفسير 15 بت مع تكملة 2 بينما يتم تفسير البتة العالية على أنها رقم موجب أو سالب. إذا كانت البتة العالية هي “1” فإنها تعتبر رقماً سالباً.

الصيغة هي:

unsigned int var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

unsigned int pinofLED = 8;  

نوع بيانات short

القصير هو نوع بيانات عدد صحيح يخزن 2 بايت أو 16 بت من البيانات.

يتراوح نطاق أنواع البيانات القصيرة من 32768- إلى 32767 أو (15^2)- إلی (1-(2^15)). عادةً ما تخزن Arduino المستندة إلى ARM و ATmega قيمة البيانات 2 بايت.

الصيغة هي:

short var = val;  

أين var  = متغير val  = القيمة المخصصة للمتغير.

short pinofLED = 8 ;  

نوع البيانات long

تعتبر أنواع البيانات الطويلة متغيرات الحجم الموسعة والتي تخزن 4 بايت (32 بت). الحجم يتراوح من 2،147،483،648- إلى 2،147،483،647.

أثناء استخدام الأعداد الصحيحة يجب أن يتبع L على الأقل أحد الأرقام مما يفرض على الرقم أن يكون نوع بيانات طويل.

الصيغة هي:

long var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

long speed = 186000L;  

نوع بيانات Unsigned long

تعتبر أنواع البيانات الطويلة غير الموقعة أيضًا متغيرات الحجم الموسعة والتي تخزن 4 بايت (32 بت). لا يخزن الأرقام السالبة مثل أنواع البيانات الأخرى غير الموقعة مما يجعل حجمها يتراوح من 0 إلى 4294.967.295 أو (1-32^2).

الصيغة هي:

unsigned long var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

unsigned long currenTtime;  

نوع البيانات byte

1 بايت = 8 بت.

يعتبر كرقم غير موقع يخزن القيم من 0 إلى 255.

الصيغة هي:

byte var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

byte c = 20;  

نوع بيانات word

يتم اعتباره عدداً بدون إشارة من 16 بت أو 2 بايت والذي يخزن القيم من 0 إلى 65535.

الصيغة هي:

word var = val;  

أين var  = متغير

val  = القيمة المخصصة للمتغير.

word c = 2000;  

متغيرات اردوينو (Arduino Variables)

يتم تعريف المتغيرات على أنها مكان لتخزين البيانات والقيم. إذ يتكون من اسم وقيمة ونوع.

يمكن أن تنتمي المتغيرات إلى أي نوع بيانات مثل int و float و char وما إلى ذلك.

ضع في اعتبارك المثال أدناه:

int pin = 8;  

هنا يتم استخدام نوع البيانات int لإنشاء متغير يسمى pin يخزن القيمة 8. وهذا يعني أيضا أن القيمة 8 قد تمت تهيئتها إلى طرف المتغير. يمكننا تعديل اسم المتغير حسب اختيارنا. على سبيل المثال يمكننا أيضا كتابة المثال أعلاه على النحو التالي:

int LEDpin = 8;  

هنا اسم المتغير هو LEDpin.

يمكننا الرجوع إلى المتغير المعلن بشكل أكبر في برنامجنا أو رمزنا.

على سبيل المثال:

pinMode(LEDpin, OUTPUT);  

هنا سيتم تمرير القيمة المخزنة (8) في المتغير المعلن (LEDpin) إلى دالة pinMode.

إذا لم نعلن عن المتغير فيمكن أيضا تمرير القيمة مباشرة إلى الدالة. على سبيل المثال:

pinMode( 8, OUTPUT);  

مزايا المتغيرات

مزايا المتغيرات مذكورة أدناه:

  • يمكننا استخدام متغير عدة مرات في البرنامج.
  • يمكن أن تمثل المتغيرات الأعداد الصحيحة والسلاسل والأحرف وما إلى ذلك.
  • يزيد من مرونة البرنامج.
  • يمكننا بسهولة تعديل المتغيرات. على سبيل المثال إذا أردنا تغيير قيمة LEDpin المتغيرة من 8 إلى 13 فنحن بحاجة إلى تغيير النقطة الوحيدة في الكود.
  • يمكننا تحديد أي اسم للمتغير. على سبيل المثال greenpin ،bluePIN ،REDpin إلخ.

كيف يمكننا تغيير قيمة المتغير في Arduino؟

يمكن تغيير قيمة المتغير باستخدام عامل التخصيص (=). لكن علينا أن نعلن عن متغير قبل إسناد القيمة.

إذا حددنا القيمة مباشرة على النحو التالي:

pin = 7;  

سنحصل على خطأ لم يصرح عن pin.

يمكننا بسهولة تغيير المتغيرات عن طريق نسخ قيمتها إلى متغير آخر.

على سبيل المثال:

int LEDpin = 7;  
int pin1 = LEDpin;  
LEDpin = 13;  

يحتوي LEDpin الآن على القيمة 13 بدلاً من 7. لكن قيمة pin1 لا تزال 7.

دعونا نفهم بمثال.

انظر إلى الكود أدناه.

void setup()  
{  
  Serial.begin(9600);  
int pinLED = 7;  
  Serial.println(pinLED); // value 7 will be printed  
int pin1 = pinLED;  
pinLED = 13;   
  Serial.println(pinLED); // value is now changed  
  // now, value 13 will be printed  
}  
void loop()  
{    
}  

إنتاج:

يمكننا أن نلاحظ في الإخراج أن قيمة LEDpin تغيرت من 7 إلى 13. وبالمثل يمكننا تغيير قيم المتغيرات.

نطاق المتغيرات (Variables Scope)

هذا يعني أنه في عدد الطرق التي يمكن بها الإعلان عن المتغيرات.

يمكن التصريح عن المتغيرات بطريقتين في Arduino والتي تم سردها أدناه:

المحلية (Local variables)

العالمية (Global variables)

المتغيرات المحلية (Local variables)

يتم التصريح عن المتغيرات المحلية داخل الدالة. المتغيرات لها نطاق فقط داخل الدالة. يمكن استخدام هذه المتغيرات فقط من خلال العبارات التي تقع ضمن تلك الدالة.

على سبيل المثال:

void setup()  
{  
Serial.begin(9600);  
}  
void loop()  
{  
int x = 3;  
int b = 4;  
int sum = 0;  
sum = x + b;  
Serial.println(sum);  
}  

المتغيرات العالمية (Global variables)

يمكن الوصول إلى المتغيرات العالمية في أي مكان في البرنامج. يتم التصريح عن المتغير الشامل خارج دالة setup و loop.

على سبيل المثال:

انظر إلى الكود أدناه.

int LEDpin = 8;  
void setup()  
{  
pinMode(LEDpin, OUTPUT);  
}  
void loop()  
{  
digitalWrite(LEDpin, HIGH);  
}  

يمكننا أن نلاحظ أن LEDpin يستخدم في كل من دوال loop و setup.

تُستخدم القيمة في كلتا الدالتین لذا فإن تغيير القيمة في إحدى الدوال سينعكس في الأخرى. على سبيل المثال:

int LEDpin = 8;  
void setup()  
{  
LEDpin = 13;  
pinMode(LEDpin, OUTPUT);  
}  
void loop()  
{  
digitalWrite(LEDpin, HIGH);  
}  

هنا سيتم تمرير القيمة 13 إلى دالة digitalWrite.

ما هي الثوابت (constants)؟

يتم تعريف الثوابت في Arduino على أنها التعبيرات المحددة مسبقاَ. يجعل الكود سهل القراءة.

تعرف الثوابت في Arduino بأنها:

ثوابت المستوى المنطقي

ثوابت المستوى المنطقي الصحيحة أو الخاطئة.

یتم تحديد قيمة صواب وخطأ على أنها 1 و 0. يتم تحديد أي عدد صحيح غير صفري على أنه صحيح من حيث اللغة المنطقية. یقام كتابة ثوابت الصواب والخطأ بأحرف صغيرة بدلاً من الأحرف الكبيرة (مثل HIGH و LOW وما إلى ذلك).

ثوابت مستوى pin (Pin level Constants)

يمكن أن تأخذ المسامير الرقمية قيمتين HIGH  أو LOW.

في Arduino يتم تكوين الدبوس على أنه INPUT أو OUTPUT باستخدام دالة pinMode. يتم جعل الدبوس أيضا مرتفعا أو منخفضا باستخدام دالة digitalWrite.

تحتوي بعض اللوحات على دبابيس 5 فولت فقط بينما يشتمل بعضها على 3.3 فولت.

تتكون بعض اللوحات من دبابيس 5V و 3.3V. على سبيل المثال Arduino UNO R3.

تم ضبط الدبوس الذي تم تكوينه على أنه HIGH على 5V أو 3.3V.

ثابت LED_BUILTIN

تحتوي لوحات Arduino على LED مدمج متصل في سلسلة مع المقاوم. يتم تعريف رقم التعريف الشخصي المحدد باسم ثابت يسمى LED_BUILTIN.

تحتوي معظم لوحات Arduino على LED_BUILTIN متصل برقم Pin رقم 13.

الكلمة الرئيسية Constant

يمثل اسم const الكلمة الأساسية الثابتة. يعدل سلوك المتغيرات في برنامجنا. كما أنه يجعل المتغير “للقراءة فقط” (read-only).

سيبقى المتغير كما هو الحال مع المتغيرات الأخرى لكن لا يمكن تغيير قيمته.

هذا يعني أنه لا يمكننا تعديل الثابت. على سبيل المثال:

const int a =2;  
//....  
a = 7;     // illegal - we cannot write to or modify a constant  

تعتبر الكلمة الأساسية const أفضل مقارنة بالكلمة الأساسية #define لأنها تخضع لقواعد النطاق المتغير.

على سبيل المثال:

ضع في اعتبارك الكود أدناه:

const float x = 5.68;  
float y;  
void setup()  
{  
Serial.begin(9600);  
y = x * 2; // we can also use constants in math  
Serial.println(y);  
}  
void loop()  
{  
// ....  

المخرج: 11.36

define#

يتم استخدام define# في Arduino لإعطاء اسم للقيمة الثابتة. لا تأخذ أي مساحة ذاكرة على الشريحة.

في وقت الترجمة سيحل المترجم محل القيمة المحددة مسبقاَ في البرنامج إلى الثوابت بالقيمة المحددة. الصيغة هي:

#define nameOFconstant value  

أين nameOFstant: هو اسم الماكرو أو الثابت المراد تعريفه

value: تتضمن القيمة المعينة للثابت أو الماكرو.

على سبيل المثال:

#define LEDpin 12  
// It is the correct representation of #define

يمكن أن تكون التصريحات غير الصحيحة لـ define#:

#define LEDpin = 12  
#define LEDpin 12;  
// both of the above statements are incorrect  

المصادر

الأول
الثاني
الثالث

منشور ذات صلة
سلسلة دروس: برمجة Arduino

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة