قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-03-2020, 09:23 PM المشاركة 9   
افتراضي الدرس الرابع العوامل الحسابية Arithmetic Operators



دورة برمجة الاردوينو : الدرس الرابع :
العوامل الحسابية Arithmetic Operators :


يمكن للأردوينو القيام بالرياضيات نيابة عنا. في هذا الدرس ، نلقي نظرة على كيفية القيام بالجمع والطرح والضرب والقسمة وإيجاد باقي القسمة .
سوف يتم وصف خمسة عوامل حسابية ثم وضعهم جميعًا في برنامج (سكيتش) لتوضيح كيفية عملهم على Arduino.

1- الجمع Addition :
لجمع (إضافة) أرقام على Arduino ، نستخدم عامل الجمع addition operator (+) .
يوضح المثال أدناه كيفية جمع رقمين معًا.

كود:
 nt a = 2;
int b = 7;
int sum;

sum = a + b;

في الكود أعلاه ، تم تعريف ثلاثة متغيرات. يتم تعيين قيمة لكل من المتغيرين a و b عند تعريفهما .
تم تعريف المتغير sum ، ولكن لم يتم تهيئته ، لذلك يحتوي على أي رقم عشوائي. سنستخدم هذا المتغير لتخزين نتيجة حساب الجمع ، بحيث يتم استبدال overwritten القيمة العشوائية التي يحتوي عليها sum عندما نضع نتيجة الجمع (أو المجموع sum) فيها.
بعد تنفيذ العبارة الموضحة أدناه ، سيحتوي المجموع sum على القيمة 9 أي نتيجة جمع المتغير a والمتغير b.

كود:
sum = a + b;

يمكننا أيضًا إضافة قيمتين ثابتتين وتخزين النتيجة في متغير كما هو موضح أدناه.

كود:
int sum;

sum = 2 + 10;

النتيجة المخزنة في المجموع sum بعد تنفيذ عبارة الجمع (الإضافة) ستكون 12 في هذا المثال .

يمكن أيضًا إضافة القيم الثابتة والمتغيرات معًا وتخزين النتيجة في متغير كما هو موضح هنا.

كود:
int a = 3;
int sum;

sum = a + 24;

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

2- الطرح Subtraction :
يقوم عامل الطرح subtraction operator بطرح رقم من آخر باستخدام علامة الطرح (-) كما يوضح المثال التالي.

كود:
int result;

result = 10 - 2;

ستكون نتيجة هذا الحساب 8 وسيتم تخزينها في المتغير result .

3- الضرب Multiplication :
يتم الضرب باستخدام عامل الضرب multiplication operator (*) .

كود:
 nt result;

result = 4 * 3;

ستكون نتيجة الحساب أعلاه 12 وسيتم تخزينها في المتغير result .

4- القسمة Division :
يتم استخدام عامل القسمة (/) لأداء القسمة في Arduino.

كود:
int result;

result = 12 / 3;

نتيجة الحساب أعلاه 4.

الأعداد الصحيحة Integers مقابل أعداد النقطة العائمة Floating Point :
حتى الآن كنا نستخدم القيم الصحيحة integer values فقط لإجراء الحساب. إذا كانت نتيجة القسمة ليست عددًا صحيحًا integer (أو عددًا صحيحًا whole number ) ، ولكنها تحتوي على جزء كسر ، فسيتم تجاهل جزء الكسر إذا تم تخزين النتيجة في متغير نوع عدد صحيح integer .
ستوضح الأمثلة التالية ما يحدث عندما يتم تخزين نتيجة بجزء كسري في عدد صحيح ثم متغير الفاصلة العائمة.

كود:
 int result;

result = 5 / 4;

ستكون النتيجة 1 لأنه يتم تجاهل الكسر عندما يتم تخزين النتيجة في result متغير عدد صحيح.
نفس الحساب ، ولكن هذه المرة تعريف result كمتغير نقطة عائمة (float) .

كود:
float result;

result = 5.0 / 4.0;

النتيجة الآن في المتغير result هي 1.25.
عند استخدام القيم الثابتة في الحسابات التي تخزن النتيجة في متغير الفاصلة العائمة ، نستخدم الفاصلة العشرية والصفر للأرقام الصحيحة ، أي 5.0 بدلاً من 5 بمفردها.

5- الباقى Remainder :
يتم استخدام عامل الباقي remainder operator لإيجاد الباقي بعد قسمة رقمين. يتم استخدام علامة النسبة المئوية (%) كعامل للباقى .

كود:
int result;

result = 11 % 4;

ستكون نتيجة هذا الحساب الباقي من 11 مقسومًا على 4 وهو 3 (4 تخصم من 11 مرتين ويترك الباقي 3 أى نتيجة القسمة تكون 2 وباقى القسمة يكون 3).

برنامج (سكيتش) العمليات الحسابية Arithmetic Sketch :
يوضح البرنامج (الاسكيتش) التالي المسمى arithmetic جميع العمليات الحسابية المذكورة أعلاه.
قم بتحميل الاسكيتش إلى Arduino وجربه. أضف أيضًا الأمثلة أعلاه ، مثل خلط القيم الثابتة والمتغيرات.

كود:
 void setup() {
  int a = 2;
  int b = 7;
  int result;
  float result_fl;
  
  Serial.begin(9600);
  
  Serial.print("Addition (a + b): ");
  result = a + b;
  Serial.println(result);
  
  Serial.print("Subtraction (10 - 2): ");
  result = 10 - 2;
  Serial.println(result);
  
  Serial.print("Multiplication (4 * 3): ");
  result = 4 * 3;
  Serial.println(result);
  
  Serial.print("Int Division (5 / 4): ");
  result = 5 / 4;
  Serial.println(result);
  
  Serial.print("Float Division (5.0 / 4.0): ");
  result_fl = 5.0 / 4.0;
  Serial.println(result_fl);
  
  Serial.print("Remainder (11 % 4): ");
  result = 11 % 4;
  Serial.println(result);
}

void loop() {
}

تعليقات على البرنامج (الاسكيتش) :
• الدالة print() :
يحتوي البرنامج على مزيج من الدوال print() و println() . يتم استدعاء print() عندما يجب أن يظل المؤشر غير المرئي على نفس السطر بحيث تتم طباعة النص المطبوع في عبارة println() التالية على نفس السطر أيضًا.
• الدالة println() :
يتم استخدام println() عندما يجب طباعة النص ثم ينتقل المؤشر غير المرئي إلى السطر التالي بحيث تطبع عبارة print() التالية النص على سطر جديد.
• متغير النقطة العائمة Floating Point Variable :
تم تعريف متغير result_fl منفصل للاحتفاظ بنتيجة حساب النقطة العائمة.
• متغير العدد الصحيح Integer Variable :
يتم إعادة استخدام result المتغير الصحيح عدة مرات أثناء البرنامج . الشيء المهم هو عرض نتائجه قبل وضع نتيجة الحساب التالي فيه.
• الثوابت والمتغيرات Constants and Variables :
تعرفنا على المتغيرات variables في الدرس الأخير . الثوابت Constants هي أرقام تظل ثابتة طوال البرنامج - أي أنها لا تتغير أبدًا.
أمثلة الثوابت هي الأرقام التي يتم استخدامها مباشرة في الحساب ولا يتم تعيينها إلى متغير ، على سبيل المثال sum = 2 + 3 يحتوي على الثوابت 2 و 3.
الثوابت ليس لها اسم ولا يمكن تغيير قيمها عند تشغيل البرنامج .
• العمليات الحسابية على أرقام النقطة العائمة Floating Point Arithmetic :
على الرغم من عدم ظهورها في الأمثلة أعلاه ، يمكن أيضًا إجراء الجمع والطرح والضرب على قيم الفاصلة العائمة.

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 26-03-2020, 09:30 PM المشاركة 10   
افتراضي الدرس الخامس : عوامل العلاقة (الارتباط - المقارنة) Relational Operators


دورة برمجة الاردوينو : الدرس الخامس
عوامل العلاقة (الارتباط - المقارنة) Relational Operators :


تختبر عوامل العلاقية العلاقة relationship بين القيم ، على سبيل المثال هل الرقم 7 أكبر من الرقم 5 ؛ أو القيمة التي يحملها holds المتغير أقل من 10.
نتيجة تقييم مقارنة قيمتين بواسطة عامل علاقة ستكون إما صحيحة true أو خاطئة false ، على سبيل المثال ، هل القيمة الموجودة في متغير تساوي 8؟ ستكون الإجابة إما صحيحة true (يحتوي على القيمة 8) أو خاطئة false (لا يحتوي على القيمة 8).
في البرمجة ، يتم تمثيل true بالقيمة 1 ويتم تمثيل false بالقيمة 0. سيساعد المثال التالي على توضيح هذا التفسير للعوامل العلاقية.

مثال على عامل علاقة (إرتباط ) :
يستخدم البرنامج التالي عامل العلاقة "أكبر من" (>) وعامل العلاقة "أصغر أو أقل من" (<) لمقارنة رقمين.

كود:
 void setup() {
  Serial.begin(9600);
  
  Serial.print("Is 7 greater than 5? ");
  Serial.println(7 > 5);
  
  Serial.print("Is 7 less than 5? ");
  Serial.println(7 < 5);
}

void loop() {
}

خرج البرنامج مبين أدناه :



يختبر عامل العلاقة الأول ما إذا كانت 7 أكبر من 5 : 7 > 5
7 أكبر من 5 ، لذا يكون الناتج من هذه المقارنة true أو 1.
يختبر عامل العلاقة الثاني ما إذا كان 7 أقل من 5: 7 < 5
7 ليس أقل من 5 ، وبالتالي فإن الناتج من المقارنة false أو 0.

أنواع عوامل العلاقة (الارتباط) Types of Relational Operators :
تحتوي لغة برمجة Arduino على 6 عوامل علاقة (ارتباط) مدرجة أدناه.

1- العامل أكبر من Greater Than >
لقد رأينا بالفعل عامل العلاقة أكبر من يعمل في المثال أعلاه. هنا مثال آخر يستخدم نفس العامل لمقارنة محتويات متغيرين.

كود:
 int a = 2;
int b = 3;

Serial.println(a > b);

يسأل عامل العلاقة السؤال "هل a أكبر من b؟" "Is a greater than b?".
ستكون نتيجة المقارنة 0 (false) في هذا المثال لأن القيمة التي يحتوي عليها المتغير a ليست أكبر من القيمة التي يحتوي عليها المتغير b.

2- العامل أصغر من Less Than <
هنا نستخدم عامل العلاقة أصغر من لمقارنة محتويات نفس المتغيرين.

كود:
 int a = 2;
int b = 3;

Serial.println(a < b);

يسأل عامل العلاقة السؤال "هل a أصغر من b؟" "Is a less than b?" .
سيكون خرج هذا البرنامج 1 (true) لأن القيمة التي يحتوي عليها المتغير a أقل من القيمة التي يحتوي عليها المتغير b.

3- العامل أكبر من أوتساوى Greater Than or Equal To >=
يعمل هذا العامل بنفس الطريقة التي يعمل بها عامل أكبر من ، ولكنه سيقيم evaluate أيضًا بالقيمة true (1) إذا كانت القيمتان قيد المقارنة متساويتين.

4- العامل أصغر من أو تساوى Less Than or Equal To <=
سيتم تقييم نتيجة هذا العامل إلى القيمة true (1) إذا كانت القيمة على يسار العامل أقل من القيمة الموجودة على يمين العامل ؛ أو إذا كانت القيمتان متساويتان.

5- العامل يساوى Equal To ==
يتم تقييم نتيجة العامل يساوى فقط بالقيمة true (1) إذا كانت القيمتان قيد المقارنة متساوية equal ، وإلا فسيتم تقييمها إلى false (0) .
من السهل نسيان استخدام علامتين تساوى (==) واستخدام علامة يساوى واحدة فقط لمعامل العلاقة يساوى . سيؤدي استخدام علامة تساوى واحدة فقط إلى تعيين المتغير على يسار العامل القيمة للمتغير أو الثابت على اليمين. إذا كانت القيمة على اليسار ثابتة ، فسيحدث خطأ في الترجمة compile error إذا تم استخدام يساوي واحد (=) بدلاً من يساوي مزدوجة (==).

6- عامل عدم التساوى Not Equal To !=
يتم تقييم عامل عدم التساوى فقط بالقيمة true إذا كانت القيمتان التي تتم مقارنتها مع بعضها البعض غير متساوية ، وإلا فسيتم تقييمها إلى false .

برنامج (سكيتش) عامل العلاقة Relational Operator Sketch
يوضح سكيتش الاردوينو أدناه العوامل العلائقية.

كود:
void setup() {
  int a = 2;
  int b = 3;
  
  Serial.begin(9600);
  
  Serial.print("Is a greater than b? ");
  Serial.println(a > b);
  
  Serial.print("Is a less than 25? ");
  Serial.println(a < 25);
  
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
  
  a = 3;
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
  
  a = 4;
  Serial.print("Is a greater than or equal to b? ");
  Serial.println(a >= b);
  
  Serial.print("Is a equal to b? ");
  Serial.println(a == b);
  
  b = 4;
  Serial.print("Is a equal to b? ");
  Serial.println(a == b);
  
}

void loop() {
}

انسخ هذا الاسكيتش وقم بتشغيله على Arduino. جرب مع عوامل الارتباط العلائقية للتأكد من فهمك لها.

أشياء يجب ملاحظتها في الاسكيتش :
• تقييم وطباعة تعبير Evaluating and Printing an Expression
ما يجب ملاحظته في الاسكتشات أعلاه هو أن التعبير expression يتم تقييمه evaluated وطباعته في عبارة statement واحدة. لا يتم حفظ نتيجة تعبير العامل العلائقي أولاً في متغير ثم تتم طباعته.
يمكن القيام بذلك أيضًا مع عوامل الحساب كما هو موضح هنا:

كود:
void setup() {
  int a = 2;
  int b = 3;
  
  Serial.begin(9600);
  
  Serial.print("a + b = ");
  Serial.println(a + b);
}

void loop() {
}

خرج الاسكيتش أعلاه مبين بالشكل التالى :



