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

משחק זיכרון לגו מיני: 5 שלבים (עם תמונות)
משחק זיכרון לגו מיני: 5 שלבים (עם תמונות)

וִידֵאוֹ: משחק זיכרון לגו מיני: 5 שלבים (עם תמונות)

וִידֵאוֹ: משחק זיכרון לגו מיני: 5 שלבים (עם תמונות)
וִידֵאוֹ: אנשים שנפלו לתוך כלובים של חיות מסוכנות | טופטן 2024, יולי
Anonim
Image
Image
משחק זיכרון לגו מיני
משחק זיכרון לגו מיני

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

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

"אם זה לא נשבר, הוא תיקן את זה עד שזה היה" יהיה המכתב שלי, במקרה הטוב, אז כשהמיני חזרה הביתה לחג המולד, הגיע הזמן ללגו מיני 2.0. אחרי הכל, אם טסלה יכולה לדחוף עדכוני תוכנה למכוניות שלה, כמה קשה זה יכול להיות?

היו לי כמה רעיונות:

  • שפר את ממשק המשתמש המסורבל למדי
  • הוסף צופר!
  • שפר את תכונת "האורות האוטומטיים"; והכי חשוב
  • הוסף פונקציית משחק (אפילו זיהיתי שהחידוש בהדלקה וכיבוי של אורות המיני עם הטלפון שלך ייעלם במוקדם או במאוחר)

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

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

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

אבל ראשית, הייתי צריך לבצע כמה שינויים קלים בחומרה.

שלב 1: רכיבים, כלים ומשאבים

רכיבים, כלים ומשאבים
רכיבים, כלים ומשאבים

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

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

באופן דומה, אין צורך בכלים או משאבים נוספים מעבר לאלה המפורטים לפרויקט המקורי.

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

שלב 2: שינוי חומרה

שינוי חומרה
שינוי חומרה

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

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

  • D1 עבור אות בקרת הזמזם (המחובר גם ישירות לאספקת החשמל 5VDC)
  • D7 עבור LED פנימי לבן
  • D8 לאחד מאותם נורות LED צבעוניות מהבהבות, שאותו כיניתי אור "דיסקו"

הבאזר עצמו מתחמק בצורה מסודרת מתחת לתא המנוע כך שהחזרת החוטים חזרה ל- NodeMCU הייתה מהירה.

שלב 3: עדכון ה- GUI

עדכון GUI
עדכון GUI
עדכון GUI
עדכון GUI
עדכון GUI
עדכון GUI

השלב הראשון בעדכון GUI היה יצירת ארבעה דפי אינטרנט נפרדים:

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

    • הפעלה וכיבוי של הצליל
    • הגדרת אזור הזמן (המיני מקבל זמן מהאינטרנט כדי שיוכל להבהב את האורות שלו בשעה עם הזמן המתאים)
    • התאמה כאשר "האורות האוטומטיים" יפעילו ויכבו את הפנסים על בסיס רמת האור הסביבתי
    • איפוס שם הציון הגבוה והשם המדורג (שמור ב- EEPROM)

הפרדת הפונקציות בצורה זו גורמת לחוויה הרבה יותר דמוית אפליקציה. קבלת ה- NodeMCU לשרת מספר דפים הייתה אחד האתגרים לפרויקט זה. לאחר שניסיתי כמה גישות שונות נתקלתי בקוד שאתה רואה בשורות 232 עד 236 של המערכון הראשי של ארדואינו. זה עובד מצוין - פשוט צור את קובץ האינדקס שלך ואז תן שם לדפים הבאים עמוד 1, עמוד 2 וכו '. גיליתי שעלי לשים את כל קבצי המשאבים (CSS ותמונות) בתיקיית נתוני השורש, אך זו לא באמת בעיה לאתרים של גודל זה.

לאחר מכן, הייתי צריך לעבוד עם CSS ו- Javascript כדי ליצור משהו שנראה כאילו הוא שייך ללגו מיני. מכיוון שאני לא יודע כלום על כל אחד מהנושאים, היו כאן הרבה חיפושים בגוגל לפני שקיבלתי משהו שהייתי מרוצה ממנו. התחלתי בהעתקת בושות לבו לגו בסגנון CSS על CodePen כאן. רציתי גם להתרחק מתיוג הלחצנים בטקסט ובסופו של דבר להשתמש בגרפיקה פשוטה מ- Icons8, שהיו מושלמים למטרות שלי. השאר נפל במקום משם. הדפים מוצגים היטב בכל מכשירי האייפון בהם בדקתי אותם. אני מקווה שזה נכון גם לגבי טלפונים אנדרואיד (נראה בסדר בדפדפן Chrome שולחני).

שלב 4: קוד המשחק

קוד המשחק
קוד המשחק

התקשורת בין שרת NodeMCU לדפדפן הסמארטפונים היא באמצעות Websockets. לאחר לחיצה על כפתור על ידי המשתמש, הדפדפן שולח תו טקסט ל- NodeMCU המתאים לאחד או יותר מנורות המיני. דמויות נוספות נשלחות לשלוט בזרימת המשחק. הקוד Arduino ואז נוקט פעולה על סמך הדמות שהתקבלה. תקשורת Websocket יכולה להתמודד רק עם תווים בינארי וטקסט ולכן יש צורך בהמרה מסוימת עבור מספרים שלמים (למשל אזור הזמן).

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

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

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

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

עם כל מה שאמרתי, השתמשתי שוב בנתח הגון של קוד המשחק האקסטר שהאיץ את העניינים הרבה.

שלב 5: שאר הקוד

שאר הקוד
שאר הקוד

בהשוואה לקוד הפרויקט של Hackster, הסקיצה של Arduino שלי נראית עצומה, אפילו בלי כל ה- HTML, CSS ו- Javascript בקבצי הנתונים. אבל עיקר הסקיצה היא חבורה של פונקציות הקשורות בפעולות בסיסיות כגון יצירה וניהול של השרת, קבלת זמן NTP, mDNS, מתן עדכון אוויר, ניהול WiFi, ניהול קבצי SPIFFS וכדומה.

ה- Javascript בקבצי HTML מיועד בעיקר לטיפול בהודעות Websocket (מתקבלות ונשלחות) ולהגדלת האינטראקטיביות של ה- GUI.

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

אה, כמעט שכחתי. הקוד נמצא ב- GitHub כאן. לאחר ההורדה הכניסו את כל החבילה לתיקייה חדשה, העלו את סקיצת ה- Arduino ולאחר מכן את תוכן תיקיית הנתונים ל- SPIFFS.

מוּמלָץ: