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

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

فكرة مشروع إضاءة زينة بأنماط مختلفة بأردوينو

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

العناصر المستخدمة لمشروع إضاءة زينة

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

  • لوحة أردوينو أونو Arduino Uno
  • كابل البرمجة USB Cable
  • لوحة توصيل التجارب Breadboard
  • ليد اصفر Yellow LED عدد 1
  • ليد أحمر Red LED عدد 8
  • مفتاح من نوع Push Button عدد 1
  • مقاومة بقيمة 220 أوم عدد 9
  • مجموعة أسلاك توصيل من نوع Male to Male

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

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

  • صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل.
  • قم بتوصيل الأرجل القصيرة، التي تمثل الأطراف السالبة لجميع الليدات، معًا في نقطة مشتركة، ثم اربط الرجل القصيرة لإحدى الليدات بالمسرى السالب GND على لوحة توصيل التجارب BreadBoard
  • صل الرجل الأطول التي تمثل الطرف الموجب لكل ليد من الليدات الحمراء مع الرجل الأولى للمقاومة ذات القيمة 220 أوم الخاصة بكل ليد، وصل الرجل الأخرى للمقاومة مع أقطاب لوحة الأردوينو أونو Arduino Uno بالترتيب بدءًا من القطب رقم 3 لمقاومة الليد الأول وحتى القطب رقم 9 لمقاومة الليد الثامن
  • صل الرجل القصيرة التي تمثل الطرف السالب لليد الأصفر مع المسرى السالب في لوحة توصيل التجارب BreadBoard أو مع إحدى الأرجل القصيرة لليدات الأخرى
  • صل الرجل الأطول التي تمثل الطرف الموجب لليد الأصفر مع الرجل الأولى للمقاومة ذات القيمة 220 أوم الخاصة بالليد الأصفر، ثم الرجل الأخرى للمقاومة مع القطب رقم 12 في لوحة الأردوينو أونو Arduino Uno
  • صل الطرف الأول لمفتاح الضغط اللحظي Push Button مع المسرى السالب للوحة التجارب ثم صل الطرف الثاني للمفتاح مع القطب رقم 2 في لوحة الأردوينو أونو Arduino Uno.
  • سنفعّل مقاومة الرفع الداخلية للقطب رقم 2 في المتحكم الموجود في لوحة الأردوينو Arduino برمجيًا لذلك لا داعي لتوصيل مقاومة رفع Pull-Up أو مقاومة خفض Pull-Down مع مفتاح الضغط اللحظي Push Button.

توضح الصورة الآتية مخطط توصيل المشروع

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

الكود البرمجي لمشروع إضاءة زينة بأنماط مختلفة

كما رأينا في فقرة مخطط التوصيل، سيوصَّل المفتاح اللحظي مع القطب رقم 2، ويوصَّل الليد الأصفر مع القطب رقم 12، أما الليدات ذات اللون الأحمر فستوصَّل مع الأقطاب من رقم 3 وحتى القطب رقم 10 بالترتيب مع لوحة الأردوينو أونو Arduino Uno .

لذا سنعرف في بداية الكود عدد من الماكرو من نوع define# والتي ستخصص لأرقام الأقطاب لكل من الليد الأصفر والليدات ذات اللون الأحمر والمفتاح، وشرحنا كيفية استخدام الماكرو في مقال سابق في هذه السلسلة يمكنك الرجوع إليه من خلال تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino كما يمكنك الاطلاع أكثر على الماكرو وأنواعه من خلال مقال الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C.

#define BTN_PIN 2
#define YELLOW_LED 12

#define RED_LED_ONE 3
#define RED_LED_TWO 4
#define RED_LED_THREE 5
#define RED_LED_FOUR 6
#define RED_LED_FIVE 7
#define RED_LED_SIX 8
#define RED_LED_SEVEN 9
#define RED_LED_EIGHT 10

