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

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

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

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

מה בשיעור?

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

מה נלמד כאן

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

מי היה ראשון

לחצן טריוויה

בתחרויות ידע זה הכלי שמכריע. בלעדיו — ויכוח.


הידע שצריך

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

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

עקרון הפעולה

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

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

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

4. חיווי — זמזם ונורית.

מכונת מצבים

עד עכשיו התוכניות שלכם הגיבו. כאן התוכנית מנהלת מצב:

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

זה הבסיס לכל תוכנה מורכבת.

עדיפות

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


הניסוי

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

רשימת רכיבים

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

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

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

החיבור

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


מבנה התוכנית

active = False        # האם המערכת מקשיבה
winner = 0            # מי ניצח (0 = אף אחד)

while True:
    # 1. המנחה פותח סבב
    if not active and host.value() == 0:
        active = True
        winner = 0
        for led in leds:
            led.value(0)

    # 2. סורקים — רק אם פעיל ואין מנצח
    if active and winner == 0:
        for i, btn in enumerate(players):
            if btn.value() == 0:
                winner = i + 1
                leds[i].value(1)
                buzzer.value(1); time.sleep(0.3); buzzer.value(0)
                active = False          # 3. נעילה
                break                   # יוצאים מיד

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

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

ו-enumerate(players) נותנת גם את האינדקס וגם את האובייקט בלולאה אחת. ב-C היה צריך for (int i=0...) ואז players[i].

מה אמור לקרות

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


נסו בעצמכם

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

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

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

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