דלגו לתוכן המרכזי
KitLab
שיעור קודם
לחצן טריוויה — מכונת מצבים ונעילה· 28 / 41
לחצן טריוויה — מכונת מצבים ונעילה
🎬

הסרטון בדרך אלינו

בינתיים — התמלול המלא של השיעור מחכה לכם למטה

לחצן טריוויה — מכונת מצבים ונעילה

מה בשיעור?

  • ארבעת שלבי הלוגיקה
  • מכונת מצבים: לא פעיל, פעיל, נעול
  • הנעילה שמונעת מהשני לדרוס את הראשון
  • break ויציאה מיידית מלולאה
  • העדיפות שנוצרת מסדר הסריקה

מה נלמד כאן

  • לוגיקת עדיפות בין כמה כניסות
  • מצב נעילה
  • לבנות לחצן טריוויה לארבעה שחקנים

מי היה ראשון

בתחרויות ידע, לחצן הטריוויה הוא הכלי שמכריע מי לחץ ראשון. בלעדיו — ויכוח.

לחצן טריוויה

בשיעור הזה נבנה אחד לארבעה שחקנים.


הידע שצריך

ארבעת שלבי הלוגיקה

זה השיעור הראשון שבו ההיגיון מורכב יותר מהחומרה. תעקבו אחרי המצבים:

1. מצב לא פעיל — בהתחלה המערכת לא מקשיבה. לחיצות של שחקנים לא עושות כלום. רק כשהמנחה לוחץ על כפתור ההתחלה, המערכת עוברת למצב פעיל.

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

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

4. חיווי — הזמזם מצפצף והנורית של השחקן המנצח נדלקת.

למה זה מעניין

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

זה נקרא מכונת מצבים, וזה הבסיס לכל תוכנה מורכבת.

לא פעיל  ──(המנחה לוחץ)──>  פעיל  ──(שחקן לוחץ)──>  נעול
   ^                                                   |
   └──────────────(איפוס)──────────────────────────────┘

עדיפות

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

זו הטיה קטנה שקיימת בכל מערכת כזו. שווה לדעת שהיא שם.


הניסוי

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

רשימת רכיבים

הרכיב כמות
לוח ESP32 1
לוח ניסוי 400 נקודות 1
לחצנים 4
נוריות LED 4
זמזם אקטיבי 1
נגד 10kΩ 1
נגד 220Ω 1

התרשים החשמלי

התרשים החשמלי

החיבור

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


מבנה התוכנית

bool active = false;      // האם המערכת מקשיבה
int  winner = 0;          // מי ניצח (0 = עדיין אף אחד)

void loop() {
  // 1. המנחה פותח את הסבב
  if (!active && כפתור_מנחה_נלחץ) {
    active = true;
    winner = 0;
    כבה_את_כל_הנוריות();
  }

  // 2. סורקים את השחקנים — רק אם פעיל ואין עדיין מנצח
  if (active && winner == 0) {
    for (int i = 0; i < 4; i++) {
      if (digitalRead(playerPins[i]) == LOW) {
        winner = i + 1;
        digitalWrite(ledPins[i], HIGH);   // הנורית שלו
        זמזם_קצר();
        active = false;                   // 3. נעילה
        break;                            // יוצאים מיד
      }
    }
  }
}

שלושת המשפטים שעושים את כל העבודה:

  • winner == 0 — התנאי שמונע מהשני לדרוס את הראשון
  • active = false — הנעילה
  • break — יציאה מיידית מהלולאה, כדי שלא ייבדקו שחקנים נוספים באותו סיבוב

מה אמור לקרות

המערכת מכריזה מנצח

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


נסו בעצמכם

  • הסירו את active = false. מה קורה כששחקן שני לוחץ? עכשיו הבנתם למה הנעילה שם.
  • הוסיפו ספירה לאחור לפני פתיחת הסבב: שלושה צפצופים ואז "לחצו".
  • הוסיפו מונה ניקוד לכל שחקן והציגו אותו על התצוגה.
  • הוסיפו פסילה: מי שלוחץ לפני שהמנחה פתח — נורית שלו מהבהבת והוא מודח מהסבב.
  • שלבו עם שיעור 9: מנגינת ניצחון במקום צפצוף.

🧰 הרכיבים לשיעור הזה

רוצים את חומרי הקורס והעדכונים?

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