الاهداف

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

أترك التركيب السابق كما هو.

إفتح واجهة التطوير و حرر نص البرنامج التالي:

int sw_pin = 7;
int led_pin = 10;
int etat_sw =0;

boolean etat_led = false;  //false = LED éteinte  true = LED allumée

void setup() {
 pinMode(sw_pin, INPUT);
 pinMode(led_pin, OUTPUT);  

}

void loop() {
  
  etat_sw = digitalRead(sw_pin);
   
  if(etat_sw == HIGH) {
      etat_led =!(etat_led);
                      }
  if (etat_led ==1) {
       digitalWrite(led_pin, HIGH);
                    }
  else {
       digitalWrite(led_pin, LOW);
       }
}

نشرح فيما يلي عمل هذا البرنامج:

كما في النشاط السابق يحتوي المتغير « etat_sw» حالة المفتاح الكهربائي.
قمنا بتعريف متغير من نوع منطقي «Boolean» يمكنه أخذ القيم صحيح «true» أو خطأ «false» و خصصنا له القيمة الإبتدائية ب «false».

يجعل هذا المتغير صمام لاد يضيئ إذا كان «true» و ينطفئ إذا كان يساوي «false».

عندما نضغط على المفتاح في المرة الأولى، نقوم بتسجيل القيمة المنطقية المعاكسة لما كان يحمله المتغير: «etat_led» عن طريق العبارة و ذلك لكي ينير الصمام.
etat_led =!(etat_led);

المعامل «!» يعكس القيمة المنطقية ( في الفقرة 2 قمنا بتسجيل القيمة الإفتراضية «false» و الآن نعكسها لكي يضيئ الصمام)
مع التعليمة «if» نقوم بفحص قيمة «etat_led» الذي هو الآن «true» فنشعل الصمام.


الحلقة «()loop» تدور و إذا تركنا المفتاح، تصبح قيمة المتغير «etat_sw» صفر، الشرط يكون خطأ و لن تدور الحلقة و يبقى الصمام مضيئ إذ يحتفظ المتغير «etat_led» بقيمته.
if(etat_sw == HIGH)

عند الضغط ثانية على المفتاح، يصبح الشرط صحيح، إذن نعكس حالة «etat_led» و بذلك تنطفئ اللاد.
if(etat_sw == HIGH)

قم بفحص نص البرنامج ثم إرفعه إلى اللوحة.

إضغط على المفتاح، لاحظ حالة اللد. أعد التجربة عدة مرات. ماذا تلاحظ ؟

نلاحظ أنه مع أن البرنامج منطقي و صحيح إلا أنه غير موثوق أو غير فعّال.

ماذا حدث ؟

يتكون المفتاح الكهربائي في داخله من صفيحتين رقيقتين بينهما نابض. عندما نضغط عليه يحدث تلامس بين الصفيحتين مما ينشئ التماس بين القطبين. في حقيقة الأمر فإن التماس لا يكون تام و يكون لدينا خلال عدة ميلي ثواني عدة إرتدادات بين الصفيحتين تجعل المفتاح ينتقل بين المستوى 1 و 0 عدة مرات قبل أن يسكن في المستوى المطلوب.

rc_charge

يمكن حل هذا المشكل «الإرتداد» باستعمال عتاد إلكتروني إضافي أو عن طريق البرمجة. سوف نبين حل بإستعمال البرمجة و ذلك باستعمال تأخير زمني:

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

لاحظ أهمية البرمجة و ذلك بنفس التركيب يمكن برمجة وضائف مختلفة.