اذهب إلى المحتوى

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

فكرة مشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino

تبدأ اللعبة بعرض الرقم 0 على شاشة العرض ذات الأجزاء السبع Seven Segment Display، ومن ثمة تنتظر حتى يُضغط مفتاح الضغط اللحظي Push Button الأول الخاص بتوليد الرقم العشوائي وعرضه سريعًا على الشاشة كجزء مساعد للمستخدم ليستطيع تخمين الرقم. وفي حال استمرار الضغط على المفتاح الأول، سيتغير الرقم كل 200 مللي ثانية.

بعد توليد الرقم العشوائي وتخمينه من قبل المستخدم، سيتمكن من إدخاله إلى اللعبة عبر مفتاح الضغط اللحظي Push Button الثاني من خلال الضغط المستمر عليه، فتبدأ الأرقام بالتزايد بدءًا من الرقم 0 وحتى الرقم 9، ويجب على اللاعب إزالة الضغط عن المفتاح عند الرقم الصحيح، مع إمكانية ضبط سرعة تغير الأرقام من خلال مقاومة متغيرة Potentiometer لتحديد مستوى صعوبة اللعبة.

في حال كان تخمين الرقم صحيحًا فإنه سيعرض الرقم الصحيح على شكل وميض مرتين بتأخير زمني لمدة نصف ثانية على الشاشة، ومن ثم ستعود اللعبة إلى البداية؛ أما إذا كان الرقم المخمن خاطئ فإن الرقم 0 سيعرض على شكل وميض مرتين بتأخير زمني لمدة نصف ثانية على الشاشة، ثم ستعود اللعبة إلى البداية لمحاولة تخمين الرقم مرةً أخرى أو لتوليد رقم عشوائي جديد. يوضح المخطط الحالي فكرة المشروع وطريقة تصميمه:

001 فكرة المشروع

العناصر المستخدمة لمشروع التحكم بألوان الإضاءة باستخدام الأردوينو Arduino

سنستخدم مجموعةً من العناصر الإلكترونية والأدوات وهي:

  • لوحة أردوينو أونو Arduino Uno
  • كابل البرمجة USB Cable
  • لوحة توصيل التجارب Breadboard
  • مفتاح الضغط اللحظي Push Button عدد 2
  • مقاومة إلكترونية بقيمة 220 أوم عدد 7
  • مقاومة متغيرة Potentiometer بقيمة 10 كيلو أوم
  • شاشة العرض ذات السبع أجزاء Seven Segment Display من نوع CC
  • مجموعة أسلاك توصيل من نوع Male to Male

شاشة العرض ذات السبع أجزاء Seven Segment Display

تستخدم شاشة العرض ذات الأجزاء السبع Seven Segment Display كثيرًا وفي عدة أجهزة وأدوات لعرض القيم الرقمية، مثل الساعات الرقمية الكبيرة وأجهزة عد النقود والميزان الإلكتروني.

تتميز هذه الشاشات ببساطة استخدامها وانخفاض ثمنها وسهولة قراءة القيم في جميع ظروف الإضاءة.

شاشة العرض ذات السبع أجزاء

تتكون شاشة العرض ذات السبع أجزاء Seven Segment Display من ثمانية ليدات LEDs، سبعة منها مخصصة لعرض الأرقام وتكون متوضعة ومرتبة على شكل رقم 8، بحيث يكون كل ليد على شكل خط صغير ويشكل جزءًا من الرقم، ولذلك سميت بشاشة العرض ذات السبع أجزاء Seven Segment، ومن خلال تشغيل الليدات المناسبة، يمكن استخدام هذه الشاشة لعرض الأرقام من 0 حتى 9 بالإضافة إلى بعض الأحرف الأبجدية مثل F ،E ،D ،C ،B ،A؛ أما اللِّيد الثامن فيكون على شكل نقطة ويستخدم في حالة عرض الأرقام العشرية.

002عرض الأرقام

أنواع شاشة العرض ذات السبع أجزاء Seven Segment Display

هناك نوعان من شاشة العرض ذات السبع أجزاء Seven Segment Display من حيث البنية:

الشاشات ذات المصاعد المشتركة Common Anode

يُعرف هذا النوع من الشاشات اختصارًا بالرمز CA، حيث توصل أقطاب المصاعد لجميع الليدات وهي القطب الموجب لكل ليد ببعضها في هذا النوع، ونتحكم في هذا النوع من الشاشات من خلال توصيل القطب المشترك مع قطب التغذية الموجب Vcc؛ أما القطب الأخر لليدات وهو القطب السالب لكل ليد تكون مرمزة أبجديًا DP ،F ،G ،D ،E ،C ،B ،A، وتوصل مع أقطاب الأردوينو ونعطيها إشارة LOW لتشغيلها أو HIGH لإطفائها.

003 ذات المصاعد المشتركة

ذات المهابط المشتركة Common Cathode

تعرف اختصارًا بالرمز CC، حيث توصل أقطاب المهابط السالبة لجميع الليدات ببعضها في هذا النوع، ونتحكم في هذا النوع من الشاشات من خلال توصيل القطب المشترك مع قطب التغذية السالب Gnd؛ أما القطب الأخر لليدات وهو القطب الموجب لكل ليد، فتكون مرمزة أبجديًا على النحو DP ،F ،G ،D ،E ،C ،B ،A وتوصل مع أقطاب الأردوينو وإعطائها إشارة HIGH لتشغيلها أو LOW لإطفائها.

004 ذات المهابط المشتركة

كما تتوفر عدة أنواع أخرى من شاشة العرض ذات السبع أجزاء Seven Segment Display من حيث ألوان الليدات وهي الأحمر والأخضر والأزرق، ويختلف حجم الشاشة أيضًا حسب الاستهلاك الأكبر، وحسب عدد الخانات التي سنستخدمها في مشاريع مستقبلية.

كيفية استخدام شاشة العرض ذات السبع أجزاء Seven Segment Display

نستطيع عرض الأرقام من خلال تشغيل بعض الليدات وإطفاء الأخرى على حسب الرقم المراد عرضه على الشاشة، فلعرض الرقم 0 مثلًا، سنحتاج لتشغيل جميع الليدات عدا اللِّيد ذي الرمز G؛ أما لعرض الرقم 1 فنحتاج لتشغيل اللِّيد B وC فقط، وهكذا بنفس الطريقة نستطيع عرض أي رقم من 0 وحتى 9 من خلال تغيير الليدات المضاءة فقط، والجدول الآتي يوضح الليدات التي يجب أن تضيء مع كل رقم:

005 جدول عرض الأرقام

تطبيق بسيط على شاشة العرض ذات السبع أجزاء Seven Segment Display

سنبني تطبيقًا بسيطًا لعرض بعض الأرقام من خلال لوحة الأردوينو Arduino وشاشة العرض ذات السبع أجزاء Seven Segment Display. ولتنفيذ هذا التطبيق سنتبع الخطوات التالية لتوصيل الشاشة مع لوحة الأردوينو:

  • نصل الرِّجل ذات الرمز A من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 2 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز B من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 3 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز C من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 4 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز D من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 5 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز E من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 6 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز F من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 7 في لوحة الأردوينو Arduino
  • نصل الرِّجل ذات الرمز G من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 8 في لوحة الأردوينو Arduino
  • نصل الرِّجل المشتركة CO من الشاشة مع القطب السالب GND في لوحة الأردوينو Arduino

توضح الصورة التالية مخطط التوصيل وأقطاب شاشة العرض ذات السبع أجزاء:

006 مخطط أقطاب الشاشة

الخطوة التالية هي كتابة الكود البرمجي للتطبيق. سنتعرف في البداية على مجموعة من الماكرو باستخدام تعليمات define# من أجل ربط أقطاب الشاشة مع لوحة الأردوينو، وداخل الدالة الرئيسية ()setup سنضبط هذه الأقطاب كأقطاب خرج OUTPUT من خلال الدالة المدمجة ()pinMode التي تأخذ وسيطين: الأول رقم القطب والثاني نوع القطب إما بخرج OUTPUT أو دخل INPUT؛ أما في الدالة التكرارية ()loop فسنشغل بعض الليدات للحصول على الرقم المطلوب، وقد اخترنا الرقم 1، لتشغيل اللِّيد B واللِّيد C، ويمكن تعديل تشغيل وإطفاء الليدات حسب الجدول السابق للحصول على الرقم الذي تريده؛ كما يمكن أن نتحكم بتشغيل وإطفاء الأقطاب الرقمية من خلال الدالة المدمجة ()digitalWrite التي تأخذ وسيطين هما رقم القطب، وحالة أو قيمة القطب من خلال إعطاءه قيمة 1 منطقي أو HIGH للتشغيل و 0 منطقي أو LOW للإطفاء.

#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8

void  setup()  {
pinMode(a,  OUTPUT);
pinMode(b,  OUTPUT);
pinMode(c,  OUTPUT);
pinMode(d,  OUTPUT);
pinMode(e,  OUTPUT);
pinMode(f,  OUTPUT);
pinMode(g,  OUTPUT);
}

void  loop()  {
digitalWrite(a,  LOW);
digitalWrite(b,  HIGH);
digitalWrite(c,  HIGH);
digitalWrite(d,  LOW);
digitalWrite(e,  LOW);
digitalWrite(f,  LOW);
digitalWrite(g,  LOW);
}

ملاحظة: الكود السابق خاص بالشاشة من نوع مهابط مشتركة CC، لذا في حال كانت الشاشة من نوع المصاعد المشتركة CA، فيكفي أن نعكس أوامر التشغيل والإيقاف فقط، بحيث تصبح بالشكل التالي:

digitalWrite(a,  HIGH);
digitalWrite(b,  LOW);
digitalWrite(c,  LOW);
digitalWrite(d,  HIGH);
digitalWrite(e,  HIGH);
digitalWrite(f,  HIGH);
digitalWrite(g,  HIGH);

ولمعرفة نوع الشاشة التي لدينا يمكن استخدام جهاز القياس المتعدد Multimeter في وضع فحص الليد

007 وضع فحص الليد

ونجرب وصل القطب المشترك CO للشاشة الموجود في المنتصف مع الطرف الموجب الأحمر للمقياس، وإحدى الأقطاب الأخرى للشاشة نوصلها مع الطرف الأسود السالب للمقياس. وهنا في حال إضاءة جزء من الشاشة تكون من نوع مصاعد مشتركة Common Anode أو CA.

008 نوع مصاعد مشتركة

بعد ذلك، سنوصل القطب المشترك الموجود بالمنتصف CO للشاشة مع الطرف الأسود السالب للمقياس، وإحدى الأقطاب الأخرى للشاشة نوصلها مع الطرف الأحمر الموجب للمقياس، وهنا في حال إضاءة جزء من الشاشة، ستكون من نوع مهابط مشتركة Common cathode أو CC.

009 نوع مهابط مشتركة

مخطط التوصيل لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino

سنتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino لتنفيذ فكرة المشروع

  • نصل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard
  • نثبت شاشة العرض ذات السبع أجزاء Seven Segment Display على لوحة توصيل التجارب BreadBoard
  • نصل أقطاب الشاشة مع المقاومات الإلكترونية ولوحة الأردوينو Arduino بنفس الخطوات التي نفذناها في التطبيق السابق
  • نصل رجل التغذية الأولى Vcc للمقاومة المتغيرة Potentiometer مع المسرى الموجب في لوحة توصيل التجارب BreadBoard
  • نصل رجل التغذية الأخرى Gnd للمقاومة المتغيرة Potentiometer مع المسرى السالب في لوحة توصيل التجارب BreadBoard
  • نصل رجل إشارة الخرج التشابهي Sig للمقاومة المتغيرة Potentiometer مع القطب A5 في لوحة الأردوينو أونو Arduino Uno
  • وصل الطرف الأول لجميع مفاتيح الضغط اللحظية Push Buttons مع المسرى السالب للوحة التجارب BreadBoard
  • وصل الطرف الثاني للمفتاح الأول مع القطب رقم 9، والطرف الثاني للمفتاح الثاني مع القطب رقم 10 في لوحة الأردوينو أونو Arduino Uno

وبهذا سنُفعّل مقاومة الرفع الداخلية للمتحكم الموجود في لوحة الأردوينو Arduino برمجيًا؛ لذلك لا داعي لتوصيل مقاومات رفع Pull-Up أو مقاومات خفض Pull-Down مع مفاتيح الضغط اللحظية Push Buttons.

