11 - כדור 8 קסום, שימוש ב LCD

בפרויקט הזה, נבנה את הצעצוע הקלאסי magic 8-ball. אך נבנה אותו בצורה אחרת, ועם פחות אפשרויות (8 במקום 20, בשביל הקטנת קטע הקוד) נשתמש בפעם הראשונה במסך LCD כדי להציג את הטקסט, ומתג הטייה על מנת לבדוק האם ניערנו את הכדור (כדי לשאול שאלה).

מתג ההטייה כאמור יעזור לנו לחקות את תנועת הניעור / טלטול הקלאסית של הכדור על מנת לראות את התשובה. בעוד מסך ה LCD יספק לנו אותה (נחבר לפרויקט גם פוטנציומטר כדי לשלוט כל המסך).

מסך ה LCD שבו אשתמש יכול להציג מציג 32 תווים אלפאנומריים (16 עמודות ו-2 שורות). למסך יש הרבה סיכות (חלקן משמשות לכוח וחלקן משמות לתקשורת והעברת מידע), אנו לא נחבר את כולן (כי אין לנו צורך בכך), אך כמות החוטים שנצטרך לחבר תהפוך את הפרויקט לקצת מסובך (לא מבחינת הבנה, אלא מבחינת כמות החוטים, אז שימו לב).

 

חיבור הרכיבים

כמו תמיד, חברו ללוח המטריצה חוטים מגשרים מעמודות ה+ וה-, אל ה 5V וה GND (בהתאמה, כפי שעשינו עד כה). מקמו את מתג ההטייה על גבי לוח המטריצה, וחברו קצה אחד שלו לכוח (5V) בעזרת חוט מגשר, ואת הקצה השני לעמודת המינוס בעזרת נגד 10K אוהם, בנוסף, נחבר חוט מגשר מהרגל של המינוס שלו אל הפין הדיגיטלי מס’ 6.

פין ה RS של המסך שולט על היכן התווים יצוגו (על גבי המסך). הפין R/W מכניס את המסך למצב פלט / קלט (נשתמש במצב פלט בפרויקט הזה). פין ה EN (או E) אומר למסך שהוא יקבל פקודה. פיני המידע (D0-D7) משמשים כדי לשלוח מידע למסך (נשתמש רק ב-4 מתוכם). ולבסוף נשתמש בפינים -LED ו +LED כדי לכוון את הניגודיות של המסך.

ניעזר בספרייה liquidCrystal הניתנת לנו “חינם” עם ה Arduino ומפשטת את תהליך הכתיבה אל המסך והצגת התווים על גביו. אז נחבר את הפינים החיצוניים ביותר (Vss ו -LED) לאדמה (בעזרת חוט מגשר), וגם את הפין R/W (כדי שהוא יכניס את המסך למצב של write). את מקור הכוח של המסך (Vcc) נחבר ישירות לעמודת ה 5V בעזרת חוט מגשר, ואת פין ה +LED נחבר לעמודת ה 5V עם נגד 220 אוהם.

כעת, נחבר את פיני המידע. נחבר את הפין הדיגיטלי מס’ 2 של הארדואינו לפין D7 של המסך, את פין מס’ 3 של הארדואינו לפין D6 של המסך, את פין מס’ 4 של הארדואינו לפין D5 של המסך, ואת פין מס’ 5 של הארדואינו לפין D4, בפינים אלה נשתמש כדי לשלוח את המידע אל המסך.

לבסוף, נחבר את פין EN (או E) של המסך לפין הדיגיטלי מס’ 11 של הארדואינו, ואת הפין RS של המסך לפין מס’ 12 של הארדואינו (הפין יאפשר את הכתיבה למסך, בניגוד ל R/W שמכניס אותו למצב כתיבה או פיני המידע ששולחים את המידע).

בנוסף, לא לשכוח לחבר את הפוטנציומטר ללוח המטריצה, רגל אחת לאדמה ואת השניה לכוח, כשהרגל האמצעית תתחבר ישירות ל V0 של המסך.
להלן סכמה ואיור להמחשה:

Wiring Sketch

 

הקוד

תחילה נייבא את הספרייה של ה LCD עם הפקודה include# ובסוגריים משולשים את שם הספרייה. לאחר מכן נאתחל אותה ונכניס את מספרי הפינים שימשו לנו לתקשורת בין הארדואינו למסך.

כעת נגדיר את המשתנים השונים שבהם ניעזר במהלך התוכנית, switchPin שישמור את המס’ 6 (אליו מחובר מתג ההטיה, על מנת לראות האם הזיזו אותו) והוא יהיה קבוע. והמשתנים switchState ו prevSwitchState שבהם נשמור את המצב בו נמצא מתג ההטיה (כדי לראות אם הוא זז נצטרך לשמור גם את מצבו העכשוי וגם את מצבו הקודם), ומשתנה בשם reply (שבו נשמור את המס’ הרנדומלי שנקבל כדי להגריל את התשובה שתודפס על המסך).

 