يتم تقييم التعبير a + b (للحصول على القيمة 5) ويتم طباعته في نفس العبارة.
• الارتباك Confusing بين = و == :
كما ذكرنا من قبل ، من السهل نسيان علامة التساوي الثانية عند استخدام عامل يساوي equal. يوضح الاسكيتش أدناه ما يمكن أن يحدث مع هذا الخطأ.

كود:
void setup() {
  int a = 2;
  int b = 3;
  
  Serial.begin(9600);
  
  Serial.print("a == b: ");
  Serial.println(a == b);
  
  Serial.print("a = b: ");
  Serial.println(a = b);
}

void loop() {
}

إن المقارنة بين a و b في التعبير a == b صحيحة ويتم تقييمها إلى 0 كما هو متوقع.
إذا تم ترك علامة التساوي الثانية كما هو موضح في التعبير الثاني a = b ، فسيتم استخدام عامل التخصيص (=) عن طريق الخطأ بدلاً من عامل التساوي (==).
يؤدي هذا إلى تعيين a لقيمة b وهي 3 ثم تتم طباعة 3. سيتم تقييم الرقم غير الصفري non-zero على أنه true كما سنرى لاحقًا .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 27-03-2020, 02:16 PM المشاركة 11   
افتراضي الدرس السادس عامل الزيادة والتعليق Increment Operator and Commenting


دورة برمجة الاردوينو : الدرس السادس
عامل الزيادة والتعليق Increment Operator and Commenting

عامل الزيادة increment operator هو عامل حسابي فى الاردوينو يستخدم لزيادة متغير صحيح integer بقيمة واحد one . سوف نتناول كيفية استخدام عامل الزيادة في هذا الدرس .
التعليقات comments في البرمجة هي ملاحظات notes مكتوبة في برنامج (أو سكيتش) من قبل المبرمج. تُستخدم هذه الملاحظات لشرح ما يفعله الكود ، أو لإضافة معلومات بشرية أخرى مفيدة يمكن قراءتها إلى الكود. يتم شرح كيفية ومتى وسبب استخدام التعليقات في نهاية هذا الدرس .

عامل زيادة الاردوينو Arduino Increment Operator
يستخدم عامل زيادة الاردوينو لزيادة القيمة التي يحتفظ بها المتغير بواحد. هذا مفيد في أنواع معينة من الحلقات كما سيتم عرضه لاحقًا .

عامل الزيادة – مثال 1 :
يوضح المثال أدناه عامل الزيادة المستخدم لزيادة القيمة عدة مرات.


كود:
void setup() {
  int count = 0;
  
  Serial.begin(9600);
  
  Serial.println(count++);
  Serial.println(count++);
  Serial.println(count++);
  
  Serial.println(count);
}

void loop() {
}


خرج البرنامج :



• تهيئة المتغير للزيادة Initializing the Variable to Increment
في المثال أعلاه ، يتم تعريف المتغير count وتهيئته بقيمة 0 (صفر).
من المهم تهيئة هذا المتغير قبل استخدام عامل الزيادة لأنه إذا لم تتم تهيئته ، فيمكن أن يحتوي على أي قيمة عشوائية. هنا نقوم بتهيئته إلى 0 ، ولكن يمكن استخدام أي قيمة صحيحة أخرى.

• الطباعة والتزايد Printing and Incrementing
يتم استخدام الدالة Serial.println() لطباعة قيمة count ، ولكن في نفس العبارة ، يتم استخدام عامل الزيادة (++) لزيادة القيمة التي يحتفظ بها المتغير count .
تؤدي عملية الزيادة إلى زيادة القيمة فى count من 0 إلى 1.

• الزيادة اللاحقة (ما بعد) Post Incrementing
يعد وضع ++ بعد اسم المتغير (count++) عملية زيادة لاحقة (بعد) . وهذا يعني أن المتغير يستخدم في العبارة ويزداد بعد ذلك فقط.
بسبب عملية الزيادة اللاحقة ، تتم طباعة القيمة الأولية للمتغير count (وهى 0) بواسطة الدالة println() الأولى ، ويتم زيادته فقط بعد ذلك.
تقوم الدالة println() التالية بطباعة القيمة المتزايدة الجديدة (الآن هى 1) ثم يزيد عامل الزيادة في العبارة قيمة count بعد طباعتها - يتم زيادتها الآن إلى 2.
تطبع عبارة println() الثالثة 2 وتزيد القيمة في count إلى 3.
تطبع عبارة println() النهائية قيمة count لكنها لا تستخدم عامل الزيادة. تطبع القيمة 3 التي تمت زيادة المتغير إليها مسبقًا.

عامل الزيادة – مثال 2
يعمل البرنامج التالي تمامًا مثل البرنامج السابق ، ولكن تم فصل عمليات الزيادة وعمليات الطباعة في عباراتها الخاصة.
قد يساعد هذا المثال على توضيح ما يحدث في المثال السابق. يمكننا أن نرى أن عبارة println() الأولى تطبع قيمة count وفقط بعد ذلك يتم زيادة القيمة فى count.

كود:
void setup() {
  int count = 0;
  
  Serial.begin(9600);
  
  Serial.println(count);
  count++;
  Serial.println(count);
  count++;
  Serial.println(count);
  count++;
  
  Serial.println(count);
}

void loop() {
}

من هذين المثالين ، يمكننا أن نرى أن هذا السطر المفرد من الكود:

كود:
 Serial.println(count++);

هو نفس السطرين من الكود :

كود:
Serial.println(count);
count++;

الشيء المهم الذي يجب ملاحظته هو أن الزيادة في المتغير تحدث بعد طباعته ، لذلك تتم طباعة القيمة التي يحملها المتغير قبل تحديثه إلى القيمة المتزايدة الجديدة.
كما هو الحال دائمًا ، قم بتحميل الكود إلى Arduino الخاص بك وجربه.

تعليقات البرامج (الاسكيتشات) Commenting Sketches :
تسمح لك التعليقات بكتابة الملاحظات النصية الخاصة بك مع كود البرنامج . يوضح البرنامج التالي طريقتين لكتابة التعليقات.

كود:
 /*
    Sketch Name:  comments
    
    Purpose:      Demonstrates how to use comments.
                  Increments and displays a number in the main loop.
    
    Date:             
    Author:       
*/

void setup() {
  Serial.begin(9600);       // use the serial port for printing the number
}

int count = 0;              // the number to print

void loop() {
  Serial.println(count++);  // print and increment the number
  delay(1000);              // 1 second delay between printing
}

• تعليقات متعددة الأسطر Multi-line Comments
يمكن كتابة التعليقات على أسطر متعددة عند استخدام حرفى الشرطة المائلة للأمام والنجمة للفتح (/*) واستخدام حرفى النجمة والشرطة المائلة للأمام (*/) للإغلاق كما هو موضح أعلى البرنامج .
يمكن كتابة أي تعليقات نصية بين فتح وإغلاق التعليق ويمكن أن تمتد إلى عدة أسطر. سيتم تجاهل جميع النصوص في التعليق من قبل المترجم compiler .
يمكن أيضًا استخدام هذا النمط من التعليق على سطر واحد ، ولكن يجب دائمًا إغلاقه بعلامة النجمة والشرطة الأمامية كما هو موضح أدناه.

