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

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

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: מנגינת ניצחון.