توضح الصورة التالية مخطط التوصيل لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino:

010 مخطط توصيل المشروع التاسع

الكود البرمجي لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino

سنعرف اثنين من الماكرو في بداية الكود خاصة بأرقام الأقطاب الرقمية لمفاتيح الضغط اللحظية Push Button ورقم القطب التشابهي الخاص بالمقاومة المتغيرة Potentiometer.

#define guessButtonPin 9
#define SetButtonPin 10
#define POT A5

شرحنا سابقًا كيفية استخدام الماكرو في مقال تخمين عدد مرات وميض اللِّيد باستخدام الأردوينو Arduino، كما يمكن الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C؛ أما بالنسبة لأرقام الأقطاب الرقمية الخاصة بشاشة العرض ذات السبع أجزاء، فسنعرفها ضمن مصفوفة أحادية من نوع أعداد صحيحة int وبداخلها أرقام أقطاب الشاشة بالترتيب.

const  int displayPins[7]  =  {2,  3,  4,  5,  6,  7,  8};

سنحتاج أيضًا لتعريف ثلاثة متغيرات صحيحة EstimatedNumber لتخزين الرقم المخمن، وnumberToGuess لتخزين الرقم المراد تخمينه، وspeed لتخزين مستوى السرعة عند إدخال الرقم المخمن.

int EstimatedNumber =  0;
int numberToGuess =  1;
int speed = 0;

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

سنعرف داخل هذه الدالة مصفوفة من نوع بايت byte بحجم 10 عناصر لأنه لدينا عشرة أرقام من الرقم 0 إلى الرقم 9، وبداخل هذه المصفوفة سنكتب القيم الخاصة بتشغيل وإطفاء ليدات الشاشة بالنظام الثنائي Binary System بنفس قيم الجدول السابق، وبعد ذلك سنستخدم حلقةً تكراريةً ()for للمرور على جميع عناصر المصفوفة []displayPins التي تخزن أرقام أقطاب الشاشة وإعطاء أمر التشغيل أو الإطفاء المقابل للقطب من خلال المصفوفة []numbers باستخدام الدالة المدمجة ()digitalWrite.

وللوصول الصحيح للقيمة المقابلة لكل قطب من الشاشة سنستخدم الدالة المدمجة ()bitRead التي تأخذ وسيطين هما الرقم الذي نريد قراءة بت واحد منه، ورقم البت حيث يبدأ من الرقم 0 للبت الأول من اليمين؛ وتعيد هذه الدالة قيمة هذا البت 1 أو 0.

void displayNumber(int num) {
  const byte numbers[10] = {
    0B0111111, // 0
    0B0000110, // 1
    0B1011011, // 2
    0B1001111, // 3
    0B1100110, // 4
    0B1101101, // 5
    0B1111101, // 6
    0B0000111, // 7
    0B1111111, // 8
    0B1101111  // 9
  };

  for (int i = 0; i < 7; i++) {
    digitalWrite(displayPins[i], bitRead(numbers[num], i));
  }
}

سنحتاج أيضًا إلى دالة خاصة أخرى ()displayOFF وظيفتها إطفاء الشاشة وعدم عرض أي رقم، وذلك من خلال حلقة تكرارية ()for للمرور على جميع عناصر المصفوفة []displayPins التي تخزن أرقام أقطاب الشاشة، وإطفائها من خلال الدالة المدمجة ()digitalWrite .

void displayOFF() {
  for (int i = 0; i < 7; i++) {
    digitalWrite(displayPins[i], LOW);
  }
}

في الدالة الرئيسية ()setup سنضبط الأقطاب الخاصة بالمفاتيح اللحظية Push Button كأقطاب دخل مع تفعيل مقاومة الرفع الداخلية INPUT_PULLUP، والأقطاب الخاصة بالشاشة كأقطاب خرج OUTPUT، وذلك من خلال الدالة المدمجة ()pinMode، بعدها سنعرض الرقم 0 على الشاشة من خلال استدعاء الدالة الخاصة ()displayNumber وتمرير الرقم 0 كوسيط لها.

