أساسيات برمجية Arduino





>
border="0"
data-original-height="800"
data-original-width="800"
height="640"
src="https://i.suar.me/3Q8Ld/m"
width="640"
/>






البنية البرمجية للاردوينو



>نستطيع تقسيم الكود البرمجي في الاردوينو الى ثلاثة أقسام رئيسية >




  1. >مكان لتعريف المتغيرات وتضمين المكاتب البرمجية >


class="language-arduino"
>// تضمين مكتبة
#include <Servo.h>
// تعريف متغيرات العامة
int i = 5;
string name = "Ahmad";
byte seg[10] = {0x43,0x4d,0x30,0x30,0xf0,0x0D};
....



  1. >تابع يتم تنفيذه مرة واحدة عند بداية تشغيل الاردوينو >


class="language-cpp"
>void setup ( ) {
// ضبط اعدادات المتحكم وتفعيل الاقطاب وتحديد حالتها
}



  1. >تابع تكراري يتم تنفيذه بشكل دائم ومتكرر >


class="language-cpp"
>void loop ( ) {
// التعليمات البرمجية التي سوف يتم تنفيذها بشكل متكرر
}




قبل البدء بتعلم الاردوينو نحتاج لمعرفة مسبقة بالمفاهيم الأساسية للبرمجة
لذا سوف نقوم بمراجعة سريعة على هذهالمفاهيم



المكاتب




مجموعات من التعليمات البرمجية المكتوبة مسبقًا والتي يمكن للمستخدمين
استخدامها لتحسين المشروع واختصار الوقت، وفي بعض الحالات يكون من الضروري
استخدام بعض المكاتب وخاصة عند استخدام بعض الحساسات أو الطرفيات مع
الاردوينو، فبدل أن تكتب كل شيء من الصفر يمكنك ببساطة أن تضيف المكتبة
لمشروعك واستخدام الاوامر اللازمة والتوابع الجاهزة لعمل الوظيفة التي
تحتاجها.

وسوف يتم التحدث عن كيفية استخدامها أكثر في دروس قادمة…



المتغيرات (variables)




هي عبارة عن أماكن في الذاكرة يتم حجزها لتخزين وحفظ البيانات فيها، ولتعريف
متغير جديد نحتاج لتحديد نوعه واسم المتغير أما قيمة المتغير تكون
اختيارية. />



> alt="المتغيرات في c++"
height="320"
src="https://media.geeksforgeeks.org/wp-content/uploads/20220830172742/InitilizationofaVariable-660x330.png"
width="640"
/>




أنواع البيانات الرئيسية


int




عبارة عن رقم صحيح ويمكن أن تأخذ قيم من -32,768 الى +32,767 وتستهلك حجم من
الذاكرة بمقدار 2 بايت


class="language-cpp"
>int counter = 32 ;
// 32 وإعطاءه قيمة ابتدائية int تعريف متغير من النوع


unsigned int




عدد صحيح موجب ويمكن أن يأخذ قيم من 0 وحتى 65,535 ويستهلك حجم من الذاكرة
بمقدار 2 بايت


class="language-cpp"
>unsigned int counter = 60 ;
// 60 وإعطاءه قيمة ابتدائية unsigned int تعريف متغير من النوع

long




عدد صحيح بقيم كبيرة ويمكن أن يأخذ قيم من -2,147,483,648 وحتى 2,147,483,647
ويستهلك حجم من الذاكرة بمقدار 4 بايت


class="language-cpp"
>long velocity = -102346 ;
// -102346 وإعطاءه قيمة ابتدائية long تعريف متغير من النوع


unsigned long




عدد صحيح موجب بقيم كبيرة ويمكن أن يأخذ قيم من 0 وحتى 4,294,967,295 ويستهلك
حجم من الذاكرة بمقدار 4 باييت


class="language-cpp"
>unsigned long velocity = 101006 ;
// 101006 وإعطاءه قيمة ابتدائية unsigned long تعريف متغير من النوع

float



عدد بقيم كبيرة وله فواصل عشرية ويمكن أن يأخذ قيم من -3.4028235E+38 وحتى
3.4028235E+38 وتستهلك حجم من الذاكرة بمقدار 4 بايت


class="language-cpp"
>float num = 1.352;
// وإعطاءه قيمة ابتدائية 1.352 float تعريف متغير من النوع

void



تستحدم فقط عند تعريف تابع وتشير الى أنه لن يتم إرجاع أي قيم من هذا التابع
عند استدعائه


