الدرس 5 - تشغيل LED عند الضغط على زر متصل مع Pull down Res

محمد صلاح الدينمنذ 4 سنوات

من خلال هذا الدرس سنتعلم كيفية توصيل push button مع الأردوينو. كذلك سنقوم بإضاءة LED عندما يتم الضغط على الزر (push button).

 

تصميم الدائرة على بروتيوس

في الدرس السابق (الدرس الرابع) تعلمنا كيفية انشاء مشروع جديد وكيفية بدء تصميم دائرة على بروتيوس. يمكنكم مراجعة الدرس عبر رابط الدرس الرابع.

1. افتح برنامج بروتيوس 8 وقم بإدراج الأجهزة التالية:

 

2. قم بتوصيل الدائرة كالتالي:

شرح الدائرة:

المنفذ رقم 13 سيتم توصيله مع الـ LED عبر مقاومة 220 أوم تعمل على تخفيف التيار ، أما المنفذ رقم 2 سيتم توصيله بين المقاومة 9.1 كيلو أوم و الـ push button بحيث عندما لايكون الزر موصلاً تكون القراءة على المنفذ 0 فولت وعندما يكون الزر موصلاً ستقوم المقاومة بسحب كل فولتية المصدر والتي تساوي 5 فولت وعليه سيقوم المنفذ بقراءة هذه القيمة (تسمى هذه المقاومة بالـ pull down resistor). اذا يمكنك أن تستنج أن المنفذ فعليا يقوم بقراءة الفولتية الموجودة على المقاومة.

 

ملحوظة هامة:

بصورة عامة ، عندما يتم توصيل منفذ الأردوينو مع دائرة سيقرأ المنفذ قيمة الفولتية للدائرة بين النقطة التي وصّل بها المنفذ والأرضي ففي هذه الدائرة منفذ الأردوينو رقم 2 موصل مع الدائرة في النقطة التي تسبق المقاومة وعليه سيقرأ قيمة الفولتية بين المقاومة والأرضي. وعندما لايكون الزر موصلا ً ستكون قيمة الفولتية بين المقاومة والأرضي تساوي صفرا ً وعليه سيقرأ المنفذ رقم 2 أيضا ً القيمة صفر ، كذلك عندما يتم الضغط على الزر ستكون قيمة الفولتية بين المقاومة والأرضي 5 فولت وعليه سيقرأ المنفذ رقم 2 فولتية بقيمة 5 فولت أيضا ً.

 

كتابة الكود على برنامج الأردوينو وتشغيل المحاكي

1. قم بكتابة الكود التالي ثم استخرج ملف الـ hex وضعه على الأردوينو الموجود بالبروتيوس 8 (راجع الخطوات الخاصة بإنشاء مشروع أردوينو جديد واستخراج ملف الـ hex بالدرس الرابع).

2. قم بتشغيل المحاكي ثم قم بالضغط على الزر ولاحظ النتائج.

const int buttonPin = 2;     
const int ledPin =  13;     

int buttonState = 0; 

void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT);
}

void loop() {
    buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

 

شرح الكود:

const int buttonPin = 2;     
const int ledPin =  13;     

int buttonState = 0; 

يبدأ الكود بمتغيرين من النوع int وهما buttonPin و ledPin ، إن الغرض منهما هو استبدال رقم المنفذ باسم يوضح وظيفة المنفذ ، وبما أن قيمة المنفذ لن تتغير أبدا ً تم وضع const قبل نوع المتغير لضمان أن المبرمج لن يغير هذه القيم داخل البرنامج. تم تعريف المتغيير buttonState واعطاءه قيمة ابتدائية ، سيقوم هذا المتغير بالاحتفاظ بحالة الـ button ، ففي حالة تم الضغط على الزر سيحتفظ المتغير بالقيمة 1 أما ان كان غير مضغوط ستكون قيمة المتغير 0.

void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT);
}

داخل مجال الـ setup سنقوم بكتابة الكود الذي سيقوم بتهيئة المنافذ للعمل بالصورة المطلوبة ، فكما هو واضح تم تهيئة منفذ الـ LED ليعمل كمنفذٍ للخرج وبالمثل تم تهيئة منفذ الـ button ليعمل في حالة الدخل.

void loop() {
    buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

الآن سنقوم بكتابة الكود الذي سيستمر في العمل الى ما لانهاية وذلك داخل المجال المسمى بـ loop ، ففي أول سطر داخل الـ loop ستتم قراءة قيمة الـ button عن طريق الكود (digitalRead(buttonPin حيث ستقوم الدالة digitalRead بارجاع القيمة 1 أو 0 بناءً على القيمة اللحظية الموجودة بالمنفذ رقم 2. يمكنك كتابة الكود (digitalRead(buttonPin بذكر رقم المنفذ مباشرة كالتالي (digitalRead(2 وستكون النتيجة هي نفسها ولكن ستصبح قراءة الكود وفهمه أكثر صعوبة. بعد أن تمت قراءة حالة المنفذ رقم 2 سيتم اختبار حالة الزر عن طريق الأمر if ، فاذا كانت قيمة الـ buttonState تساوي 1 أو HIGH عندها سيتم كتابة HIGH  على منفذ الـ LED وذلك عن طريق الكود (digitalWrite(ledPin, HIGH وكما ذكرنا سابقا ً بدلا عن كتابة اسم المنفذ المعرف مسبقا ً يمكننا كتابة رقم المنفذ مباشرة كالتالي (digitalWrite(13, HIGH ، اذا هذا هو الذي سيحدث عندما يتحقق الشرط ، ولكن مالذي يحدث ان لم يتحقق الشرط؟ في هذه الحالة سيتم تنفيذ الكود الموجود بداخل مجال الـ else وسيتم تجاهل الكود الموجود بعد if مباشرة. سيعمل هذا الكود بصورة مستمرة ودون توقف وهذ يعني أنه أثناء ضغطك للزر سيتم تنفيذ هذا الكود الموجود بمجال الـ loop ملايين المرات وعليه سيتم ارسال 5 فولت الى المنفذ في كل مرة !! كذلك حتى بعد تركك للزر سيتم تنفيذ الكود الا أنه سيقوم بتنفيذ الجزئية الأخرى المضمنة تحت else والتي تقتضي عدم ارسال 5 فولت الى منفذ الخرج.

 

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !