سنتعلم في مقال اليوم طريقة تنفيذ أنماط إضاءة مختلفة باستخدام الأردوينو، حيث يمكن استخدامها كإضاءة للزينة في بعض الأماكن مثل السيارات أو قاعات الاحتفال أو استخدامها كإشارة تنبيه لوقوع حالات الطوارئ في بعض الأماكن العامة.
فكرة مشروع إضاءة زينة بأنماط مختلفة بأردوينو
سنتحكم في آلية عمل مجموعة من الليدات 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 أوم من خلال النقر فوقها، حيث تظهر لك نافذة في الأعلى تمكنك من تغير القيمة والواحدة.
بالطريقة نفسها يمكنك تغير ألوان الليدات والمفتاح من خلال النقر فوقها واختيار اللون من اللوحة الظاهرة.
رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
اكتب الكود البرمجي في الجزء الخاص به ثم شغل المحاكاة، ولاحظ الحالات الآتية:
- في البداية ستضيء جميع الليدات بشكل متتالي من اليمين إلى اليسار مع الحفاظ على إضاءة الليدات السابقة أي أنها ستعمل وفق النمط الأول.
- اضغط على المفتاح اللحظي بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد لمدة ثلاث ثواني ومن ثم ستضيء جميع الليدات بشكل متتالي من اليسار إلى اليمين مع الحفاظ على إضاءة الليدات السابقة أي أنها ستعمل وفق النمط الثاني.
- بالضغط على المفتاح مرة ثانية بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد أيضًا لمدة ثلاث ثواني ومن ثم ستضيء جميع الليدات بشكل متتالي من اليمين إلى اليسار ثم ستنطفئ جميع الليدات بشكل متتالي من اليسار إلى اليمين، أي أنها ستعمل وفق النمط الثالث.
- بالضغط على المفتاح مرة ثالثة بشكل مستمر حتى إضاءة الليد الأصفر، ستستمر إضاءة هذا الليد أيضًا لمدة ثلاث ثواني ومن ثم إضاءة الليدات بشكل متتالي من اليمين إلى اليسار بدون الحفاظ على إضاءة الليدات السابقة، أي أنها ستعمل وفق النمط الرابع.
- أخيرًا، بالضغط على المفتاح مرة رابعة بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد لمدة ثلاث ثواني ومن ثم تشغيل الليدات وإطفاءها وفق تسلسل خاص على شكل ستارة إلكترونية، أي أنها ستعمل وفق النمط الخامس.
- في حال تكرار الضغط على المفتاح مرة أخرى بعد ذلك سيعود إلى النمط الأول.
الخاتمة
في ختام هذا المقال نكون قد تعلمنا كيفية بناء مجموعة أنماط مختلفة من الإضاءات باستخدام الأردوينو Arduino، واكتسبنا العديد من المهارات البرمجية والإلكترونية، نشجعكم لتجربة بناء هذا المشروع وتطوير وإضافة أنماط جديدة عليها.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.