الدرس الثالث برمجة جهاز التحكم الدقيق باستخدام لغة ++C (٢)
انظر إلى المثال المكتوب في الصفحة: عندما تضبط كلمة المرور الصحيحة على الرقم 5456، ويكتب المستخدم الرقم 5453، فإن البرنامج يقارن كل خانة على حدة. الرقم خمسة يقارن مع خمسة فلا توجد مشكلة، والاربعة مع الاربعة، والخامسة مع الخامسة، ولكن عند مقارنة الرقم ثلاثة في مدخلات المستخدم مع الرقم ستة الأصلي، يكتشف البرنامج عدم المطابقة. يعالج البرنامج هذا الاختلاف عبر متغير منطقي تهيئه في البداية على أنه صحيح، فإذا تطابقت الأرقام كلها يبقى المتغير على حاله، وإذا وجد خطأ في أي خانة تتغير قيمته إلى خطأ. تأمل الكود البرمجي في الأسفل، حيث يمر حلقة التكرار على الأزرار الأربعة بالترتيب من الصفر إلى ثلاثة، وتقرأ الدالة المفتاح المضغوط عبر لوحة المفاتيح، ثم يفحص الشرط هل الرمز المدخل يختلف عن خانة كلمة المرور المخزنة. إذا وجد اختلافاً، تتغير قيمة المتغير المنطقي إلى خطأ، وبعدها يُطبع المفتاح المضغوط على شاشة العرض في موقع المؤر المحدد.
يقوم هذا الدرس على برمجة جهاز التحكم الدقيق باستخدام لغة ++C لتنفيذ مشروع القفل الذكي للباب عبر لوحة مفاتيح وشاشة LCD ومحرك سيرفو. الفكرة الأساسية هي استقبال كلمة المرور المدخلة من المستخدم عبر لوحة المفاتيح والتحقق من صحتها رقماً رقماً بمقارنتها مع كلمة المرور المخزنة. إذا كانت مطابقة، يعرض البرنامج رسالة نجاح على الشاشة ويدير محرك سيرفو لفتح الباب، وإلا فيعرض رسالة خطأ. على سبيل المثال، إذا كانت كلمة المرور المخزنة هي 5456 وضغط المستخدم على المفاتيح بالترتيب نفسه، فإن البرنامج يقارن كل مفتاح بالرقم المقابل له، فإذا تساوت جميع الأرقام يفتح القفل.
الفكرة الأساسية
تقوم فكرة الدرس على بناء وبرمجة نظام قفل ذكي باستخدام لوحة مفاتيح وشاشة LCD ومحرك سيرفو مع جهاز التحكم الدقيق. يستقبل البرنامج أربعة أرقام يدخلها المستخدم، ويتحقق من صحتها بتتبع مقارنة كل رقم مضغوط مع رقم كلمة المرور المخزنة في نفس الموضع، ثم يقرر فتح الباب أو إطلاق تنبيه الخطأ بناء على ذلك.
الشرح
نبدأ بتعريف متغير منطقي باسم correctPass ونقوم بتهئية قيمته على أنه صائب أي true، ونستخدم حلقة تكرارية من النوع for لفحص الأزرار الأربعة المدخلة واحداً تلو الآخر. داخل الحلقة نقرأ المفتاح المضغوط بواسطة الدالة keypad.waitForKey ونقارنه مع رقم كلمة المرور في الموقع الحالي باستخدام شرط الاختلاف. إذا وجدنا أي اختلاف بين الرمزين، نقوم بتحديث قيمة المتغير المنطقي إلى خطأ أي false لتدل على أن كلمة المرور بأكملها خاطئ، ثم نطبع الرمز على شاشة LCD.
بعد انتهاء حلقة الفحص والتأكد من قيمة المتغير المنطقي، ننتقل إلى التحقق النهائي: إذا كانت قيمة المتغير صائبة، فهذا يعني أن المستخدم كتب كلمة المرور الصحيحة، فنقوم بمسح الشاشة وعرض رسالة نجاح، ثم نستخدم الدالة servo.write لتوجيه المحرك إلى زاوية 180 درجة لفتح الباب، ثم ننتظر خمس ثوان ونعيد المحرك إلى الزاوية صفر. أما إذا كانت القيمة خاطئة، فنقوم بمسح الشاشة وعرض رسالة خطأ.
مثال محلول خطوة بخطوة
لنفترض أن كلمة المرور التي ضُبطت في البداية هي 5456، وقام المستخدم بكتابة الأرقام التالية عبر لوحة المفاتيح: 5 ثم 4 ثم 5 ثم 6. إليك ما يحدث خطوة بخطوة في حلقة الفحص:
- في التكرار الأول، يقارن البرنامج الرقم المضغوط 5 مع الرقم المخزن في الموضع الأول وهو 5، النتيجة متطابقة ولا توجد مشكلة.
- في التكرار الثاني، يقارن البرنامج الرقم المضغوط 4 مع الرقم المخزن في الموضع الثاني وهو 4، النتيجة متطابقة ولا توجد مشكلة.
- في التكرار الثالث، يقارن البرنامج الرقم المضغوط 5 مع الرقم المخزن في الموضع الثالث وهو 5، النتيجة متطابقة ولا توجد مشكلة.
- في التكرار الرابع، يقارن البرنامج الرقم المضغوط 6 مع الرقم المخزن في الموضع الرابع وهو 6، النتيجة متطابقة. بما أن جميع الأرقام تطابقت، تبقى قيمة المتغير correctPass صحيحة أي true، وعليه ينتقل البرنامج لتنفيذ أمر الدالة servo.write(180) لفتح القفل وعرض رسالة نجاح على الشاشة.
أخطاء شائعة
- الاعتماد على متغير غير محدث بعد الخطأ؛ إذ يجب تغيير قيمة متغير التحقق إلى false بمجرد اكتشاف خطأ في أي خانة لضمان عدم اعتبار كلمة المرور صحيحة.
- نسيان مسح شاشة LCD قبل طباعة رسائل النجاح أو الخطأ، مما يؤدي إلى تداخل النصوص وظهور نتائج مضللة للمستخدم.
سؤالان للتدريب مع الإجابة
- السؤال الأول: لماذا نستخدم متغيراً من نوع bool مثل correctPass في برنامج القفل الذكي؟
- الإجابة: لتخزين معلومات تفيد بأن كلمة المرور صحيحة أو غير صحيحة، وتحديث هذه القيمة إلى false في حال وجود خطأ في أي مفتاح.
- السؤال الثاني: ماذا تفعل الدالة servo.write(180) في برنامج القفل الذكي؟
- الإجابة: تقوم بتدوير محرك سيرفو إلى زاوية 180 درجة لفتح الباب عندما تكون كلمة المرور المدخلة صحيحة.