void setup() {
  pinMode(guessButtonPin, INPUT_PULLUP);
  pinMode(SetButtonPin, INPUT_PULLUP);
  for (int i = 0; i < 7; i++) {
    pinMode(displayPins[i], OUTPUT);
  }
  displayNumber(0);
}

في بداية الدالة التكرارية ()loop سنقرأ قيمة المقاومة المتغيرة Potentiometer عبر الدالة المدمجة ()analogRead التي تأخذ وسيطًا واحدًا Pin وهو رقم القطب الموصول عليه العنصر التشابهي، من A0 إلى A5 في لوحة الأردوينو أونو Arduino Uno. تعيد هذه الدالة قيمةً عدديةً صحيحةً ضمن المجال من 0 إلى 1023، وتمثل القيمة الرقمية المقابلة لقيمة الجهد الموصول على القطب المحدد Pin، وسنخزن هذه القيمة في المتغير speed ثم نغير مجال القيم من 0-1023 إلى المجال 100-500، من خلال الدالة المدمجة ()map التي تأخذ خمسة وسطاء كالآتي:

  1. قيمة المتغير الذي نريد تحويله
  2. الوسيط الثاني لمجال القيم القديم الذي نريد التحويل منه
  3. الوسيط الثالث لمجال القيم القديم الذي نريد التحويل منه 4.الوسيط الرابع لمجال القيم الجديد الذي نريد التحويل إليه
  4. الوسيط الخامس لمجال القيم القديم الذي نريد التحويل منه
