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

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

חיישן — אולטרסוני או אינפרה-אדום — מזהה התקרבות. כשהמרחק קטן מהסף, הסרוו פותח את המכסה. כשהחפץ מתרחק, המכסה נסגר אחרי השהיה.
זו פעולה ללא מגע (contactless), וזה בדיוק מה שהופך אותה להיגיינית.
הרעיון התכנותי: דגל מצב
כאן נכנס משהו חשוב.
הבעיה: אם התוכנית פשוט "פותחת כשקרוב" — היא תפתח שוב ושוב בכל סיבוב של הלולאה כל עוד היד שם. הסרוו ירעד ולא יעצור.
הפתרון — משתנה בוליאני שזוכר:
bool isOpened = false;
פותחים רק אם סגור. סוגרים רק אם פתוח. המשתנה הזה נקרא דגל מצב, והוא מונע פעולה כפולה.
הכרתם רעיון דומה בשיעור 19 (מתג מתחלף) ובשיעור 25 (נעילת לחצן הטריוויה). זה אותו עיקרון: תוכנית שזוכרת מה עשתה קודם מתנהגת אחרת לגמרי מתוכנית שרק מגיבה.
ההרכבה
בלי ערכת הבנייה — אפשר לדלג להרכבה ולעבור ישר לקוד. הפרויקט יעבוד עם סרוו וחיישן בלבד.
שלבי ההרכבה, לפי הסדר:




















הניסוי
המטרה: זיהוי בטווח 25 ס"מ פותח את המכסה; התרחקות סוגרת אותו.
רשימת רכיבים
| הרכיב | כמות |
|---|---|
| לוח ESP32 | 1 |
| חיישן אולטרסוני | 1 |
| סרוו | 1 |
הקוד
#include <ESP32Servo.h>
#define TRIG_PIN 5
#define ECHO_PIN 16
#define SERVO_PIN 17
Servo myServo;
int angle = 90;
bool isOpened = false; // דגל המצב
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
myServo.setPeriodHertz(50); // 50Hz — תדר סרוו תקני
myServo.attach(SERVO_PIN, 500, 2500);
myServo.write(angle); // מצב התחלתי: סגור
}
void loop() {
float distance = readDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// מישהו התקרב והמכסה סגור → פותחים
if (distance > 0 && distance < 25 && isOpened == false) {
for (angle = 90; angle > 10; angle--) {
myServo.write(angle);
delay(5); // תנועה חלקה
}
isOpened = true;
}
// התרחק והמכסה פתוח → סוגרים
else if (distance >= 25 && isOpened == true) {
delay(500); // המתנה לפני סגירה
for (angle = 10; angle < 90; angle++) {
myServo.write(angle);
delay(5);
}
isOpened = false;
}
delay(200);
}
שלוש נקודות בקוד
1. הלולאה בתוך התנאי — הסרוו לא קופץ מ-90 ל-10; הוא עובר מעלה-מעלה עם delay(5). זה מה שגורם לתנועה להיראות חלקה ולא מכנית.
2. delay(500) לפני הסגירה — נותן למשתמש רגע לזרוק את האשפה. בלעדיו המכסה היה נסגר ברגע שהיד מתרחקת.
3. distance > 0 — הבדיקה שכבר מכירים משיעור 31: מונעת פתיחה כשהחיישן לא קיבל הד.
נסו בעצמכם
- הסירו את
isOpenedמהתנאים והריצו. מה קורה לסרוו כשהיד נשארת? - שנו את
delay(500)ל-3000. נוח יותר או פחות? - שנו את זוויות הפתיחה. מה הטווח שהסרוו שלכם באמת מסוגל לו?
- הוסיפו נורית שנדלקת כשהמכסה פתוח.
- הוסיפו צליל קצר בכל פתיחה.