سنحتاج أيضًا لتعريف متغير من نوع int خاص بتخزين رقم النمط الذي سيحدد طريقة عمل الليدات وكما ذكرنا سابقًا أنه لدينا خمسة أنماط مختلفة

int LEDs_Style= 0;

سنضبط الأقطاب المستخدمة في المشروع في الدالة الرئيسية ()setup من خلال الدالة المدمجة ()pinMode التي تأخذ وسيطين الأول رقم القطب الذي خُزّن في الماكرو، والثاني نوع القطب إما خرج OUTPUT وإما دخل INPUT وإما دخل مع مقاومة رفع خارجية INPUT_PULLUP، حيث أن قطب المفتاح BTN_PIN سيكون قطب دخل مع تفعيل مقاومة رفع داخلية INPUT_PULLUP أما قطب الليد الأصفر YELLOW_LED وأقطاب الليدات الحمراء RED_LED_x ستكون أقطاب خرج OUTPUT

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(RED_LED_ONE, OUTPUT);
  pinMode(RED_LED_TWO, OUTPUT);
  pinMode(RED_LED_THREE, OUTPUT);
  pinMode(RED_LED_FOUR, OUTPUT);
  pinMode(RED_LED_FIVE, OUTPUT);
  pinMode(RED_LED_SIX, OUTPUT);
  pinMode(RED_LED_SEVEN, OUTPUT);
  pinMode(RED_LED_EIGHT, OUTPUT);
}

نلاحظ أن التعامل مع الليدات الحمراء بهذه الطريقة أي إعطاء الأمر الخاص بكل ليد بشكل منفصل صعب ويتطلب الكثير من الأكواد البرمجية؛ لذلك سنستبدل جميع الماكرو الخاصة بأقطاب هذه الليدات بمصفوفة أحادية []LEDs_PINs نخزن فيها أرقام الأقطاب بالترتيب، وستكون المصفوفة من نوع const int فأرقام الأقطاب أعداد صحيحة وثابتة لن يتم التعديل عليها أثناء تنفيذ الكود وهي تحتوي ثمانية عناصر بعدد الليدات الحمراء، وسنستخدم الحلقة التكرارية ()for للمرور على جميع عناصر المصفوفة []LEDs_PINs وإعطائها الأمر الخاص لكل عنصر من المصفوفة لكل قطب.

const int LEDs_PINs[8] = {3, 4, 5, 6, 7, 8, 9, 10};

سنستخدم في هذه الحالة حلقة تكرارية ()for تبدأ من الرقم 0 لأن رقم العنصر الأول في المصفوفة دائمًا صفر وتنتهي عند الرقم 7 لأن رقم العنصر الأخير في المصفوفة يساوي دائمًا عدد عناصر المصفوفة مطروحًا منه واحد، تمر هذه الحلقة التكرارية على جميع عناصر المصفوفة []LEDs_PINs وتضبطها كأقطاب خرج من خلال الدالة المدمجة ()pinMode وسيمرر الوسيط الأول الخاص برقم القطب بدلالة اسم المصفوفة مع رقم العنصر، أما الوسيط الثاني سيكون OUTPUT لأننا نريد ضبطها كأقطاب خرج، ليصبح محتوى الدالة الرئيسية ()setup بالشكل الآتي:

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(YELLOW_LED, OUTPUT);
  for (int i = 0; i <= 7; i++) {
    pinMode(LEDs_PINs[i], OUTPUT);
  }

}

سنكتب الكود الخاص بكل نمط في دالة خاصة به ومن ثم سننتقل إلى الكود الخاص بالدالة التكرارية ()loop ومعرفة كيفية استدعاء هذه الدوال الخاصة والتنقل بين الأنماط من خلال المفتاح BTN_PIN.

تحقيق دالة إطفاء الليد