كود:
 delay(1000);  /* 1 second delay between printing */

هناك طريقة أسهل للتعليق على سطر واحد من الكود ، باستخدام تعليق سطر واحد ، كما هو موضح أدناه.

• تعليقات سطر واحد Single Line Comments
يتم استخدام شرطة مائلة للأمام مزدوجة (//) لإنشاء تعليق سطر واحد. سيكون كل النص الموجود على يمين الخط المائل المزدوج على نفس السطر عبارة عن تعليق وسيتم تجاهله من قبل المترجم.
يمكن استخدام تعليق سطر واحد على سطر خاص به أو على يمين عبارة البرنامج.

كود:
// the delay slows down the printing of the numbers
delay(1000);  // 1 second delay between printing

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

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


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 27-03-2020 الساعة 02:27 PM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 28-03-2020, 02:08 PM المشاركة 12   
افتراضي الدرس السابع حلقة for للاردوينو The Arduino for Loop


دورة برمجة الاردوينو : الدرس السابع
حلقة for للاردوينو The Arduino for Loop


لقد تناولنا بالفعل نوع واحد من الحلقات ، وهى الحلقة الرئيسية main loop للاردوينو في الدرس الثانى .
في هذا الدرس ، نتناول نوع آخر من الحلقات يسمى حلقة "for".
في حين أن العبارات أو التعليمات البرمجية في الحلقة الرئيسية للاردوينو ستعمل باستمرار ولا تخرج أبدًا من الحلقة ، فإن حلقة for تسمح لنا بالتكرار loop من خلال التعليمات البرمجية لعدد معين من المرات قبل الخروج من الحلقة.
من الطرق الشائعة لاستخدام حلقة for هي مع عامل الزيادة الذي تمت تغطيته في الدرس السابق .

استخدام حلقة for Using the for Loop
يوضح البرنامج (الاسكيتش) التالي استخدام حلقة for.

كود:
void setup() {
  int i;
  
  Serial.begin(9600);
  
  for (i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
}

void loop() {
}

قم بتحميل البرنامج إلى Arduino الخاص بك لمعرفة كيف يعمل .

كيف تعمل حلقة for How the for Loop Works :
توضح الصورة أدناه أجزاء حلقة for .



أجزاء حلقة for فى برنامج الاردوينو :
• بناء حلقة for :
تبدأ حلقة for الأساسية على النحو التالي:

كود:
for () {
}

يتم إضافة ثلاثة تعبيرات expressions بين قوسي الفتح والإغلاق () لتحديد عدد مرات تشغيل العبارات في الحلقة قبل الخروج من الحلقة. عند الخروج من الحلقة ، يستمر تنفيذ البرنامج أسفل الحلقة - أي يتم تنفيذ العبارات خارج الحلقة وأسفلها من أعلى إلى أسفل.
يحتوي جسم body الحلقة بين أقواس الفتح والإغلاق {} على العبارات التى سوف يتم تشغيلها في الحلقة.
تسمى التعابير بين الأقواس () تعبير التهيئة initialize expression وتعبير الاختبار test expression وتعبير الزيادة increment expression .
يجب تعريف متغير لاستخدامه في تعبيرات الحلقة الثلاثة. في المثال أعلاه ، يتم استخدام متغير صحيح integer يسمى i.
يجب أن تظهر تعبيرات الحلقة الثلاثة بالترتيب: التهيئة والاختبار والتزايد. يتم فصلها بفواصل منقوطة (. لا ينتهي تعبير الزيادة بفاصلة منقوطة.

1- تعبير التهيئة Initialize Expression :
يتم تشغيل تعبير التهيئة مرة واحدة فقط في الوقت الذي تبدأ فيه الحلقة. يقوم بتهيئة المتغير i الخاص بنا إلى الصفر (0) في المثال .

2- تعبير الاختبار Test Expression
يحدد تعبير الاختبار متى نخرج من الحلقة. يتم استخدامه لتعيين عدد المرات التي يتم فيها تشغيل العبارات في جسم الحلقة.
عندما يتم تقييم تعبير الاختبار إلى true ، سيتم تشغيل العبارات في جسم الحلقة. عندما يتم تقييم تعبير الاختبار على أنه false ، فلن يتم تشغيل الحلقة مرة أخرى ، ولكن سيتم الخروج منها.
يتم تقييم تعبير الاختبار في كل مرة يبدأ فيها التنفيذ في الجزء العلوي من الحلقة.

3- تعبير الزيادة Increment Expression
يستخدم تعبير الزيادة لتغيير القيمة التي يحملها المتغير i. يتم تشغيله في كل مرة يبدأ فيها التنفيذ في الجزء العلوي من الحلقة.

تدفق البرنامج في الحلقة Program Flow in the Loop :
توضح الصورة أدناه كيفية عمل تدفق البرنامج في حلقة for.



تدفق برنامج حلقة for :

1- المرة الأولى من خلال الحلقة :
في المرة الأولى من خلال الحلقة ، تتم تهيئة i على 0 ، ويختبر تعبير الاختبار ما إذا كان i < 10 (0 < 10) صحيحًا true ، لذلك سيتم تشغيل العبارات في الحلقة.
نظرًا لاستخدام عامل الزيادة اللاحقة مع المتغير ، فلن يتم زيادة i إلا في نهاية الحلقة. العبارات في الحلقة تعمل وتطبع قيمة i بالقيمة 0 لأنه لم يتم زيادتها بعد.
لذلك لدينا ما يلى :

كود:
i is initialized to 0
i contains 0
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 0
At the end of the loop i is incremented so i == 1

2- المرة الثانية من خلال الحلقة :
في المرة الثانية من خلال الحلقة ،i الآن تحتوي على 1 حيث تم زيادتها في الجزء السفلي من الحلقة. يختبر تعبير الاختبار الآن ما إذا كان i < 10 (1 < 10) صحيحًا true ، لذلك سيتم تشغيل العبارات في الحلقة مرة أخرى. سيتم زيادة المتغير i فقط إلى 2 في الجزء السفلي من الحلقة ، لذلك تتم طباعة 1 إلى نافذة جهاز العرض التسلسلي.
لدينا الآن :

كود:
i is not initialized again
i contains 1
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 1
At the end of the loop i is incremented so i == 2

3- المرة الأخيرة من خلال الحلقة :
سيستمر تنفيذ الحلقة وسوف تتزايد i في كل مرة.
في المرة الأخيرة من خلال الحلقة ، يكون لدينا:

كود:
i is not initialized again
i contains 9
i < 10 evaluates to true or 1 because i is less than 10
The two statements in the loop run, print i as 9
At the end of the loop i is incremented so i == 10

يبدأ التنفيذ من أعلى الحلقة مرة أخرى ، ويتم اختبار تقييم تعبير الاختبار .
لدينا الآن :

كود:
 i is not initialized again
i contains 10
i < 10 evaluates to false or 0 because i is not less than 10 (it is equal to 10)
The statements in the loop are not run again
The loop is exited
The statement below the closing bracket of the loop will be run

طريقة بديلة لكتابة حلقة for
البرنامج التالي يوضح أن المتغير المستخدم في تعبيرات الحلقة يمكن تعريفه أيضًا في الحلقة ولا يجب تعريفه خارج الحلقة كما فعلنا فى البرنامج السابق.

كود:
 void setup() {
  Serial.begin(9600);
  
  for (int i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
}

void loop() {
}

يعمل هذا البرنامج تمامًا مثل البرنامج السابق ويخرج الأرقام من 0 إلى 9.

حلقة داخل حلقة A Loop Within a Loop
يستخدم البرنامج التالي حلقة for داخل الحلقة الرئيسية للاردوينو Arduino.

كود:
void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 10; i++) {
    Serial.print("i = ");
    Serial.println(i);
  }
  delay(1000);
}

تعمل حلقة for بنفس الطريقة التي كانت تعمل بها من قبل ، ولكن الآن بعد خروجها ، يتم تشغيل الدالة delay() لإعطاء تأخير لمدة ثانية واحدة. يتم الوصول إلى نهاية الحلقة الرئيسية للاردوينو ، بحيث يتم تشغيل حلقة for مرة أخرى.
عند تشغيل حلقة for مرة أخرى ، تتم تهيئة i إلى 0 لأن حلقة for تبدأ من الأعلى مرة أخرى. ثم يتم تشغيلها مرة أخرى كما هو موضح سابقًا.
سيتم تشغيل حلقة for والدالة delay() باستمرار لأن الحلقة الرئيسية للاردوينو لا تخرج أبدًا.

ملاحظات على أمثلة برامج حلقة for :
لاحظ ما يلي حول أمثلة البرامج في هذا الدرس .
• تعبير التهيئة Initialize Expression
ليس من الضروري تهيئة تعبير التهيئة في حلقة for إلى صفر (0) ، ولكن يمكن تهيئته إلى أي قيمة صحيحة integer ، أو حتى قيمة سالبة.

• تعبير الزيادة Increment Expression
يُستخدم تعبير الزيادة لتغيير قيمة المتغير الذي يختبره تعبير الاختبار. لا يجب أن يكون هذا عامل زيادة ، ولكن يمكن أن يكون عامل إنقاص decrement (يطرح 1 من المتغير) أو أي تعبير حسابي آخر.
تم استخدام عامل الزيادة في البرامج للحفاظ على بساطة الأمور في البداية ، ولأنها طريقة شائعة لاستخدام حلقة for. سنلقي نظرة على طرق أخرى لاستخدام حلقة for لاحقًا .

• العد من الصفر (0) Counting from Zero (0)
لاحظ أنه في الأمثلة ، تتم تهيئة القيمة التي يحتوي عليها المتغير i على 0 وليس 1. وبالتالي ، فإننا نطبع قيمة عدد تبدأ من 0 وتنتهي عند 9.
يتم تشغيل الحلقة في الواقع 10 مرات وليس 9 مرات. هذا لأننا نبدأ من 0 ، من 0 إلى 9 تكون 10 أرقام ، لكن من 1 إلى 9 تكون 9 أرقام ، ومن 1 إلى 10 تكون 10 أرقام .
تعرض القائمة التالية عدد المرات خلال الحلقة على اليسار وقيمة i على اليمين.





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 28-03-2020, 02:31 PM المشاركة 13   
افتراضي الدرس الثامن حلقات while وdo while والاردوينو


دورة برمجة الاردوينو : الدرس الثامن
حلقات while وdo while والاردوينو


تتشابه حلقة while مع حلقة for التي تم شرحها في الدرس السابق. والفرق الرئيسي هو أن حلقة while تفصل separates عناصر حلقة for كما هو موضح لاحقا .
حلقة أخرى تسمى حلقة do while يتم تغطيتها أيضًا. يتم تشغيل حلقة do while دائمًا مرة واحدة على الأقل قبل إجراء أي اختبارات قد تؤدي إلى قطع تنفيذ البرنامج والخروج من الحلقة.

1- حلقة while
البرنامج التالي يفعل بالضبط نفس عمل برنامج حلقة for فى الدرس السابق ، باستثناء أنه يستخدم حلقة while حتى نتمكن من رؤية أوجه التشابه بين الحلقتين.

كود:
void setup() {
  int i = 0;
  
  Serial.begin(9600);
  
  while (i < 10) {
    Serial.print("i = ");
    Serial.println(i);
    i++;
  }
}

void loop() {
}

بناء حلقة while
تمتلك حلقة while بناء structure على النحو التالي:

كود:
while (loop test expression goes here) {
  Statements that run in the loop go here
  Statement 1
  Statement 2
  ...
}

تبدأ حلقة while بالكلمة المفتاحية while متبوعة بتعبير اختبار بين قوسي الفتح والإغلاق ( ) . تدل أقواس الفتح والإغلاق { } على جسم الحلقة.

• تعبير الاختبار Test Expression
كما هو الحال مع الحلقة for ، فإن حلقة while لها تعبير اختبار سيحدد ما إذا كانت العبارات في الحلقة ستعمل أم لا. إذا تم تقييم تعبير الاختبار إلى true ، يتم تشغيل عبارات الحلقة. إذا تم تقييم تعبير الاختبار على أنه false ، فلن يتم تشغيل عبارات الحلقة ، ولكن العبارات التي تتبع قوس إغلاق الحلقة سيتم تشغيلها - أي يستمر التنفيذ خارج الحلقة وأسفلها.

• تعبير التهيئة Initialize Expression
تحتوي حلقة for على تعبير تهيئة كجزء من الحلقة. يمكن للحلقة while استخدام أي متغير من البرنامج الذي يحتوي على قيمة صالحة. في مثال البرنامج ، يجب تهيئة المتغير المستخدم في الحلقة (i) عند تعريفه ، وإلا فسيحتوي على أي قيمة عشوائية.

• تعبير الزيادة Increment Expression
تم استخدام تعبير الزيادة في أمثلة حلقة for في الدرس السابق . في مثال حلقة while ، يتم وضع تعبير الزيادة داخل جسم الحلقة.

كيف يعمل مثال حلقة while :
في مثال البرنامج ، يحدث ما يلي:
1. تتم تهيئة المتغير i إلى 0 عند بدء تشغيل البرنامج .
2. تقوم حلقة while بتقييم تعبير الاختبار (i <10).
3. يتم تقييم تعبير الاختبار إلى "صواب" true لأن i أقل من 10.
4. نظرًا لأن تعبير الاختبار صحيح true ، يتم تشغيل العبارات في الحلقة.
5. تتم طباعة القيمة الحالية للمتغير i ثم تتم زيادته.
6. عند الوصول إلى الجزء السفلي من الحلقة ، يبدأ التنفيذ من عند الجزء العلوي من الحلقة مرة أخرى.
7. يتم تقييم تعبير الاختبار مرة أخرى ، يكون صحيحًا true مرة أخرى ، لذلك يتم تشغيل الحلقة مرة أخرى.
فقط عندما يتم زيادة المتغير i إلى 10 ، سيتم تقييم تعبير الحلقة إلى false وسيتم إنهاء (الخروج من) الحلقة.

مثال آخر :
في المثال أدناه ، يتم استخدام حلقة while لحساب count up ما يصل إلى خمسة وعشرين بالخمسات fives عن طريق إضافة خمسة إلى متغير في كل مرة من خلال الحلقة.

كود:
void setup() {
  int sum = 0;
  
  Serial.begin(9600);
  
  // count up to 25 in 5s
  while (sum < 25) {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  }
}

void loop() {
}

في هذا البرنامج ، يتم تعريف متغير يسمى المجموع sum وتهيئته إلى 0. يختبر تعبير الاختبار في حلقة while إذا كان المجموع sum يحتوي على قيمة أقل من 25.
داخل الحلقة ، يتم زيادة متغير المجموع sum بمقدار 5 في كل مرة من خلال الحلقة بواسطة التعبير الحسابي:

كود:
sum = sum + 5;

يعني هذا التعبير "إضافة 5 إلى متغير المجموع sum ".
ثم تُطبع القيمة التي يحتفظ بها المتغير sum ، ويتبعها تأخير لمدة نصف ثانية.
نظرًا لأن قيمة المتغير يتم زيادتها أولاً ثم تتم طباعتها ، فإننا نرى القيمة 5 مطبوعة أولاً وليس القيمة 0 التي تمت تهيئتها لها.
على الرغم من أن تعبير الاختبار سيتم تقييمه على أنه خطأ false عند sum == 25 ، إلا أن 25 لا يزال الرقم الأخير الذي يتم طباعته. وذلك لأن آخر مرة يتم فيها تقييم تعبير الاختبار إلى true هي عندما يكون sum == 20 ، ولكن بعد ذلك تتم زيادة المجموع إلى 25 ويتم طباعته قبل تقييم تعبير الاختبار مرة أخرى.

2- حلقة do while :

تعمل حلقة do while بنفس طريقة حلقة while ، إلا أنها تعمل دائمًا مرة واحدة حتى إذا تم تقييم تعبير الاختبار إلى false.

بناء حلقة do while :
تتكون حلقة do whileمن كلمتين رئيسيتين do و while ، كما هو موضح أدناه.

كود:
 do {
    Statements that run in the loop go here
    Statement 1
    Statement 2
    ...
} while (test expression goes here);

يقع جسم حلقة do while بين أقواس الفتح والغلق { } ويحتوي على العبارات التي سيتم تشغيلها في الحلقة.
بينما تأتي الكلمة الأساسية while وتعبير الاختبار بعد جسم الحلقة ويتم إنهاؤها بفاصلة منقوطة ( .

مثال :
هذا المثال يوضح حلقة do while .

كود:
 void setup() {
  int sum = 0;
  
  Serial.begin(9600);
  
  // count up to 25 in 5s
  do {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  } while (sum < 25);
}

void loop() {
}

يتم تشغيل جميع العبارات في جسم الحلقة قبل تقييم تعبير الاختبار.
إذا تمت تهيئة المجموع sum بقيمة 25 عند تعريفه ، كما هو موضح في البرنامج أدناه ، سيتم تشغيل الحلقة مرة واحدة وسيتم طباعة 30. لن يتم تشغيل الحلقة بعد ذلك لأن تقييم الاختبار يتم تقييمه false .

كود:
void setup() {
  int sum = 25;
  
  Serial.begin(9600);
  
  // count up to 25 in 5s
  do {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  } while (sum < 25);
}

void loop() {
}

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

كود:
 void setup() {
  int sum = 25;
  
  Serial.begin(9600);
  
  // count up to 25 in 5s
  while (sum < 25) {
    sum = sum + 5;
    Serial.print("sum = ");
    Serial.println(sum);
    delay(500);                // 500ms delay
  }
}

void loop() {
}

في المثال أعلاه ، لن يظهر أي إخراج في نافذة الشاشة التسلسلية عند تشغيل البرنامج . يتم تقييم حلقة while إلى false ثم ينخفض التنفيذ مباشرة في الحلقة الرئيسية الفارغة.


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2020, 09:35 PM المشاركة 14   
افتراضي الدرس التاسع عبارة if والاردوينو The Arduino if Statement


دورة برمجة الاردوينو : الدرس التاسع
عبارة if والاردوينو The Arduino if Statement


في هذا الدرس ، يتم استخدام عبارة if لتوضيح كيفية اتخاذ القرارات decisions في البرنامج .
يتم استخدام عبارة if للتحقق من دخل لوحة المفاتيح إلى Arduino التي يكتبها المستخدم في نافذة الشاشة التسلسلية لبيئة التطوير Arduino IDE.
يمكن اتخاذ المزيد من القرارات ، اعتمادًا على المفتاح الذي يضغط عليه المستخدم ، على سبيل المثال ، إذا تم الضغط على المفتاح "1" ، يمكن تشغيل الليد LED الموجود على متن لوحة Arduino وإذا تم الضغط على المفتاح "0" ، فإن الليد LED يمكن إيقاف تشغيلها بينما يتم تجاهل جميع ضغطات المفاتيح الأخرى.

استخدام عبارة if Using the if Statement
يوضح البرنامج عبارة if المستخدمة في البرنامج للتحقق مما إذا تم إرسال حرف من نافذة الشاشة التسلسلية Arduino IDE.

كود:
void setup() {
  Serial.begin(9600);
}

void loop() {
  char rx_byte;
  
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
    Serial.print("You typed: ");
    Serial.println(rx_byte);
  }
}

إذا أرسل المستخدم حرفًا character من نافذة الشاشة التسلسلية ، فإن Arduino يرسل رد back النص "You typed: X" ، حيث X هو الحرف الذي كتبه المستخدم.

كيف يعمل البرنامج :
• بناء عبارة if للاردوينو Arduino if Statement Structure
تظهر بنية عبارة (تعليمة) if هنا:

كود:
if (conditional expression) {
  Body of if statement
}

إذا تم تقييم التعبير الشرطي conditional expression إلى "صواب" true ، يتم تشغيل التعليمات البرمجية في جسم body العبارة. إذا تم تقييم العبارة الشرطية إلى خطأ false ، فلن يتم تشغيل أي من التعليمات البرمجية في جسم عبارة if.

• التحقق من وجود حرف من نافذة المراقبة التسلسلية :
في مثال البرنامج ، ستكون القيمة التي تعود بها returns الدالة Serial.available() أكبر من 0 فقط إذا تم استلام حرف أو أكثر بواسطة Arduino من نافذة جهاز العرض التسلسلي.
سيتم تقييم عبارة if إلى true فقط إذا تم استلام حرف واحد أو أكثر.
عندما لا يتم إرسال أحرف إلى Arduino ، سيتم تقييم عبارة if في كل مرة من خلال الحلقة الرئيسية وتقييمها إلى false في كل مرة. وبالتالي لن يتم تشغيل الكود الموجود في جسم جملة if.
بمجرد أن يتم إرسال حرف من نافذة جهاز العرض التسلسلي ، ترجع الدالة Serial.available() "واحد" 1. عند تقييم العبارة if مرة أخرى ، يتم تقييمها إلى true (لأن 1 > 0) ويتم تشغيل الكود في جسم عبارة if .
الحرف الذي تم إرساله من نافذة جهاز العرض التسلسلي يتم تخزينه في المتغير rx_byte باستخدام سطر التعليمات البرمجية التالي.

كود:
rx_byte = Serial.read();       // get the character

نظرًا لأنه قد تم تخزين الحرف ، يمكن الآن إعادة إرساله إلى نافذة جهاز العرض التسلسلي مع بعض النص السابق له.

استخدام عبارة if لتشغيل ليد Switch On an LED :
يمكن استخدام عبارة if لاتخاذ قرار make a decision بتشغيل LED إذا تم استلام (استقبال) حرف معين كما يوضح هذا المثال التالي.

كود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
  
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
    if (rx_byte == 'a') {
      digitalWrite(13, HIGH);
    }
  }
}

في هذا البرنامج ، إذا كان الحرف المرسل من نافذة الشاشة التسلسلية هو 'a' ، فسيتم تشغيل الليد LED الموجود في الطرف 13 من Arduino. إذا تم إرسال أي حرف آخر ، فلن يحدث شيء.
عبارة if التالية :

كود:
 if (rx_byte == 'a')
سيتم تقييمها إلى "صواب" true فقط إذا كان الحرف الذي تم إستقباله من نافذة جهاز العرض التسلسلي والمخزن في المتغير rx_byte يساوي 'a'.

إيقاف تشغيل الليد مرة أخرى Switching the LED Off Again :

يمكن تعديل البرنامج أعلاه لإضافة عبارة if أخرى يمكن استخدامها لإيقاف تشغيل الليد LED مرة أخرى.
سيعمل البرنامج أدناه على تشغيل الليد LED إذا تم إرسال 'a' إلى Arduino وإيقاف تشغيل LED إذا تم إرسال 'b' إلى Arduino (لاحظ أنها حساسة لحالة الأحرف ، لذلك فإن استخدام 'A' و 'B' لن تعمل).

كود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
  
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       //
    if (rx_byte == 'a') {
      digitalWrite(13, HIGH);
    }
    if (rx_byte == 'b') {
      digitalWrite(13, LOW);
    }
  }
}

