תוכן עניינים:

מחשבון מסך מגע Arduino: 7 שלבים
מחשבון מסך מגע Arduino: 7 שלבים

וִידֵאוֹ: מחשבון מסך מגע Arduino: 7 שלבים

וִידֵאוֹ: מחשבון מסך מגע Arduino: 7 שלבים
וִידֵאוֹ: הדפסות למסך המחשב בסביבת ארדואינו 2024, יולי
Anonim
מחשבון מסך מגע Arduino
מחשבון מסך מגע Arduino

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

אספקה

- ארדואינו אונו

-2.4 מגן LCD TFT (כאן קניתי אותו:

- כבל USB A ל- B (כבל לחיבור Arduino למחשב)

- מחשב עם Arduino IDE מותקן

- יהיה עליך גם להוריד שתי ספריות: MCUFRIEND_kbv ומסך מגע. הראשון שאתה יכול למצוא ב- github (קישור: https://github.com/prenticedavid/MCUFRIEND_kbv) או שאתה יכול להשתמש בקובץ ה- zip של הספרייה שכללתי למטה. השני נמצא במנהל הספרייה של Arduino להתקנה.

שלב 1: חיבורי חומרה

חיבורי חומרה
חיבורי חומרה
חיבורי חומרה
חיבורי חומרה
חיבורי חומרה
חיבורי חומרה

החיבור של מגן מסך המגע ל- Arduino Uno הוא פשוט ומהיר. כל שעליך לעשות הוא לסדר את הפינים הנמוכים ביותר על המגן לפינים הנמוכים ביותר על הארדואינו ולדחוף את המגן לתוך הסיכות. סיכה 5V העליונה והסיכה ללא התווית בצד הכוח לא צריכים להכיל בתוכה סיכות מהמגן, כאשר אותם פרמטרים חלים על הסיכות המסומנות SCL ו- SDA בצד השני של הלוח. עכשיו, אנחנו מוכנים לקודד!

שלב 2: הקוד: הגדרות גלובליות והתקנה

#לִכלוֹל

MCUFRIEND_kbv tft; // בכל מקרה

#לִכלוֹל

#הגדר YP A3

#define XM A2

#הגדר YM 9

#define XP 8

מסך מגע ts = מסך מגע (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

זהו תחילת הקוד, שבו אנו כוללים ספריות (MCUFRIEND_kbv & מסך מגע), מגדירים את סיכות ה- X וה- Y, מגדירים את הפרמטרים של מסך המגע ומגדירים לחץ מינימלי הדרוש ל Arduino לרישום לחיצת משתמש.

int ID;

int user_selection;

float save_number = 0;

מונח צף 1;

int op_num;

תוצאת צף;

int cursorLocX = 5;

int cursorLocY = 20;

ממש לפני ההתקנה, עלינו להגדיר כמה משתנים גלובליים. מזהה מסייע בהפעלת מסך המגע. user_selection מחזיק מספר המתאים למפתח שהמשתמש בוחר בעת לחיצה על מסך המגע. save_number הוא המשתנה שאנו מדפיסים למסך לאחר כניסת משתמש (עוד על כך בלולאה). זה מצוף כך שהוא יכול להכיל מספרים עשרוניים כמו גם מספרים שלמים. term1 הוא המשתנה שבו המספר הראשון של המשוואה נשמר לאחר בחירת אופרנד. op_num שומר את האופראנד כמספר (1 לחיבור, 2 לחיסור, 3 לכפל ו -4 לחלוקה). התוצאה היא המשתנה המודפס למסך לאחר שהמשתמש לחץ על סימן השווים. זה גם מצוף. cursorLocX ו- cursorLocY הן נקודות המיפוי במסך המגע שבו הסמן מוגדר למספר פעמים (הוא ממוקם בסרגל האפור למעלה, הידוע גם בשדה התוצאות).

הגדרת בטל () {

tft.reset ();

מזהה = tft.readID ();

tft.begin (מזהה);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

ריבועים ();

מספרים ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

פונקציית ההתקנה שלנו מכילה תחילה את האתחול של מגן מסך המגע (שורות 1-3). כיוון המגן נקבע באמצעות הפקודה tft.setRotation (), כאשר 0 הוא זקוף. המסך כולו בצבע אפור כהה עם הפקודה tft.fillScreen (), שנכתוב למעלה (למעט שדה התוצאות). הפונקציות ריבועים () ומספרים () מציירות את הריבועים של המחשבון, צובעים את הריבועים בשחור ולבן בתבנית לוח שחמט, וכתוב מספרים/אופרנדים על הריבועים בכחול. נגיע לאלה בשלב הבא. הפקודה tft.setTextSize () קובעת את גודל הטקסט של שדה התוצאות ל -3, שהוא גופן בינוני. הפקודה tft.setTextColor () קובעת את צבע הטקסט של שדה התוצאות לכחול, הכתוב על השדה האפור הכהה.

שלב 3: הקוד: לולאה

לולאת חלל () {numberSelect ();

עיכוב (100);

אם (user_selection == 16) {

;

}אַחֵר{

if (user_selection <10) {

שמור_מספר = שמור_מספר * 10 + בחירת משתמש;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (שמור_מספר);

} אחר אם (user_selection> 10) {

switch (user_selection) {

מקרה 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

מונח 1 = שמור_מספר;

שמור_מספר = 0;

לשבור;

מקרה 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

מונח 1 = שמור_מספר;

שמור_מספר = 0;

לשבור;

מקרה 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

מונח 1 = שמור_מספר;

שמור_מספר = 0;

לשבור;

מקרה 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

מונח 1 = שמור_מספר;

שמור_מספר = 0;

לשבור;

מקרה 15:

שמור_מספר = 0;

מונח 1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

לשבור;

}

tft.setCursor (cursorLocX, cursorLocY);

זה הרבה ללעיסה, אז אסביר מה למעלה. אנו מתחילים בקריאה לפונקציה numberSelect (), המקצה מספר לכל ריבוע במסך המגע. כאשר משתמש לוחץ על אחד הריבועים האלה, הפונקציה קובעת את משתנה user_selection למספר הריבוע. הצהרת ה- if הראשונה צריכה לרוץ רק דרך הלולאה אם נעשתה בחירת משתמש חוקית. אם כן, המשפט הבא של if שואל אם user_selection מכיל מספר פחות מעשרה (המספרים 0-9). אם כן, מספר_ שמור_כפול מוכפל ב -10 והמספר בבחירה_משתמש מתווסף למספר_שומר, המודפס בשדה התוצאות במסך המגע. אם לא, ההצהרה הבאה אם שואלת אם משתמש_בחירה מכיל מספר גדול מ -10 שמור בתוכו (מספרי האופראנד: 11 עבור +, 12 עבור -, 13 עבור X, 14 עבור /ו -15 עבור ריבוע המסך הבהיר). פונקציית מתג מטפלת בכל מקרה (נקבעת על ידי user_selection). למשתנה op_num ניתן מספר המתאים לאופראנד שנבחר (1 עבור +, 2 עבור -, 3 עבור X ו -4 עבור /). הערך במספר save_number נשמר לתוך המשתנה term1 כך שניתן להשתמש במשתנה save_number במחצית השנייה של המשוואה. סמל האופרנד מודפס על המסך יחד עם ניקוי מספרים בשדה התוצאות. היוצא מן הכלל היחיד הוא ריבוע המסך הבהיר, המאפס את כל משתני החישוב ומנקה את שדה התוצאות מכל מה שיש בו.

}אַחֵר{

switch (op_num) {

תיק 1:

תוצאה = מונח 1 + שמור_מספר;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (כפול (תוצאה));

לשבור;

מקרה 2:

תוצאה = מונח 1 - שמור_מספר;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (כפול (תוצאה));

לשבור;

מקרה 3:

תוצאה = מונח 1 * שמור_מספר;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (כפול (תוצאה));

לשבור;

מקרה 4:

תוצאה = צף (מונח 1) / צף (שמור_מספר);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (תוצאה);

לשבור;

}

tft.setCursor (cursorLocX, cursorLocY);

save_number = תוצאה;

מונח 1 = 0;

op_num = 0;

עיכוב (1000);

}

}

}

החלק האחרון של הלולאה עוסק באירוע שבו המשתמש בוחר את סימן השווים (user_selection == 10). פונקציית מתג נוספת פועלת באמצעות ארבע הפונקציות המתמטיות (נקבעת על ידי op_num). מקרה החיבור (מקרה 1) מוסיף את המונח 1 ואת שמור_מספר יחד ושומר את המספר במשתנה התוצאה. התוצאה מודפסת לשדה התוצאות ככפולה. מקרה החיסור (מקרה 2) חוסך את מספר שמור מהמונח 1 ושומר את המספר במשתנה התוצאה. התוצאה מודפסת לשדה התוצאות ככפולה. מקרה הכפל (מקרה 3) מכפיל את term1 ב- save_number ושומר את המספר במשתנה התוצאה. התוצאה מודפסת לשדה התוצאות ככפולה. מקרה החלוקה (מקרה 4) מחלק את המונח 1 על ידי שמור_מספר יחד ושומר את המספר למשתנה התוצאה. התוצאה מודפסת לשדה התוצאות כצפה (מכיוון שתשובות החלוקה יכולות להיות מספרים עשרוניים). לאחר ההדפסה של מספר, אופרנד או תוצאה להדפסת המסך, הסמן מתאפס, מספר_ שמור מוגדר לתוצאה הקודמת, ומונח 1 ואופ_נום מאופסים.

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

שלב 4: הפונקציה קוד: ריבועים

ריבועים חללים () {

// ריבועים בשחור ולבן מתחלפים בכל שורה ולשורה הראשונה והשלישית יש תבנית הפוכה מהשורה השנייה והרביעית

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // שורת ריבועים ראשונה מתחילה, שחור עד לבן tft.fillRect (60, 60, 60, 65, TFT_WHITE);

tft.fillRect (120, 60, 60, 65, TFT_BLACK);

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // שורת הריבועים הראשונה מסתיימת

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // שורת ריבועים שנייה מתחילה, לבן עד שחור tft.fillRect (60, 125, 60, 65, TFT_BLACK);

tft.fillRect (120, 125, 60, 65, TFT_WHITE);

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // שורת הריבועים השנייה מסתיימת

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // שורת ריבועים שלישית מתחילה, שחור עד לבן tft.fillRect (60, 190, 60, 65, TFT_WHITE);

tft.fillRect (120, 190, 60, 65, TFT_BLACK);

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // שורת הריבועים השלישית מסתיימת

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // שורת הריבועים הרביעית מתחילה, לבן עד שחור tft.fillRect (60, 255, 60, 65, TFT_BLACK);

tft.fillRect (120, 255, 60, 65, TFT_WHITE);

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // שורת הריבועים הרביעית מסתיימת

}

הפונקציה ריבועים () די פשוטה. הפקודה tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) מציירת מלבן על פי הפרמטרים המועברים אליו, שהם המיקומים הראשונים של x ו- y, המיקומים השניים של x ו- y, והצבע שהמלבן מלא בו. פונקציה זו מציירת את כל ארבע שורות הריבועים (מלבנים טכנית) וממלאת כל ריבועים בצבע המועבר אליה.

שלב 5: הפונקציה קוד: מספרים

מספרי חלל () {

tft.setTextColor (TFT_BLUE); // מגדיר את צבע המספר/תו לכחול

tft.setTextSize (5); // מגדיר מספר/גודל תו ל -5

tft.setCursor (18, 75); // מגדיר את הסמן לשורה הראשונה של מספרים/תווים

tft.print ("7 8 9 /"); // מדפיסה שורה ראשונה של מספרים/תווים

tft.setCursor (18, 140); // מגדיר את הסמן לשורה השנייה של מספרים/תווים

tft.print ("4 5 6 X"); // מדפיסה שורה שניה של מספרים/תווים

tft.setCursor (18, 205); // מגדיר את הסמן לשורה השלישית של מספרים/תווים

tft.print ("1 2 3 -"); // מדפיסה שורה שלישית של מספרים/תווים

tft.setCursor (18, 270); // מגדיר את הסמן לשורה הרביעית של מספרים/תווים

tft.print ("C 0 = +"); // מדפיסה את השורה הרביעית של מספרים/תווים

}

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

שלב 6: הפונקציה קוד: מספר בחר

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

if (p.z> MINPRESSURE) {

p.x = מפה (px, 250, 845, 0, 239);

p.y = מפה (p.y, 245, 860, 0, 319);

אם (תוצאה! = 0) {

תוצאה = 0;

שמור_מספר = 0;

tft.print ("ערכים ברורים");

עיכוב (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

כדי להתחיל את הפונקציה numberSelect (), אנו מבקשים קלט משתמש ממסך המגע באמצעות הפקודה ts.getPoint (). לאחר שנאספו נתונים אלה, אנו בודקים אם הלחץ המינימלי חרג (או, במילים אחרות, אם המשתמש לחץ במקום כלשהו במסך המגע). אם כן, קואורדינטות x ו- y ממופות מקואורדינטות קרטזיות לקואורדינטות ספציפיות למסך מגע. (0, 0) היא הפינה השמאלית העליונה של מסך המגע, כאשר ציר x חוצה וציר y יורד. החלק הבא בודק אם יש מספר שנשמר בתוצאה. אם יש, התוצאה והמספר השמור מאופסים ל -0. ההודעה "CLEAR VALUES" מודפסת מעל שדה התוצאות, והמסך מתנקה כשהסמן חוזר למיקום ההתחלה שלו.

אם (עמ '60) {// שורת ריבועים ראשונה

אם (עמ 'x <60)

user_selection = 7;

אחרת אם (עמ 'x <120)

user_selection = 8;

אחרת אם (עמ 'x <180)

user_selection = 9;

אחרת user_selection = 14;

} אחרת אם (עמ '125) {// שורת ריבועים שנייה

אם (עמ 'x <60)

user_selection = 4;

אחרת אם (עמ 'x <120)

user_selection = 5;

אחרת אם (עמ 'x <180)

user_selection = 6;

אחרת user_selection = 13;

} אחרת אם (עמ '190) {// שורת ריבועים שלישית

אם (עמ 'x <60)

user_selection = 1;

אחרת אם (עמ 'x <120)

user_selection = 2;

אחרת אם (עמ 'x <180)

user_selection = 3;

אחרת user_selection = 12;

} אחרת אם (p.y> 255) {// שורת ריבועים רביעית

אם (עמ 'x <60)

user_selection = 15;

אחרת אם (עמ 'x <120)

user_selection = 0;

אחרת אם (עמ 'x <180)

user_selection = 10;

אחרת user_selection = 11;

}

}אַחֵר{

user_selection = 16; // user_selection מוגדר ל- 16 (שום דבר משתנה)

}

}

זהו החלק הקובע איזה כפתור נבחר. החל משורת הריבועים העליונה וכלה בשורה התחתונה, הארדואינו מחפש היכן בעצם נלחץ המסך. לאחר מכן הוא מקצה לריבוע מספר ושומר את המספר הזה לתוך user_selection. המספרים 0-9 תואמים את ריבועי המספרים, המספרים 11-15 תואמים את ריבועי האופראנד והריבוע הצלול, והמספר 10 תואם את ריבוע השווים של השווים. אם לא נבחר ריבוע, בחירת המשתמש מוגדרת ל -16, מה שיגרום ללולאה להתחיל מחדש (ראה פונקציית לולאה).

שלב 7: תהנה מהפרויקט שהסתיים שלך

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

להלן כל הקוד לנוחיותך. הוא מלא בתגובות אז אם יש לך בעיות הן צריכות להראות לך מה כל שורה עושה.

מוּמלָץ: