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

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

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

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

מה בשיעור?

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

מה נלמד כאן

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

בלי לגעת

היגיינה של פח אשפה היא דבר שמתעלמים ממנו — עד שחושבים עליו.

פח אשפה חכם

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


הידע שצריך

איך זה עובד

עקרון הפעולה

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

זו פעולה ללא מגע (contactless), וזה בדיוק מה שהופך אותה להיגיינית.

הרעיון התכנותי: דגל מצב

כאן נכנס משהו חשוב.

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

הפתרון — משתנה בוליאני שזוכר:

bool isOpened = false;

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

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


ההרכבה

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

שלבי ההרכבה, לפי הסדר:

שלב הרכבה 1

שלב הרכבה 2

שלב הרכבה 3

שלב הרכבה 4

שלב הרכבה 5

שלב הרכבה 6

שלב הרכבה 7

שלב הרכבה 8

שלב הרכבה 9

שלב הרכבה 10

שלב הרכבה 11

שלב הרכבה 12

שלב הרכבה 13

שלב הרכבה 14

שלב הרכבה 15

שלב הרכבה 16

שלב הרכבה 17

שלב הרכבה 18

שלב הרכבה 19

שלב הרכבה 20


הניסוי

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

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

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

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