الآن إذا تم إرسال الحرف "b" ، يتم تقييم اختبار عبارة if للحرف 'a' إلى "خطأ" false ، ولكن يتم تقييم اختبار عبارة if للحرف جملة الحرف 'b' إلى "true" ويتم إيقاف تشغيل الليد LED.
يتم تناول طريقة أكثر فاعلية للتعامل مع تشغيل وإيقاف تشغيل الليد LED في الدرس التالي والذي يغطي عبارات else و else if .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2020, 09:43 PM المشاركة 15   
افتراضي الدرس العاشر اتخاذ القرارات باستخدام if-else Making Decisions with if-else :


دورة برمجة الاردوينو : الدرس العاشر
اتخاذ القرارات باستخدام if-else Making Decisions with if-else :


متابعة للدرس التاسع الذى غطى عبارة if ، نتناول الآن بنية if-else if-else construct .
يضيف هذا البناء construct المزيد من القدرة على اتخاذ القرار لعبارة if.

استخدام if-else :
عند استخدام عبارة if ، يتم تشغيل التعليمات البرمجية (الكود) في جسم عبارة if فقط عندما يتم تقييم عبارة if إلى true. عندما يتم تقييمها false ، يتخطى تنفيذ البرنامج الكود في جسم عبارة ة if ويستمر أسفل جسم عبارة if.