سنكتب دالة خاصة في البداية باسم ()RESET_PINs لتطفئ جميع الليدات عند استدعائها، فعند الانتقال من نمط إلى آخر نريد أن تكون الحالة الافتراضية لجميع الليدات مطفئة لذا سنستدعي هذه الدالة بداية كل نمط، نكتب بداخل الدالة حلقة تكرارية ()for تمر على جميع عناصر المصفوفة []LEDs_PINs وتعطي أمر الإطفاء لكل عنصر فيها من خلال الدالة المدمجة ()digitalWrite التي تأخذ وسيطين: الأول رقم القطب ويحدد من خلال رقم عنصر المصفوفة المماثل لقيمة المتغير الخاص بالحلقة التكرارية i، والثاني حالة القطب وهي 1 منطقي أو HIGH للتشغيل، أو 0 منطقي أو LOW للإطفاء وبما أننا نريد إطفاء جميع الليدات سنعطيها القيمة LOW على النحو التالي:

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

تحقيق أنماط الإضاءة

النمط الأول RIGHT_TO_LEFT

النمط الأول

سنحقق النمط الأول بالدالة ()RIGHT_TO_LEFT لإضاءة جميع الليدات بشكل متتالي من اليمين إلى اليسار مع الحفاظ على إضاءة الليدات السابقة. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة ()RESET_PINs التي عرفناها في الفقرة السابقة. ثم تبدأ إضاءة الليد الأول الموصول مع القطب رقم 3، ومن ثم الانتظار 250 مللي ثانية، ثم إضاءة الليد الثاني الموصول مع القطب رقم 4، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.

سنستخدم الحلقة التكرارية ()for للمرور على جميع عناصر المصفوفة []LEDs_PINs بدءًا من العنصر الأول i=0 حتى الأخيرi=7، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية i من خلال الدالة المدمجة ()digitalWrite، أما لتحقيق التأخير الزمني بين إضاءة الليدات سنستخدم الدالة المدمجة ()delay وإعطاءها القيمة 250 مللي ثانية.

void RIGHT_TO_LEFT() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    digitalWrite(LEDs_PINs[i], HIGH);
    delay(250);
  }
}

النمط الثاني LEFT_TO_RIGTHT

النمط الثاني

سنحقق النمط الثاني بالدالة ()LEFT_TO_RIGTHT لإضاءة جميع الليدات بشكل متتالي من اليسار إلى اليمين مع الحفاظ على إضاءة الليدات السابقة. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة ()RESET_PINs، ثم يضيء الليد الثامن الموصول مع القطب رقم 10، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد السابق أي الليد السابع الموصول مع القطب رقم 9، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الأول الموصول مع القطب رقم

يشبه الكود البرمجي لهذا النمط النمط السابق مع اختلاف بسيط وهو أن الحلقة التكرارية ()for تمر على جميع عناصر المصفوفة []LEDs_PINs بدءًا من العنصر الأخير j=7 وحتى العنصر الأول j=0، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة المدمجة ()digitalWrite، أما لتحقيق التأخير الزمني نستخدم الدالة المدمجة ()delay كما في النمط السابق.

void LEFT_TO_RIGTHT() {
  RESET_PINs();
  for (int j = 7; j >= 0; j--) {
    digitalWrite(LEDs_PINs[j], HIGH);
    delay(250);
  }
}

النمط الثالث GO_AND_BACK

النمط الثالث

سنحقق النمط الثالث بالدالة ()GO_AND_BACK لإضاءة جميع الليدات بشكل متتالي من اليمين إلى اليسار ومن ثم إطفاء الليدات بشكل متتالي من اليسار إلى اليمين. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة ()RESET_PINs ، ثم يضيء الليد الأول الموصول مع القطب رقم 3، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد الذي يليه وهو الليد الثاني الموصول مع القطب رقم 4، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.

