 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
29-03-2020, 06:53 PM
المشاركة 1
|
|
دورة برمجة الاردوينو : الدرس الحادى عشر
القرارات باستخدام 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' كما هو موضح هنا.
تقييم المزيد من التعبيرات الشرطية :
يمكن تقييم المزيد من التعبيرات الشرطية عن طريق إضافة المزيد من عبارات 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 {
}
|