class="language-cpp"
>void loop ( ) {
// االكود البرمجي
}

boolean




تأخذ قيمة واحدة من اثنين إما true أو false وتستهلك حجم من الذاكرة بمقدار 1
بايت


class="language-cpp"
>bool val = false ;
// false وإعطاءه قيمة ابتدائية bool تعريف متغير من النوع

bool state = true ;
// true وإعطاءه قيمة ابتدائية bool تعريف متغير من النوع

char




هو عبارة عن حرف واحد ويمكن التعبير عن قيمته إما بوضعه مباشرة من ضمن ’ ’ أو
من خلال وضع عنوانه في جدول الاسكي
href="https://m.marefa.org/w/images/thumb/d/dd/ASCII-Table.svg/500px-ASCII-Table.svg.png"
>ASCII chart
>.


class="language-cpp"
>char A = ‘a’ ;
// a وإعطاءه قيمة ابتدائية char تعريف متغير من النوع

byte




متغير يقبل قيم عددية صغيرة من 0 وحتى 255 ويأخذ حجم من الذاكرة بمقدار 1
بايت


class="language-arduino"
>byte x = 255;
// وإعطاءه قيمة ابتدائية 255 byte تعريف متغير من النوع

string




سلسلة نصية من الحروف ويجب وضع القيمة ضمن " " ويتم تعريفها عن طريق تعريف
مصفوفة char


class="language-cpp"
>char Str[] = "arduino";
// arduino وإعطاءه قيمة ابتدائية string تعريف متغير من النوع

const




لا تعتبر أنها نوع من أنواع البيانات فيتم كتابتها قبل نوع البيانات وتعني أن
قيمة المتغير سوف تبقى ثابتة ولن يتم تعديل قيمتها أثناء تنفيذ الكود


class="language-cpp"
>const int x = -55;
//وإعطاءه قيمة ثابتة -55 int تعريف متغير من نوع


قواعد تسمية المتغيرات




  • >الاسم يمكن أن يحتوي على حروف وأرقام و underscore (_)



  • >الاسم يجب أن يبدأ إما بحرف أو underscore (_) >



  • المتغيرات في الاردوينو حساسة لحالة الاحرف ( myVar و myvar مختلفين عن
    بعضهما)



  • لا يقبل الاسم مسافات أو رموز

  • يجب تحديد نوع المتغير




الفرق بين المتغيرات العامة والخاصة





  • المتغيرات العامة: هي متغيرات يتم تعريفها في بداية الكود البرمجي (قبل
    void setup) ويمكن استخدامها في أي مكان




  • المتغيرات الخاصة: يتم تعريفها ضمن جزء خاص ولا يمكن استخدامها خارج هذا
    الجزء



class="language-cpp"
>// متغيرات عامة استطيع استخدامها في اي مكان
int x = 20;
float pi = 3.14;

void setup ( ) {
// void setup متغير خاص لا أستطيع استخدامه خارج
float r = x * pi;
}
void loop ( ) {
// تعريف متغير خاص ولكن هنا سوف يعطيني خطأ بالكود لأنني استخدمت متغير غير معرف في هذا الجزء
float A = r * x * pi;
}


العمليات الرياضية



  • الاسناد "="


class="language-cpp"
>int B = 5;
int A = B;
// >> A = 5


  • الجمع "+"


class="language-cpp"
>int A = 3;
int B = 2;
int C;
C = A + B;
// >> C = 5


  • الطرح "-"


class="language-cpp"
>int x = 12;
float y = 5.5;
float z = x - y;
// >> z = 7.5


  • الضرب "*"


class="language-cpp"
>int x = 5, y = 10;
int z = x * y;
// >> z = 50;


  • القسمة "/"


class="language-cpp"
>int x = 5, y = 10;
int z = y / z;
// >> z = 2


  • باقي القسمة "%"


class="language-cpp"
>int x = 2, y = 7;
int z = y / z;
int k = y % x;
// >> z = 3
// >> k = 1


عمليات المقارنة



  • هل تساوي "=="


class="language-cpp"
>int A = 5, B = A;
bool C = (B == A);
// >> C = true


  • هل لا تساوي "=!"


class="language-cpp"
>bool A = true, B = false;
bool C = (B != A);
// >> C = true


  • أكبر من "<"


class="language-cpp"
>int B = 3, A =13;
bool C = B > A;
// >> C = fales


  • أصغر من ">"