بعد الانتهاء من تشغيل جميع الليدات ينطفئ الليد الثامن الموصول مع القطب رقم 10، ومن ثم الانتظار لمدة 250 مللي ثانية ، ثم إطفاء الليد السابق وأي الليد السابع الموصول مع القطب رقم 9، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تنطفئ الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الأول الموصول مع القطب رقم 3. سنستخدم الحلقة التكرارية ()for للمرور على جميع عناصر المصفوفة []LEDs_PINs، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة ()digitalWrite. وسنستخدم الحلقة التكرارية الثانية ()for للمرور على جميع عناصر المصفوفة []LEDs_PINs بدءًا من العنصر الأخير j=7 وحتى العنصر الأول j=0، وإعطاء أمر الإطفاء لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة المدمجة ()digitalWrite، وسنستخدم الدالة المدمجة ()delay لتحقيق التأخير الزمني بين إضاءة الليدات وإعطاءها القيمة 250 مللي ثانية.

void GO_AND_BACK() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    digitalWrite(LEDs_PINs[i], HIGH);
    delay(250);
  }
  for (int j = 7; j >= 0; j--) {
    digitalWrite(LEDs_PINs[j], LOW);
    delay(250);
  }
}

النمط الرابع LED_BY_LED

النمط الرابع

سنحقق النمط الرابع بالدالة ()LED_BY_LED لإضاءة الليدات بشكل متتالي من اليمين إلى اليسار بدون الحفاظ على إضاءة الليدات السابقة. يشبه النمط الأول في تسلسل الإضاءة ولكن مع اختلاف بسيط أن الليدات السابقة ستنطفئ عند إضاءة الليد التالي، حيث يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة ()RESET_PINs التي كتبناها سابقًا ضمن الكود البرمجي، ثم يضيء الليد الأول الموصول مع القطب رقم 3 وإطفاء جميع الليدات الأخرى، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد الثاني الموصول مع القطب رقم 4 وإطفاء جميع الليدات الأخرى، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بشكل مستقل عن الليدات الأخرى وبالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.

نلاحظ من الصورة السابقة أن لدينا ثمانية مراحل في كل مرحلة سيضىء الليد المطابق لرقم المرحلة فمثلًا عند المرحلة الخامسة i=4 سيضيء الليد الخامس j=4 لذلك يمكننا استخدام حلقتين تكراريتين ()for متداخلتين، الأولى للمرور على جميع المراحل بدءًا من i=0 وحتى i=7، أما الحلقة الثانية فهي للمرور على جميع عناصر المصفوفة []LEDs_PINs بدءًا من العنصر الأول j=0 وحتى العنصر الثامن j=7، ومن خلال استخدام الشرط i==j سنتحقق من تطابق رقم الحالة مع رقم الليد فإذا تحقق الشرط يعطى أمر التشغيل لعنصر المصفوفة، وإذا لم يتحقق يعطى أمر الإطفاء.

void LED_BY_LED() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++) {
      if (i == j) {
        digitalWrite(LEDs_PINs[j], HIGH);
      }
      else {
        digitalWrite(LEDs_PINs[j], LOW);
      }
    }
    delay(250);
  }
}

النمط الخامس CUSTOM MODE

النمط الخامس

سنحقق النمط الخامس بالدالة CUSTOM_MODE لتشغيل الليدات وإطفاءها وفق تسلسل خاص على شكل ستارة إلكترونية. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة ()RESET_PINs التي كتبناها سابقًا ضمن الكود البرمجي، ومن ثم ستعمل الليدات وفق تسلسل خاص مشابه لفكرة الإضاءة على شكل ستارة إلكترونية، تبدأ بإضاءة ليد واحد من كل جهة ليد من اليمين وليد آخر من اليسار، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة ليد آخر من كل جهة، وهكذا إلى أن تضاء جميع الليدات، بعدها نعمل بشكل معاكس من خلال إطفاء الليدين من المنتصف، ومن ثم الانتظار لمدة 250 مللي ثانية وهكذا إلى أن تنطفئ جميع الليدات.