void loop() {
  speed= analogRead(POT);
  speed = map(speed, 0, 1024, 100, 500);

بعد ذلك سنتحقق من حالة المفتاح اللحظي الأول المسؤول عن توليد رقم عشوائي لتخمينه من خلال العبارة الشرطية ()if، وفي حال كان هذا المفتاح مضغوطًا فسنولد رقمًا عشوائيًا باستخدام الدالة المدمجة ()random التي تأخذ وسيطين هما:

  1. الوسيط الأقل قيمة، وتكون ضمن المجال
  2. الوسيط الأكبر قيمة وتكون خارج المجال

تعيد هذه الدالة قيمة عشوائية سنخزنها في المتغير numberToGuess، وسنعرض هذا الرقم على الشاشة بسرعة، وفي حال استمرار الضغط على المفتاح أكثر من 200 مللي ثانية سيولّد رقمًا عشوائيًا جديدًا.

  if (digitalRead(SetButtonPin) == LOW) {
    numberToGuess = random(0, 10);
    displayNumber(numberToGuess);
    delay(500);
  }

الآن أصبح الرقم المراد تخمينه مخزنًا في المتغير numberToGuess ضمن ذاكرة الأردوينو، وبانتظار الضغط على المفتاح اللحظي الثاني لإدخال الرقم المخمن؛ بالتالي سنتحقق برمجيًا من حالة المفتاح الثاني المسؤول عن إدخال الرقم المخمن من خلال العبارة الشرطية ()if؛ وفي حال كان مضغوطًا، سنزيد قيمة المتغير EstimatedNumber بمقدار 1؛ أما في حال أصبح أكبر من الرقم 9، فسنعيد قيمته إلى الصفر، ومن ثم نعرض الرقم على الشاشة ونضع تأخير زمني بمقدار قيمة المتغير speed من خلال من خلال الدالة ()delay.

  if (digitalRead(guessButtonPin) == LOW) {
    EstimatedNumber++;
    if (EstimatedNumber  > 9) EstimatedNumber = 0;
    displayNumber(EstimatedNumber);
    delay(speed);
    displayNumber(0);
  }

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

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

  else if ((digitalRead(guessButtonPin) == HIGH) && (EstimatedNumber != 0)) {
    if (EstimatedNumber == numberToGuess) {
     EstimatedNumber = 0;
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    } 
    else {
     EstimatedNumber = 0;
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    }
  }

الكود البرمجي النهائي لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino

سنعرض الآن الكود البرمجي النهائي للعبة تخمين الأرقام التي عملنا عليها:

#define guessButtonPin 9
#define SetButtonPin 10
#define POT A5

const int displayPins[7]  =  {2,  3,  4,  5,  6,  7,  8};

int EstimatedNumber = 0;
int numberToGuess = 1; 
int speed = 0;


void displayNumber(int num) {
  const byte numbers[10] = {
    0B0111111, // 0
    0B0000110, // 1
    0B1011011, // 2
    0B1001111, // 3
    0B1100110, // 4
    0B1101101, // 5
    0B1111101, // 6
    0B0000111, // 7
    0B1111111, // 8
    0B1101111  // 9
  };

  for (int i = 0; i < 7; i++) {
    digitalWrite(displayPins[i], bitRead(numbers[num], i));
  }
}

void displayOFF() {
  for (int i = 0; i < 7; i++) {
    digitalWrite(displayPins[i], LOW);
  }
}

void setup() {
  pinMode(guessButtonPin, INPUT_PULLUP);
  pinMode(SetButtonPin, INPUT_PULLUP);
  for (int i = 0; i < 7; i++) {
    pinMode(displayPins[i], OUTPUT);
  }
  displayNumber(0);
}

void loop() {
  speed= analogRead(A5);
  speed = map(speed, 0, 1024, 100, 500);

  if (digitalRead(SetButtonPin) == LOW) {
    numberToGuess = random(0, 10);
    displayNumber(numberToGuess);
    delay(200);
    displayNumber(0);
  }


  if (digitalRead(guessButtonPin) == LOW) {
    EstimatedNumber++;
    if (EstimatedNumber  > 9) EstimatedNumber = 0;
    displayNumber(EstimatedNumber);
    delay((speed));
    displayNumber(0);
  }

  else if ((digitalRead(guessButtonPin) == HIGH) && (EstimatedNumber != 0)) {
    if (EstimatedNumber == numberToGuess) {
     EstimatedNumber = 0;
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    } 
    else {
     EstimatedNumber = 0;
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    }
  }
}

محاكاة لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino

سنتبع نفس الخطوات التي تعلمناها في مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino للوصول للصفحة الخاصة بمحاكاة المشروع على موقع وكوي Wokwi.

011 الصفحة الخاصة بمحاكاة المشروع

بعد ذلك سنضيف العناصر الإلكترونية اللازمة للمشروع وهي كل من Seven Segment و Potentiometer و Push Button و Resistors و BreadBoard.

012 إضافة العناصر في موقع وكوي

سنغيّر قيم مقاومات الشاشة إلى 220 أوم من خلال الضغط عليها، وستظهر لنا نافذة في الأعلى تمكننا من تغيير القيمة والواحدة.

013 تغيير قيمة المقاومة

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

014 تغير نوع الشاشة ولونها

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

بعد الانتهاء من كل شيء لا بد من التأكد من كتابة الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة ونلاحظ الآتي:

  1. عند بداية اللعبة سيعرض الرقم 0 على الشاشة. وهنا علينا انتظار ضغط اللعبة على المفتاح اللحظي الأول Push Button الأول لتوليد رقم عشوائي لتخمينه
  2. عند استمرار الضغط على المفتاح الأول لمدة تزيد عن 200 مللي ثانية سيتولد رقم عشوائي جديد مع عرض هذا الرقم على الشاشة بسرعة
  3. بعد توليد رقم عشوائي وتخمينه، سنضغط على المفتاح اللحظي Push Button الثاني باستمرار لإدخال الرقم المخمن إلى اللعبة، وسيبدأ من الرقم 0 ويزداد كل فترة زمنية تحدد من خلال المقاومة المتغيرة، وعند الوصول للرقم الذي نريده، سنتوقف عن الضغط عن المفتاح
  4. في حال كان الرقم المخمن صحيح سيعرض على الشاشة على شكل وميض مرتين كل ثانية وإذا كان خاطئ سيعرض الرقم 0 على الشاشة على شكل وميض مرتين كل ثانية
  5. في النهاية ستعود اللعبة إلى البداية ويعرض الرقم 0 على الشاشة إلى أن يضغط المفتاح الأول لتوليد رقم عشوائي جديد أو أن يضغط المفتاح الثاني لتخمين الرقم السابق مرةً أخرى.

015 النتيجة النهائية للمشروع التاسع

الخاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...