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

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

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

פח אשפה חכם — דגל מצב

מה בשיעור?

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

מה נלמד כאן

  • פח אשפה חכם
  • דגל מצב
  • מכסה אוטומטי

בלי לגעת

פח אשפה חכם

מזהה יד שמתקרבת, פותח לבד, ונמנע ממגע.


הידע שצריך

איך זה עובד

עקרון הפעולה

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

דגל מצב

הבעיה: אם התוכנית פשוט "פותחת כשקרוב" — היא תפתח בכל סיבוב לולאה כל עוד היד שם. הסרוו ירעד.

הפתרון:

isOpened = False

פותחים רק אם סגור. סוגרים רק אם פתוח. זה דגל מצב.

הכרתם רעיון דומה בשיעור 19 (מתג מתחלף) ובשיעור 25 (נעילת הטריוויה). תוכנית שזוכרת מה עשתה מתנהגת אחרת מתוכנית שרק מגיבה.


ההרכבה

בלי ערכת הבנייה — דלגו לקוד.

שלבי ההרכבה:

שלב הרכבה 1

שלב הרכבה 2

שלב הרכבה 3

שלב הרכבה 4

שלב הרכבה 5

שלב הרכבה 6

שלב הרכבה 7

שלב הרכבה 8

שלב הרכבה 9

שלב הרכבה 10

שלב הרכבה 11

שלב הרכבה 12

שלב הרכבה 13

שלב הרכבה 14

שלב הרכבה 15

שלב הרכבה 16

שלב הרכבה 17


הניסוי

המטרה: זיהוי ב-25 ס"מ פותח את המכסה.

רשימת רכיבים

הרכיב כמות
לוח ESP32 1
חיישן אולטרסוני 1
סרוו 1

הקוד

from machine import Pin, time_pulse_us
import time
from libs.servo import Servo

servo_5 = Servo()
servo_5.attach(5)

trig = Pin(16, Pin.OUT)
echo = Pin(17, Pin.IN)

angle = 90
isOpened = False              # דגל המצב

servo_5.write(angle)

def getDistance():
    trig.value(0); time.sleep_us(2)
    trig.value(1); time.sleep_us(10)
    trig.value(0)
    duration = time_pulse_us(echo, 1, 26000)
    if duration < 0:
        return -1
    return (duration * 0.034) / 2

while True:
    distance = getDistance()
    print("Distance:", distance, "cm")

    # מישהו התקרב והמכסה סגור → פותחים
    if distance > 0 and distance < 25 and not isOpened:
        for angle in range(90, 10, -1):
            servo_5.write(angle)
            time.sleep(0.005)
        isOpened = True

    # התרחק והמכסה פתוח → סוגרים
    elif distance >= 25 and isOpened:
        time.sleep(0.5)                    # רגע לפני הסגירה
        for angle in range(10, 91):
            servo_5.write(angle)
            time.sleep(0.005)
        isOpened = False

    time.sleep(0.2)

שלוש נקודות

1. הלולאה בתוך התנאי — הסרוו לא קופץ; הוא עובר מעלה-מעלה. זה מה שהופך את התנועה לחלקה.

2. time.sleep(0.5) לפני הסגירה — נותן רגע לזרוק את האשפה.

3. not isOpenedבפייתון כותבים not, לא !. קריא כמו משפט: "אם המכסה לא פתוח".


נסו בעצמכם

  • הסירו את isOpened מהתנאים. מה קורה לסרוו כשהיד נשארת?
  • שנו את ההשהיה ל-3 שניות. נוח יותר?
  • שנו את זוויות הפתיחה. מה הטווח האמיתי של הסרוו שלכם?
  • הוסיפו נורית כשהמכסה פתוח.
  • הוסיפו צליל בכל פתיחה.

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

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

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