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

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

חיישן מזהה התקרבות. מתחת לסף — הסרוו פותח. כשמתרחקים — נסגר אחרי השהיה.
דגל מצב
הבעיה: אם התוכנית פשוט "פותחת כשקרוב" — היא תפתח בכל סיבוב לולאה כל עוד היד שם. הסרוו ירעד.
הפתרון:
isOpened = False
פותחים רק אם סגור. סוגרים רק אם פתוח. זה דגל מצב.
הכרתם רעיון דומה בשיעור 19 (מתג מתחלף) ובשיעור 25 (נעילת הטריוויה). תוכנית שזוכרת מה עשתה מתנהגת אחרת מתוכנית שרק מגיבה.
ההרכבה
בלי ערכת הבנייה — דלגו לקוד.
שלבי ההרכבה:

















הניסוי
המטרה: זיהוי ב-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 שניות. נוח יותר?
- שנו את זוויות הפתיחה. מה הטווח האמיתי של הסרוו שלכם?
- הוסיפו נורית כשהמכסה פתוח.
- הוסיפו צליל בכל פתיחה.


