דלגו לתוכן המרכזי
KitLab
שיעור קודם
מתג אור — if, ריטוט וזיכרון מצב· 22 / 41
מתג אור — if, ריטוט וזיכרון מצב
🎬

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

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

מתג אור — if, ריטוט וזיכרון מצב

מה בשיעור?

  • if בפייתון — נקודתיים והזחה
  • and, or, not במילים
  • שליטה רגעית מול מתחלפת
  • ריטוט מגעים ו-pass
  • ביטוי תנאי בשורה אחת

מה נלמד כאן

  • משפט if בפייתון
  • אופרטורים לוגיים
  • שתי שיטות שליטה: רגעית ומתחלפת
  • ריטוט מגעים

שתי דרכים לכבות אור

לחצן ונורית

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

נבנה את שתיהן.


הידע שצריך

1. if בפייתון

if condition:
    # רץ אם נכון
elif other:
    # אם התנאי השני נכון
else:
    # אם אף אחד

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

ו-elif הוא קיצור של else if — מילה אחת.

2. תנאים

האופרטור המשמעות
== != שווה, לא שווה
> < >= <= השוואות גודל
and or not לוגיים

בפייתון כותבים and, or, not במילים — לא &&, ||, !. קריא בהרבה.

⚠️ = מול ==: סימן אחד משים ערך, שניים משווים. בפייתון זו שגיאת תחביר ולא באג שקט — יתרון על C.

3. שתי שיטות השליטה

רגעית — "לוחצים, קורה. משחררים, נפסק". מתאים לפעמון.

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

4. ריטוט מגעים

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

לחיצה אחת נקראת כעשר. במצב רגעי לא מפריע. במצב מתחלף זה הורס הכול.

הפתרון:

if button.value() == 0:
    time.sleep(0.2)                  # ממתינים שהריטוט ייגמר
    while button.value() == 0:       # ממתינים לשחרור
        pass
    # רק עכשיו מבצעים

pass היא פקודה שלא עושה כלום. בפייתון לא ניתן להשאיר בלוק ריק — pass ממלאת את המקום. ב-C זה היה ; בודד.


ניסוי 1 — שליטה רגעית

רשימת רכיבים

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

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

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

החיבור

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

הקוד

from machine import Pin
import time

LED_PIN = 5
BUTTON_PIN = 16

button = Pin(BUTTON_PIN, Pin.IN)
led = Pin(LED_PIN, Pin.OUT)

while True:
    button_state = button.value()
    if button_state == 0:        # לחוץ (Pull-Up!)
        led.value(1)
    else:
        led.value(0)

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


ניסוי 2 — שליטה מתחלפת

from machine import Pin
import time

led = Pin(5, Pin.OUT)
button = Pin(16, Pin.IN)

light_state = False           # המצב — כאן נכנס הזיכרון

while True:
    if button.value() == 0:
        time.sleep(0.2)                   # ריטוט
        while button.value() == 0:        # המתנה לשחרור
            pass
        light_state = not light_state     # היפוך המצב

    led.value(1 if light_state else 0)

שתי נקודות מפתח:

light_state — הרגע הוספתם לתוכנית זיכרון. עד עכשיו היא הגיבה רק להווה; עכשיו היא זוכרת.

not light_state — הופך True ל-False ולהפך. בפייתון כותבים not, לא !.

ו-1 if light_state else 0 הוא ביטוי תנאי — שורה אחת שמחזירה ערך לפי תנאי. אלגנטי, ואין לו מקבילה פשוטה ב-C.

שליטה מתחלפת


נסו בעצמכם

  • הסירו את ה-sleep ואת ה-while מניסוי 2 והריצו. זה התרגיל החשוב — תראו את הריטוט.
  • שנו את ההשהיה ל-0.05 ואז 0.02. איפה זה נשבר?
  • הוסיפו לחצן שני: אחד מדליק, אחד מכבה.
  • שלבו עם שיעור 18: לחיצה מחליפה בין אור רץ לכיבוי.
  • נסו לכתוב if light_state = True. מה פייתון אומרת?

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

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

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