نحدد طريقة إضاءة الليدات في هذا النمط من خلال تعريف مصفوفة ثنائية [][]Custom_Mode من نوع const int تحتوي على شكل الإضاءة في كل مرحلة، وذلك من خلال تحديد الليدات المضاءة والليدات المطفئة، نضع 1 منطقي مكان الليد الذي سيضيء و 0 منطقي مكان الليد الذي سينطفئ، وكما نعرف أن المصفوفة الثنائية تحتوي على أسطر وأعمدة، ولتحديد حجم المصفوفة يجب أن يكون عدد الأسطر بعدد المراحل التي ستضيء وتنطفئ فيها الليدات وفي حالتنا هذه لدينا ثمانية مراحل بالتالي ثمانية أسطر كما هو موضح بالشكل السابق، أما عدد أعمدة المصفوفة فيجب أن يكون بعدد الليدات التي لدينا وفي حالتنا هذه لدينا ثمانية ليدات بالتالي ثمانية أعمدة.

سنستخدم حلقتين تكراريتين ()for الأولى للمرور على جميع أسطر المصفوفة والثانية للمرور على جميع أعمدتها وسنستخدمها أيضًا للوصول إلى أرقام الليدات المخزنة ضمن المصفوفة []LEDs_PINs، نعطي أمر التشغيل أو الإيقاف الخاص بكل ليد من خلال المصفوفة [][]Custom_Mode باستخدام الدالة ()digitalWrite، ونحقق التأخير الزمني بين إضاءة الليدات باستخدام الدالة ()delay.

void CUSTOM_MODE() {
  RESET_PINs();
  const int customMode[8][8] {
    {1, 0, 0, 0, 0, 0, 0, 1},
    {1, 1, 0, 0, 0, 0, 1, 1},
    {1, 1, 1, 0, 0, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 0, 0, 1, 1, 1},
    {1, 1, 0, 0, 0, 0, 1, 1},
    {1, 0, 0, 0, 0, 0, 0, 1},
    {0, 0, 0, 0, 0, 0, 0, 0},
  };
  for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++) {
      digitalWrite(LEDs_PINs[j], customMode[i][j]);
    }
    delay(250);
  }
}

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

التبديل بين الأنماط باستخدام المفتاح التكراري

سنبدل بين الأنماط ضمن الدالة التكرارية ()loop والتي سنعرف بداخلها متغير BTN_STAT من نوع int يخزن فيه حالة المفتاح الموصول على القطب BTN_PIN، ونقرأ حالته بالدالة ()digitalRead التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، وبما أن المفتاح موصول مع مقاومة رفع داخلية ستكون قيمة القطب LOW أو 0 منطقي في حالة الضغط على المفتاح وHIGH أو 1 منطقي عند إزالة الضغط عن المفتاح.

وبعد ذلك سنتحقق من حالة المفتاح في حال كان مضغوط سنزيد قيمة LEDs_Style، ونستخدم عبارة شرطية لفحص قيمة النمط LEDs_Style في حال أصبحت أكبر من عدد الأنماط 4 سنرجع إلى النمط الأول، ونعطي أمر لتشغيل الليد الأصفر الذي يشير إلى أن المفتاح ضُغِط وعلينا الانتقال للنمط التالي والانتظار ثلاث ثواني وإعطاء أمر آخر لإطفاء الليد الأصفر.

void loop(){
  int BTN_STAT = digitalRead(BTN_PIN);
  if (BTN_STAT == 0) {
    LEDs_Style++;
    if (LEDs_Style > 4) {
      LEDs_Style= 0;
    }
    digitalWrite(YELLOW_LED, HIGH);
    delay(3000);
    digitalWrite(YELLOW_LED, LOW);
  }

بعد تحديد قيمة النمط، تُستخدم العبارة الشرطية ()Switch لاستدعاء الدالة المطابقة لقيمة المتغير LEDs_Style وتنفيذ النمط المرتبط لكل حالة من 0 إلى 4 من خلال الدالة الخاصة به مع إنهاء التنفيذ بـ break لتجنب فحص باقي الحالات.

 switch (COUNTER) {
    case 0:
      RIGHT_TO_LEFT();
      break;
    case 1:
      LEFT_TO_RIGTHT();
      break;
    case 2:
      GO_AND_BACK();
      break;
    case 3:
      LED_BY_LED();
      break;
    case 4    :
      CUSTOM_MODE();
      break;
    default:
      break;
  }
}