عن طريق إضافة عبارة else ، سيتم تشغيل التعليمات البرمجية في جسمها فقط عندما يتم تقييم عبارة if المقابلة لها إلى false .
يعرض الكود التالي بناء بنية if-else.

كود:
if (conditional expression) {
}

else {
}

يوضح الكود أدناه كيف يقارن عمل عبارة if مع عمل بنية if-else.

كود:
// "if" statement
if (conditional expression) {
  // Code placed here only runs if conditional expression is true
}

// Whether the conditional expression evaluates to true or false,
// code placed here will run

// "if-else" construct
if (conditional expression) {
  // Body of the "if" statement between { and }
  // Works as a normal "if" statement, code placed here will only
  // run if the conditional expression evaluates to true
}

else {
  // Body of the "else" statement between { and }
  // Code placed here will always run if the conditional expression
  // from the "if" statement evaluates to false
}

// Code placed below the if-else construct will always run whether
// the conditional expression evaluated to true or false

عندما يتم تقييم التعبير الشرطي conditional expression بالقيمة true:
1. يتم تشغيل التعليمات البرمجية في جسم عبارة if.
2. لا يتم تشغيل التعليمات البرمجية في جسم عبارة else .

عندما يتم تقييم التعبير الشرطي conditional expression إلى false :
1. الكود في جسم عبارة if لا يتم تشغيله .
2. يتم تشغيل الكود في جسم عبارة else .

مثال لبرنامج if-else :
يوضح البرنامج أدناه مثالًا على استخدام بنية if-else. سيتم تشغيل الليد LED (المتصل بالطرف 13 ) إذا تم إرسال الحرف 'a' إلى Arduino باستخدام نافذة الشاشة التسلسلية. إذا تم إرسال أي حرف آخر باستثناء 'a' ، فسيتم تقييم عبارة if إلى false ويتم تشغيل الكود الموجود في كتلة else مما يؤدي إلى إيقاف تشغيل LED.

كود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

void loop() {
  char rx_byte;
  
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
    if (rx_byte == 'a') {
      // switch the LED on if the character 'a' is received
      digitalWrite(13, HIGH);
    }
    else {
      // switch the LED off if any character except 'a' is received
      digitalWrite(13, LOW);
    }
  }
}

ملاحظات حول مثال برنامج if-else
• بنية if-else المتداخلة Nested if-else Construct
يتم وضع بنية if-else في المثال أعلاه بالفعل داخل جسم عبارة if أخرى. هذا يسمى "تداخل" "nesting" ونقول أن
if-else متداخلة داخل عبارة if الأولى.
لجعل هذا أكثر وضوحًا ، هذا هو بناء if-else المتداخل:

كود:
if (rx_byte == 'a') {
  // switch the LED on if the character 'a' is received
  digitalWrite(13, HIGH);
}
else {
  // switch the LED off if any character except 'a' is received
  digitalWrite(13, LOW);
}

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

كود:
 if (Serial.available() > 0) {    // is a character available?
}

• كيف يعمل البرنامج :
يعتمد مثال البرنامج على برنامج من الدرس السابق . بدلاً من إيقاف تشغيل الليد LED عند إرسال 'b' فقط ، سيتم إيقاف تشغيل الليد LED عند إرسال أي حرف باستثناء 'a'.
سيقوم الحرف 'a' بتشغيل الليد LED كما في البرنامج السابق لأن التعبير الشرطي فى عبارة if يتم تقييمه إلى true عند استقبال 'a' . أي حرف آخر يتم استلامه سيؤدي إلى تقييم التعبير الشرطي إلى false . عندما يتم تقييم التعبير على أنه false ، لا يتم تشغيل جسم عبارة (جملة) if ، ولكن يتم تشغيل جسم عبارة else بدلاً من ذلك ، مما يؤدي إلى إيقاف تشغيل الليد LED.


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2020, 09:53 PM المشاركة 16   
افتراضي الدرس الحادى عشر القرارات باستخدام if-else-if Decisions with if-else-if :


