ערוצי נורות - פתרון התרגיל
ערכה: קורס ארדואינו בסיסי
ראשית נגדיר את הפינים בהם נשתמש
עבור הכפתורים
עבור הנורות
גם בתרגיל זה נגדיר מערכים (עבור הכפתורים ועבור הנורות)
כיוון שאנו רוצים קשר בין הכפתור לבין הנורה (כפתור כחול ידליק נורה כחולה) נקפיד לסדר את הפינים כך שעבור כפתור ונורה בעלי אותו צבע יהיה גם אותו אינדקס במערך
כמו כן, נרצה משתנה שיחזיק את מצב הנורה (כדי שנוכל לשנות את המצב) ומשתנה שיכיל את מצב הכפתור (כדי שנשנה את מצב הנורה רק פעם אחת בכל לחיצה של הכפתור)כמובן שמשתנים אלה הם עבור כל סט של כפתור-נורה ולכן גם עבורם נגדיר מערך
בפונקציית האתחול setup נגדיר את מוד העבודה של הפינים. כמובן שנשתמש בלולאה לשם כך
השליטה על הנורה
כדי לשלוט על הנורה אנו זקוקים לפונקציה שתדליק את הנורה, ולפונקציה שתכבה
כמובן שהפונקציה צריכה לדעת לעבוד עם כל הנורות, ולכן היא תקבל פרמטר של האינדקס במערך עמו עובדים
הפונקציה גם צריכה לשמור את מצב הנורה במשתנה המתאים, כדי שנוכל להשתמש בו כשנרצה להחליף את מצב הנורה
ולכן פונקציית ההדלקה תהיה
ופונקציית הכיבוי
פונקציית ההחלפה תפעיל את הפונקציה המתאימה מבין השתיים, בהתבסס על מצב הנורה
זיהוי לחיצה בודדת
כאשר לוחצים על כפתור, הערך שלו יהיה נמוך, כלומר התנאי
יתקיים כאשר הכפתור לחוץ
אבל
הארדואינו עובד הרבה יותר מהר מהיד שלנו, כך שלחיצה אחת בודדת תגרום למספר רב של מקרים שהתנאי מתקיים
אנו צריכים להבטיח שכל לחיצה תשפיע רק פעם אחת
לשם כך אנו זוכרים את המצב של הכפתור
כאשר הכפתור משוחרר (כלומר ה-else של התנאי הקודם), אנו יכולים להגדיר את המשתנה אל false
ואז כשאנחנו מזהים לחיצה על הכפתור, אנו יודעים שהיא חדשה רק אם מצב הכפתור הידוע לנו הוא לא לחוץ (כלומר יש שינוי במצב הכפתור)
במצב כזה, של לחיצה חדשה, נשנה את מצב הנורה, וכמובן נעדכן את מצב הכפתור
כמובן שאת הקוד הזה אנחנו מריצים בתוך לולאה הסורקת את כל הכפתורים
debouncing
בעיה נוספת שיש עם כפתור זה חוסר יציבות של הערך בעת לחיצה/שחרור. תופעה זו שנקראת Bouncing נובעת מהמבנה הפיזי של הכפתור, והדרך להתגבר עליה היא לעשות השהיה קטנה בין המדידות של ערך הכפתור
לכן נוסיף
בפונקציית loop
זו השהיה מספיק קטנה כדי שלא תשפיע על זיהוי הלחיצה על הכפתור, ומספיק ארוכה כדי להתעלם מתופעת ה-bouncing, כך שנצליח לספור רק פעם אחת כל לחיצה על הכפתור
כל הפונקציה תהיה