الكود البرمجي النهائي لمشروع إضاءة زينة بأنماط مختلفة باستخدام أردوينو

#define BTN_PIN 2
#define YELLOW_LED 12

const int LEDs_PINs[8] = {3, 4, 5, 6, 7, 8, 9, 10};
int LEDs_Style = 0;

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

void RIGHT_TO_LEFT() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    digitalWrite(LEDs_PINs[i], HIGH);
    delay(250);
  }
}

void LEFT_TO_RIGTHT() {
  RESET_PINs();
  for (int j = 7; j >= 0; j--) {
    digitalWrite(LEDs_PINs[j], HIGH);
    delay(250);
  }
}

void GO_AND_BACK() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    digitalWrite(LEDs_PINs[i], HIGH);
    delay(250);
  }
  for (int j = 7; j >= 0; j--) {
    digitalWrite(LEDs_PINs[j], LOW);
    delay(250);
  }
}

void LED_BY_LED() {
  RESET_PINs();
  for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++) {
      if (i == j) {
        digitalWrite(LEDs_PINs[j], HIGH);
      }
      else {
        digitalWrite(LEDs_PINs[j], LOW);
      }
    }
    delay(250);
  }
}

void CUSTOM_MODE() {
  RESET_PINs();
  const int customMode[8][8] {
    {1, 0, 0, 0, 0, 0, 0, 1},
    {1, 1, 0, 0, 0, 0, 1, 1},
    {1, 1, 1, 0, 0, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 0, 0, 1, 1, 1},
    {1, 1, 0, 0, 0, 0, 1, 1},
    {1, 0, 0, 0, 0, 0, 0, 1},
    {0, 0, 0, 0, 0, 0, 0, 0},
  };
  for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++) {
      digitalWrite(LEDs_PINs[j], customMode[i][j]);
    }
    delay(250);
  }
}

void setup() {
  pinMode(BTN_PIN, INPUT_PULLUP);
  pinMode(YELLOW_LED, OUTPUT);
  for (int i = 0; i <= 7; i++) {
    pinMode(LEDs_PINs[i], OUTPUT);
  }
}

void loop() {
  int BTN_STAT = digitalRead(BTN_PIN);
  if (BTN_STAT == 0) {
    LEDs_Style++;
    if (LEDs_Style > 4) {
      LEDs_Style = 0;
    }
    digitalWrite(YELLOW_LED, HIGH);
    delay(3000);
    digitalWrite(YELLOW_LED, LOW);
  }

  switch (LEDs_Style) {
    case 0:
      RIGHT_TO_LEFT();
      break;
    case 1:
      LEFT_TO_RIGTHT();
      break;
    case 2:
      GO_AND_BACK();
      break;
    case 3:
      LED_BY_LED();
      break;
    case 4:
      CUSTOM_MODE();
      break;
    default:
      break;
  }
}

محاكاة مشروع إضاءة زينة بأنماط مختلفة

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

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

أضف العناصر الإلكترونية اللازمة للمشروع المفتاح اللحظي Push Button والليدات LEDs والمقاومات Resistors ولوحة التجارب BreadBoard.

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

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

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

بالطريقة نفسها يمكنك تغير ألوان الليدات والمفتاح من خلال النقر فوقها واختيار اللون من اللوحة الظاهرة.

تغير لون الليد والمفتاح

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

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

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

النتيجة النهائية لمحاكاة المشروع الخامس

الخاتمة

في ختام هذا المقال نكون قد تعلمنا كيفية بناء مجموعة أنماط مختلفة من الإضاءات باستخدام الأردوينو Arduino، واكتسبنا العديد من المهارات البرمجية والإلكترونية، نشجعكم لتجربة بناء هذا المشروع وتطوير وإضافة أنماط جديدة عليها.

اقرأ أيضًا


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

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

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



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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...