class="language-cpp"
>int B = 3, A =13;
bool C = B < A;
// >> C = true


  • أكبر أو تساوي "=<"


class="language-cpp"
>int B = 25, A =13;
bool C = B >= A;
// >> C = true


  • أصغر أو تساوي "=>"


class="language-cpp"
>int B = 3, A =13;
bool C = B <= A;
// >> C = true;``


العمليات المنطقية




  • and "&&"


class="language-cpp"
>bool A = true, B = false;
bool C = A&&B;
// >> C = false


  • or "| |"


class="language-cpp"
>bool A = true, B = false;
bool C = A||B;
// >> C = true


  • not "!"


class="language-cpp"
>bool A = true;
bool C = !A;
// >> C = false

الشروط


if



>هو عبارة عن تنفيذ أوامر وتعليمات في حال تحقق الشرط محدد >



> alt="if statment"
height="640"
src="https://static.javatpoint.com/cpp/images/cpp-if-else1.png"
width="421"
/>



class="language-arduino"
>if (الشرط) {
مجموعة من التعليمات التي سوف يقوم بتنفيذها في حالة تحقق الشرط
}

class="language-c"
>/* تعريف المتغيرات العامة */
int A = 5 ;
int B = 9 ;
void setup () {

}
void loop () {
/* التحقق من الشرط المنطقي */
if (A > B){
// في حالة تحقق الشرط سوف يقوم بتنفيذ التعليمات الموجودة
A++;
}
/* التحقق من الشرط المنطقي */
if (( A < B ) && ( B != 0 )){
// في حالة تحقق الشرط سوف يقوم بتنفيذ التعليمات الموجودة
A += B;
B--;
}
}




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

في حالة الشرط الأول A > B كان غير محقق وبالتالي لن يتم تنفيذ ما بداخل
الشرط

في الشرط التاني كان يجب أن يتحقق الشرطين معاً

A < B وهو محقق

B != 0 وهو محقق

وبالتالي سوف يتم تنفيذ التعليمات الموجودة بداخل الشرط وهي:




>A += B وهي تكافئ جمع A مع B ووضع الناتج في A >



A = A + B






>--B وهي تكافئ انقاص قيمة B بمقدار 1 >



B = B - 1






if … else




هو عبارة عن تنفيذ أوامر وتعليمات في حال تحقق الشرط وفي حال لم يتحقق الشرط
يتم تنفيذ شيء آخر



> alt="if ekse statment"
height="640"
src="https://static.javatpoint.com/cpp/images/cpp-if-else2.png"
width="460"
/>



class="language-arduino"
>if (الشرط) {
مجموعة من التعليمات التي سوف يقوم بتنفيذها في حالة تحقق الشرط
}
else {
مجموعة من التعليمات التي سوف يقوم بتنفيذها في حالة عدم تحقق الشرط
}

class="language-cpp"
>//Example
/* تعريف المتغيرات العامة */
int A = 5 ;
int B = 9 ;
void setup () {

}
void loop () {
/* التحقق من الشرط المنطقي */
if (A > B){
// في حالة تحقق الشرط سوف يقوم بتنفيذ التعليمة الموجودة بالداخل
A++;
}
else{
// وفي حالة عدم تحقق الشرط سوف يتم تنفيذ هذه التعليمات
A += B;
}
}




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

الشرط A > B كان غير محقق وبالتالي لن يتم تنفيذ ما بداخل الشرط if

وسوف يقم بتنفيذ التعليمات الموجودة داخل else وهي




>A += B; وهي تكافئ جمع A مع B ووضع الناتج في A >



A = A + B






if … else if



>عدة شروط يتم تنفيذ أوامر وتعليمات خاصة بكل شرط >



> alt="if else if statment"
height="469"
src="https://static.javatpoint.com/cpp/images/cpp-if-else3.png"
width="640"
/>


class="language-arduino"
>if (الشرط الاول) {
مجموعة من التعليمات التي سوف يقوم بتنفيذها في حالة تحقق الشرط الاول
}

else if(الشرط الثاني) {
مجموعة من التعليمات التي سوف يقوم بتنفيذها في حالة تحقق الشرط الثاني
}
.
.
.
else {
ممموعة من التعليمات التي سوف يقوم بتنفيذها في حالة عدم تحقق أي شرط
}

class="language-cpp"
>//Example
/* تعريف المتغيرات العامة */
int A = 5 ;
int B = 9 ;
int C = 15 ;