دورة برمجة الاردوينو : الدرس الحادى عشر
القرارات باستخدام if-else-if Decisions with if-else-if :


تسمح بنية if-else-if بتقييم "المزيد من التعبيرات الشرطية" عن بنية if-else الذي تم تغطيتها سابقًا.
ما يعنيه هذا هو أنه يمكننا إضافة المزيد من القدرة على اتخاذ القرار إلى برامج الاردوينو . يمكن التحقق من متغير واحد لمعرفة ما إذا كان يحتوي على أي واحدة من عدد من القيم المختلفة ويمكن اتخاذ قرار اعتمادًا على القيمة التي يحتوي عليها المتغير.

استخدام بنية if-else-if :
بناء if-else-if موضح أدناه.

كود:
if (conditional expression 1) {
}
else if (conditional expression 2) {
}

كما هو مبين ، فإن بناء if-else-if يسمح بتقييم تعبير شرطي ثانٍ بعد عبارة if الأولى.
إذا تم تقييم التعبير الشرطي الأول إلى "صواب" true ، فسيتم تشغيل التعليمات البرمجية الموجودة في جسم جملة if ولن يتم تشغيل التعليمات البرمجية الموجودة في جسم جملة else-if .
فقط إذا تم تقييم التعبير الشرطي الأول إلى خطأ false ، فسيتم تقييم التعبير الشرطي الثاني. إذا تم تقييم التعبير الشرطي الثاني إلى "صواب" true ، فسيتم تشغيل الكود الموجود في الكتلة أسفل عبارة else-if . إذا تم تقييم التعبير الشرطي الثاني إلى خطأ false ، فسيستمر تنفيذ البرنامج أسفل قوس الإغلاق لجسم عبارة else-if .

مثال على if-else-if :
يوضح البرنامج أدناه استخدام بنية if-else-if. إذا تم إرسال الحرف 'a' من نافذة الشاشة التسلسلية ، سيومض الليد LED بمعدل معين. إذا تم إرسال الحرف 'b' ، سيومض الليد LED بمعدل أسرع.

كود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
  }
  if (rx_byte == 'a') {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
  else if (rx_byte == 'b') {
    digitalWrite(13, HIGH);
    delay(200);
    digitalWrite(13, LOW);
    delay(200);
  }
}

أول عبارة if تحصل على حرف من المنفذ التسلسلي إذا كان متاحًا. فيما يلى بناء if-else-if .

كود:
if (rx_byte == 'a') {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}
else if (rx_byte == 'b') {
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(200);
}

تحديد المعدل الذي يومض به الليد LED :
يتحقق هذا الكود ببساطة من الحرف الذي يحمله المتغير rx_byte. إذا كان هذا المتغير يحتوي على 'a' ، فسيتم تشغيل الكود الموجود في كتلة if والذي سيومض الليد مع تأخير 500 مللي ثانية. يؤدي هذا إلى تشغيل الليد لمدة 500 مللي ثانية باستخدام الدالة delay() ثم إيقاف تشغيله لمدة 500 مللي ثانية.
إذا كان المتغير يحتفظ بالقيمة 'b' ، فسوف يومض الليد بمعدل أسرع عن طريق تغيير أوقات تشغيل وإيقاف الليد إلى 200 مللي ثانية.

إيقاف الليد عن الوميض :
إذا تم إرسال أي حرف فيما عدا 'a' أو 'b' ، فسيتوقف الليد عن الوميض لأنه لن يتم تقييم أي من التعبيرات الشرطية إلى true.

متى يتم تقييم التعبير :
لاحظ أن هذا الكود موجود في حلقة Arduino الرئيسية ، لذلك سيتم تقييم التعبير (التعبيرات ) الشرطي في كل مرة من خلال الحلقة. إذا تم استلام حرف يتسبب في أن يكون التعبير الشرطي صحيحًا true ، فسيكون هذا الشرط صحيحًا true في كل مرة خلال الحلقة حتى يتم استلام حرف جديد. هذا لأنه يتم تخزين الحرف في المتغير ولا يتغير حتى يتم استبداله overwritten بحرف جديد.

بناء if-else-if-else The if-else-if-else Construct
بنفس الطريقة التي يمكننا من خلالها إضافة عبارة else أسفل عبارة if ، يمكننا إضافة عبارة else أسفل بناء if-else-if كما يوضح البرنامج أدناه.
يعمل هذا البرنامج بنفس طريقة البرنامج السابق ، باستثناء أنه عندما يتم إرسال أي حرف باستثناء 'a' أو 'b' ، يتم تشغيل كتلة else التي تومض الليد بشكل أسرع من معدلي الوميض السابقين.

كود:
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);  // LED on pin 13 of UNO
}

char rx_byte = 0;

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();
  }
  if (rx_byte == 'a') {
    // the character 'a' was received, blink the LED once per second
    digitalWrite(13, HIGH);  // switch the LED on
    delay(500);              // leave the LED on for 500ms
    digitalWrite(13, LOW);   // switch the LED off
    delay(500);              // leave the LED off for 500ms
  }
  else if (rx_byte == 'b') {
    // the character 'b' was received, blink the LED every 400ms
    digitalWrite(13, HIGH);  // switch the LED on
    delay(200);              // leave the LED on for 200ms
    digitalWrite(13, LOW);   // switch the LED off
    delay(200);              // leave the LED off for 200ms
  }
  else {
    // any character except 'a' or 'b' was received
    digitalWrite(13, HIGH);  // switch the LED on
    delay(100);              // leave the LED on for 100ms
    digitalWrite(13, LOW);   // switch the LED off
    delay(100);              // leave the LED off for 100ms
  }
}

عندما يبدأ البرنامج في العمل ، يومض الليد على الفور بأسرع معدل عن طريق تشغيل الكود في كتلة else . هذا لأن المتغير rx_byte يتم تهيئته إلى 0 وهو بالطبع ليس 'a' أو 'b'.
إذا كنت تريد أن يومض الليد بأبطأ معدل عند بدء البرنامج ، فقم بتهيئة المتغير إلى 'a' كما هو موضح هنا.

كود:
char rx_byte = 'a';

تقييم المزيد من التعبيرات الشرطية :
يمكن تقييم المزيد من التعبيرات الشرطية عن طريق إضافة المزيد من عبارات else if بعد عبارة if الأولى كما هو موضح هنا.

كود:
if (conditional expression 1) {
}
else if (conditional expression 2) {
}
else if (conditional expression 3) {
}
else if (conditional expression 4) {
}
etc. ...

لتنفيذ مهمة فقط إذا لم يتم تقييم أي من التعبيرات الشرطية على "صحيح" true ، يمكن إضافة شرط آخر في النهاية كما هو موضح أدناه.

كود:
 if (conditional expression 1) {
}
else if (conditional expression 2) {
}
else if (conditional expression 3) {
}
else if (conditional expression 4) {
}
else {
}



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:56 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)