בפוקנציית ה ()setup:

נתחיל את פעולת ה LCD ונכניס לתוך הפקודה את הפרמטרים של גודל המסך. ונכוון את פין מס’ 6 - switchPin (המחובר למתג ההטיה) להיות קלט. נחזור ל LCD ונכתוב פקודה על המסך בעזרת הפונ’ ()lcd.print המקבלת טקסט (כדי להגדיר את הכתוב כטקסט נכניסו בתוך גרשיים). ועכשיו כדי לכתוב בשורה השניה עוד טקסט, תחילה יש להזיז את ה cursor (סמן). נזיז אותו עם ()lcd.setCursor וכפרמטרים נכניס את העמודה 0 (הראשונה), ואת השורה 1 (השנייה). ושוב נכניס טקסט לשורה השניה.

 

בפונקציית ה ()loop:

בתוך ה loop יש קודם כל לקרוא את הערך מפין מס’ 6 (ממתג ההטיה) ולבדוק האם הוא זז (עם משפט if), לאחר מכן לוודא האם הוא שווה ל LOW (עם משפט if נוסף) (ז”א האם הוא זז, וכתוצאה מזה פתח את המעגל). במידה וכן נסיק כי המשתמש ניער / טלטל את הפרויקט ( / הכדור) ויש להחליף את הכתוב על המסך.

דבר ראשון נגריל מספר (על מנת להגריל את התשובה), הפונ’ ()random מחזירה מספר בהתבסס על הפרמטר שהעברנו לה, בפרויקט שלנו נכניס לתוכה את המס’ 8 , והיא תחזיר מספר בין 0 למספר אחד פחות ממה שהכנסו, ז”א נקבל מספר בין 0-7 (סה”כ 8 אפשרויות).

ננקה את המסך בעזרת הפקודה ()lcd.clear, נזיז את הסמן להתחלה (שורה 0 עמודה 0). ונכתוב ש”הכדור אומר:” ונזיז את הסמן לשורה השניה (1) עמודה ראשונה (0) כדי להיות מוכנים לכתוב מה הוא אומר. כעת נעבור על כל האופציות שלנו (המספרים בין 0 ל-7), אך במקום לעבור עליהם עם משפטי if, נעבור עליהם עם switch.

switch לוקח מס’ כלשהו (השמור במשתנה reply) ועובר על מספרים שלמים כדי לראות איזה מתאים, ז”א “case 0” יהיה אם reply=0. לאחר ה”case 0” נכתוב נקודותיים ואז מה יקרה במידה ומדובר על המקרה הזה (במקרה של 0 נגיד למסך להדפיס “yes”, ונבצע את הפקודה break, הפקודה תגיד ל Arduino היכן נגמר קטע הפקודות שעליו לבצע במידה ו reply=0, והוא ידלג על שאר הבדיקות ויקפוץ לסוף ה switch.

לבסוף כמובן, לפני שניצא מהתוכנית נשמור את הערך של מתג ההטיה הנוכחי כערך הקודם (ממש לפני שאנחנו עוברים עליה שוב כדי לקרוא ערך הטייה חדש ולבדוק האם האם שווים או לא (האם הזיזו את הפרויקט / כדור או לא)).

 כך יראה הקוד הסופי:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int switchPin = 6;
int switchState = 0;
int prevSwitchState = 0;
int reply;

void setup(){
    lcd.begin(16, 2);
    pinMode(switchPin, INPUT);
    lcd.print("Ask the");
    lcd.setCursor(0, 1);
    lcd.print("Crystal Ball!");
}

void loop(){
    switchState = digitalRead(switchPin);

    if(switchState != prevSwitchState){
        if(switchState == LOW){
            reply = random(8);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("The ball says:");
            lcd.setCursor(0, 1);

            swtich(reply){
                case 0: lcd.print("Yes");
                    break;
                case 1: lcd.print("Most likely");
                    break;
                case 2: lcd.print("Certainly");
                    break;
                case 3: lcd.print("Outlook good");
                    break;
                case 4: lcd.print("Unsure");
                    break;
                case 5: lcd.print("Ask again");
                    break;
                case 6: lcd.print("Doudtful");
                    break;
                case 7: lcd.print("No");
                    break;
            }
        }
    }
    prevSwitchState = switchState;
}

 

לסיכום

הפרויקט הזה לא היה מורכב מידי אך היה חשוב, שכן חזרנו קצת על שימוש במתג ההטייה ובפוטנציומטר, בייבוא ספריות (עשינו את זה גם בפרויקט הסרוו). למדנו על רכיב חדש ושימושי מאוד בחיינו – מסך LCD, והשתמשנו בפקודה חדשה בשם switch.

שימו לב לגבי כל החוטים המגשרים שעוברים בפרויקט, אם נתקלתם בבעיות כלשהן, סביר להניח שהן נובעות מחיבור לא נכון של החוטים (בהתחשב בכמות הגבוהה שיש בפרויקט הנל) - אז שימו לב.