void setup () {
}

void loop () {
/* التحقق من الشرط المنطقي */
if (A > B) {
// في حالة تحقق الشرط سوف يقوم بتنفيذ التعليمة الموجودة بالداخل
A++;
}
/* التحقق من الشرط المنطقي */
else if ((A == B )||( B < C )) {
// في حالة تحقق الشرط سوف يقوم بتنفيذ التعليمة الموجودة بالداخل
C = B * A;
}
else {
// في حالة عدم تحقق أي شرط سوف يقوم بتنفيذ التعليمة الموجودة بالداخل
C++;
}
}




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

قي الشرط الاول لم يتحقق وبالتالي بن يتم تنفيذ ما بداخله

وفي الشرط الثاني كان مئلف من شرطين بينهما علامة or أي أنه في حالة تحقق
واحد منهما على الاقل سوف تكون النتيجة true

(A == B ) غير محقق ولكن ( B < C ) محقق وبالتالي سوف يتم تنفيذ التعليمات
الموجودة بداخله وهي




>ضرب A ب B ووضع الناتج في C: C = B * A >





وبما أن الشرط الثاني تحقق لن يتم فحص باقي الشروط (في حال وجود شروط أخرى)
ولن يتم تنفيذ ما بداخل else




Switch



>تقوم بفحص قيمة متغير وتنفيذ حدث ما بناء على كل قيمة أو حالة له >


> alt="switch statment"
height="512"
src="https://static.javatpoint.com/cpp/images/cpp-switch1.png"
width="640"
/>

class="language-cpp"
>switch (/* المتغير */) {
case /* القيمة الاولى */:
// التعليمات
break; // تستخدم للخروج من الشرط وعدم فحص باقي الشروط
}

case /* القيمة الثانية */: {
// التعليمات
break; // تستخدم للخروج من الشرط وعدم فحص باقي الشروط
}
.
.
.
// أي في حالة عدم تحقق أي شرط سابق سوف يتم تنفيذ ما بداخلهاelse تكافئ
default: {
// التعليمات
break; // تستخدم للخروج من الشرط وعدم فحص باقي الشروط
}

class="language-cpp"
>//Example
/* تعريف المتغيرات العامة */
int A = 5 ;
int B = 9 ;
char C = '+' ;

void setup () {
}

void loop () {
switch (C) {
case '-':
A = A - B;
break;
case '*':
A = A * B;
break;
case '+':
A = A + B;
break;
default:
Message("Invalid state!");
}
}




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

بعدها استخدمنا المتغير C داخل switch لفحص قيمته في كل حالة

نلاحظ في الحالة الاولى والثاني الشرط غير محقق وبالتالي لن يتم تنفيذ ما
بداخلها

الحالة الثالثة محققة وبالتالي سوف يقوم بتنفيذ التعلينات وهي:





حمع A مع B ووضع الناتج في A

break وهي تعني الخروج من الشرط وعدم فحص باقي الشروط





الحلقات التكرارية


while




عبارة عن حلقة تكرارية يتم تنفيذ التعليمات الموجودة طالما كان الشرط محقق />



> alt="while loop"
height="640"
src="https://static.javatpoint.com/cpp/images/cpp-while-loop1.png"
width="561"
/>



class="language-arduino"
>while(/* الشرط */) {
//الكود الذي سوف يتم تنفيذه في حالة كان الشرط محقق;
}

class="language-arduino"
>// Example
int i = 1;
int sum = 0;
while (i <= 5) {
sum += i;
Serial.println(sum);
i++;
}

//OUTPUT
1
3
6
10
15




قمنا بتعريف متغيريين من نوع int

بداية الحلقة وضعنا الشرط هو i أصغر أو تساوي 5

في البداية سوف يقوم بفحص الشرط 1 أصغر من 5 ? محقق وبالتالي سوف ينفذ الكود
الذي في الداخل





جمع قيمة sum مع i ووضع الناتج في sum

طباعة قيمة المتغير sum على شاشة السيريال ( وهي عبارة عن نافذة اتصال بين
الاردوينو والحاسب وسوف نتحدث عنها في دروس لاحقة )

زيادة قيمة المتغير i بمقدار واحد لتصبح قيمته 2





وهكذا حتى تصبح قيمة i هي 6 وبالتالي سوف يصبح الشرط غير محقق ولن يقوم
بتنفيذ الكود الموجود بالداخل




do … while




يقوم بتنفيذ التعليمات أول مرة ثم يقوم بفحص الشرط في حال كان محقق يتم تكرار
التعليمات, وفي حال كان غير محقق يخرج من الحلقة التكرارية />



> alt="do while"
height="640"
src="https://static.javatpoint.com/cpp/images/cpp-do-while-loop1.png"
width="558"
/>



class="language-arduino"
>do {
// الكود الذي سوف يتم تنفيذ;
}
while (/* الشرط */);

class="language-arduino"
>int i=1;

do {
// في كل دورة سيتم طباعة قيمة العداد ثم إضافة 1 عليها حتى تصبح قيمته تساوي 11 فالشرط غير محقق وبالتالي لن يتم تنفيض الكود الموجود
Serial.println(i);
i++;
}
while( i<=10 );
//OUTPUT
1
2
3
4
5
6
7
8
9
10

for




تقوم بتكرار التعليمات يعدد مرات يساوي من بداية المتغير وحتى تحقق شرط النهاية
وفي كل دورة تزداد أو تنقص قيمة المتغير />



> alt="for loop"
height="640"
src="https://static.javatpoint.com/cpp/images/cpp-for-loop1.png"
width="377"
/>



class="language-arduino"
>for ( /* زيادة أو نقصان المتغير الخاص بالشرط; االشرط; البداية */ ) {
// الكود الذي سوف يتم تكرار تنفي عند تحقق الشرط
}

class="language-arduino"
>//Example
for (int i = 1; i <= 5; i++) {
Serial.println(i);
}
// OUTPUT
1
2
3
4
5




قمنا بكتابة حلقة for وقيمنا بتعريف متغير خاصة ببداية الحلقة ومن ثم الشرط
ومن ثم زيادة قيمة المتغير بمقدار 1 في بعد تنفيذ الحلقة

وفي داخل الحلقة قمنا بطباعة قيمة المتغير

سوف يبدأ الطباعة من بداية المتغير وهو 1 وفي كل حلقة سوف يتم زيادة قيمة
المتغير بمقدار واحد حتى تصبح قيمة المتغير 6 ولن يكون الشرط محقق




nested loop


حلقات تكرارية متداخلة مع بعضها


class="language-arduino"
>for ( /* زيادة أو نقصان المتغير الخاص بالشرط; االشرط; البداية */ ) {
// الكود الذي سوف يتم تكرار تنفي عند تحقق الشرط
for ( /* زيادة أو نقصان المتغير الخاص بالشرط; االشرط; البداية */) {
// الكود الذي سوف يتم تكرار تنفي عند تحقق الشرط
}
}

التوابع




التوابع ببساطة هي وسيلة لتجميع كود معين بوحدات صغيرة يمكن اعادة استخدامها
أكثر من مرة من خلال استدعائها



> alt="Function"
height="431"
src="https://www.tutorialspoint.com/arduino/images/function.jpg"
width="640"
/>


class="language-cpp"
>//Example
int add(int a, int b) {
return a + b;
}

void setup () {

}

void loop() {
int c = add(5, 8); //c = 13
}


قمنا بتعريف تابع





القمية التي يعيدها من نوع int

اسمه add

يأخذ متغيرين من نوع int

يقوم التابع بجمع العددين وإرجاع الناتج




class="language-cpp"
>int my_func (int x, int y) {
int z = 0;
z = x * y ;
return z;
}

void setup () {

}

void loop () {
int result = 0 ;
result = Mu_func (5,6) ;
}


قمنا بتعريف تابع





القمية التي يعيدها من نوع int

اسمه my_func

يأخذ متغيرين من نوع int

يقوم التابع بضرب العددين وإرجاع الناتج








style="background-color: white; box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; text-align: center;"
>
>ساعدنا في النشر >

class="dir_rtl"
style='background-color: white; box-sizing: border-box; font-family: system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; margin-bottom: 1rem; margin-top: 0px; text-align: justify;'
>
> >نتمنى مشاركة المقال مع أصدقائك على مواقع التواصل الاجتماعي لتصل الفائدة
الى الجميع وشاركنا برأيك في التعليقات والاشتراك في خدمة البريد الالكتروني
على المدونة ليصلك كل جديد فوراً  > >


المقال التالي المقال السابق
1 تعليقات
  • غير معرف
    غير معرف 25 نوفمبر 2022 في 6:00 ص

    شكرا على هذه المعلومات القيمه

إضافة تعليق
رابط التعليق