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

הפתרון נקרא פח חכם. הוא מרגיש שיד מתקרבת, פותח את המכסה לבד, ואחרי שהיד מתרחקת סוגר אותו בחזרה. אף אחד לא נוגע בכלום. זה נקרא שליטה ללא מגע — בדיוק כמו ברז אוטומטי בשירותים ציבוריים או דלת זכוכית שנפתחת לבד בקניון.
בשיעור הזה תבנו פח כזה בעצמכם. לא סימולציה על המסך — פח אמיתי מעץ, עם מכסה שזז. כל מה שצריך בשבילו כבר נמצא בערכה, וכל הידע כבר נמצא אצלכם: למדתם למדוד מרחק עם חיישן אולטרסוני, ולמדתם להזיז מנוע סרוו לזווית מדויקת. עכשיו נחבר את השניים לדבר אחד שעובד.
איך פח חכם חושב
לכל מכשיר חכם יש אותם שלושה שלבים: לחוש, להחליט, לפעול.
- לחוש — החיישן האולטרסוני שולח פעימת קול שאוזן אנושית לא שומעת, ומודד כמה זמן לוקח להד לחזור. מהזמן הזה הלוח מחשב מרחק בסנטימטרים. פעמים רבות בשנייה.
- להחליט — התוכנית משווה את המרחק לגבול שקבענו מראש. בפרויקט שלנו הגבול הוא 25 ס״מ. קרוב מזה? מישהו כאן. רחוק מזה? השטח פנוי.
- לפעול — המנוע מקבל פקודה לסובב את המכסה למעלה או למטה.
הדבר היפה הוא שאותם שלושה שלבים בדיוק מפעילים גם דלת נפתחת בסופר, גם מעלית וגם מכונית אוטונומית. אתם לומדים כאן את המבנה שעליו בנוי כל עולם הבתים החכמים.
הרכיבים
לוח ה-ESP32
המוח של הפח. הוא זה שמודד, משווה ומחליט — ושולח פקודות למנוע.
החיישן האולטרסוני (HC-SR04)
שתי ה"עיניים" הכסופות שלו הן בעצם רמקול ומיקרופון. אחת משדרת פעימת קול, השנייה מקשיבה לה חוזרת. יש לו ארבע רגליים: VCC (מתח), Trig (שדר), Echo (הד) ו-GND (אפס).
מנוע הסרוו
מנוע שיודע להסתובב לזווית מסוימת ולהישאר בה. לא "להסתובב מהר" — אלא "לעמוד על 47 מעלות". בדיוק מה שצריך בשביל מכסה. לסרוו שלושה חוטים: חום או שחור ל-GND, אדום ל-5V, וכתום או צהוב לפין האות.
⚠️ שימו לב: החיישן והסרוו שניהם צריכים 5V, לא 3.3V. אם תחברו אותם לפין הלא נכון החיישן יחזיר מספרים מוזרים והסרוו ירעד.
מרכיבים את הפח
אם לא רכשתם את ערכת לוחות העץ — דלגו על הפרק הזה ועברו ישר ל"החיבור". התוכנית תעבוד מצוין גם עם החיישן והסרוו מונחים על השולחן.
שלב 1 — מתקינים את החיישן האולטרסוני
קחו את לוח החזית עם שני החורים העגולים, והכניסו אליו את שתי ה"עיניים" של החיישן מאחור.

עכשיו חברו ארבעה חוטי דופונט זכר-נקבה לרגלי החיישן. שמרו על סדר צבעים קבוע — זה יחסוך לכם טעויות בהמשך: אדום ל-VCC, כחול ל-Trig, לבן ל-Echo, שחור ל-GND.

שלב 2 — מתקינים את הסרוו
הסרוו נכנס לחריץ שבלוח הצד. מצמידים אותו בשני ברגי M2 באורך 14 מ״מ ושני אומי M2. הדקו יפה אבל בלי כוח — העץ דק.


שלב 3 — הזרוע של הסרוו והלוח התחתון
עצרו רגע. זה השלב הכי חשוב בכל ההרכבה.
לפני שמחברים את זרוע הפלסטיק (ה"הגה") לסרוו, חייבים לאפס את הסרוו ל-90 מעלות. למה? כי הסרוו יכול להסתובב רק בטווח של 0 עד 180 מעלות. אם תרכיבו את הזרוע כשהסרוו נמצא במקום אקראי, המכסה יתחיל את חייו בזווית הלא נכונה ופשוט לא יסגר — או גרוע מזה, ינסה להמשיך להסתובב ויישרף.
הורידו את הקובץ, גררו אותו ל-ACECode ולחצו Upload. הסרוו יקפוץ ל-90 מעלות ויישאר שם. רק אז חברו את הזרוע.
⬇ להורדת הקובץ Servo Initialize.sb3 — מאפס את הסרוו ל-90 מעלות לפני ההרכבה.


הבורג שמחזיק את הזרוע הוא M2.5 באורך 4 מ״מ, והוא מגיע בשקית הברגים הקטנה של הסרוו עצמו — לא בערכת העץ.


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



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



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



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


החיבור
התרשים החשמלי מראה את המעגל בצורה "נקייה", בלי לוח ובלי חוטים מסתלסלים:

וזאת אותה תמונה בדיוק, רק כמו שהיא נראית על השולחן שלכם:

| מאיפה | לאן בלוח |
|---|---|
| סרוו — חוט אות (כתום) | פין 5 |
| סרוו — אדום | 5V |
| סרוו — חום/שחור | GND |
| אולטרסוני — VCC | 5V |
| אולטרסוני — Trig | פין 16 |
| אולטרסוני — Echo | פין 17 |
| אולטרסוני — GND | GND |
תזכרו את שני המספרים האלה: 16 שולח, 17 מקשיב. הם יופיעו עוד מעט בתוך הבלוקים.
הבלוקים
זאת התוכנית המלאה. היא נראית ארוכה, אבל היא בנויה משני חלקים בלבד: "פתח" ו"סגור".

ההכנות שלמעלה
מתחת לכובע הצהוב start the program יש ארבעה בלוקים כתומים שרצים פעם אחת בלבד:
- set [distance] data type [float] — מכינים משתנה בשם distance ואומרים ללוח שהוא יחזיק מספר עם נקודה עשרונית. מרחק הוא לא תמיד מספר שלם — 23.7 ס״מ זה מרחק לגיטימי.
- set [distance] to (0) — מתחילים מאפס.
- set [angle] to (90) — המשתנה angle יחזיק את הזווית הנוכחית של המכסה. 90 מעלות = מכסה סגור.
- servo [5] angle (angle) — הבלוק הכחול שמזיז את הסרוו. מספר הפין בתיבה הראשונה, הזווית בתיבה השנייה. כאן הוא מקבל את המשתנה angle, כלומר שולח את הסרוו ל-90 ומוודא שהמכסה סגור ברגע ההדלקה.
הלולאה הגדולה
הבלוק forever הוא בלוק עוטף — יש לו פה פתוח וכל מה שנכנס לתוכו רץ שוב ושוב בלי סוף. כל מה שנשאר בתוכנית יושב בתוכו.
שורה ראשונה בפנים: serial print [115200] (ultrasonic(cm) trig [16] echo [17]) — שולחת את המרחק למסך המחשב. זה לא נחוץ לפעולה של הפח, אבל זה הכלי הכי טוב לבדוק שהחיישן עובד. פתחו את חלון המסך הטורי ותראו מספרים משתנים כשאתם מזיזים את היד.
שורה שנייה: set [distance] to (ultrasonic(cm) trig [16] echo [17]) — אותה מדידה בדיוק, רק שהפעם היא נשמרת במשתנה כדי שנוכל להשוות אותה.
שימו לב לצורה: הבלוק ultrasonic(cm) הוא בלוק עגלגל — הוא לא פקודה, הוא ערך. לכן הוא יושב בתוך בלוק אחר, בחור העגול. בלוק עגלגל תמיד עונה על שאלה "כמה?".
התנאי שפותח
if <(distance) > (0) and (distance) < (25) and (isOpened) = (0)> then
הבלוק if הוא הבלוק המקבל החלטות, ויש לו חריץ משושה (בצורת יהלום מוארך) שמקבל רק תנאים. כאן נכנסו לתוכו שלושה תנאים מחוברים בבלוקי and — כולם חייבים להתקיים:
- distance > 0 — למה בכלל? כי לפעמים החיישן מפספס את ההד ומחזיר 0. אם לא נסנן את זה, הפח ייפתח סתם.
- distance < 25 — מישהו קרוב מ-25 ס״מ.
- isOpened = 0 — המכסה כרגע סגור.
התנאי השלישי הוא הגאוני. isOpened הוא מה שקוראים לו משתנה דגל — משתנה שמחזיק רק 0 או 1 ומסמן "מצב". בלעדיו, כל עוד היד שלכם נמצאת מול הפח התוכנית תנסה לפתוח אותו שוב ושוב, כמה פעמים בשנייה, והמכסה ירעד במקום. הדגל אומר: "כבר פתחתי, תירגע."
פתיחה איטית — repeat until
בתוך התנאי יושב repeat until <(angle) <= (10)> — לולאה שחוזרת עד ש... בתוכה שלושה בלוקים:
- servo [5] angle (angle) — הזז את הסרוו לזווית הנוכחית
- change [angle] by (-1) — הורד את הזווית במעלה אחת
- wait (5) milliseconds — חכה חמש אלפיות שנייה
הלולאה חוזרת עד ש-angle יורד ל-10. כלומר המכסה עובר מ-90 ל-10 מעלה-מעלה, עם המתנה זעירה בין כל צעד. למה לא פשוט לשלוח את הסרוו ישר ל-10? כי אז המכסה היה נזרק למעלה במכה אחת, מקפיץ את כל הפח ואולי שובר את הזרוע. הלולאה הזאת היא מה שהופך תנועה חדה לתנועה חלקה.
אחרי הלולאה: set [isOpened] to (1) — מרימים את הדגל. פתחנו.
התנאי שסוגר
if <(distance) > (25) and (isOpened) = (1)> then
המרחק גדל מעל 25 ס״מ והמכסה פתוח. אז:
- wait (500) milliseconds — חצי שנייה של סבלנות. אולי היד רק זזה רגע הצידה וכבר חוזרת.
- repeat until <(angle) >= (90)> עם change [angle] by (1) — אותה תנועה איטית, רק בכיוון ההפוך, מ-10 בחזרה ל-90.
- set [isOpened] to (0) — מורידים את הדגל. סגרנו.
מריצים
⬇ להורדת הקובץ Smart_Trash_Can.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.
יש כאן שני קבצים ולכל אחד תפקיד אחר:
- Servo Initialize.sb3 — צורבים אותו פעם אחת, לפני ההרכבה. הוא רק מעמיד את הסרוו על 90 מעלות.
- Smart_Trash_Can.sb3 — זאת התוכנית האמיתית של הפח, וזאת שנשארת על הלוח.
ההסבר המלא על צריבה נמצא בשיעור ההתקנה.
אחרי שהצריבה מסתיימת, קרבו את היד אל החזית של הפח. המכסה יעלה לאט. הרחיקו את היד, חכו חצי שנייה — והוא יירד בחזרה.

לא עובד? עברו על הרשימה:
- המכסה לא זז בכלל → בדקו שחוט האות של הסרוו נמצא בפין 5 ושהאדום ב-5V.
- המכסה רועד ולא מפסיק → הזרוע כנראה הורכבה בלי איפוס ל-90. חזרו לשלב 3.
- הפח נפתח לבד בלי שאף אחד מתקרב → החיישן "רואה" את לוח העץ שמולו. בדקו שהוא מיושר קדימה.
- שום דבר לא קורה → פתחו את המסך הטורי. אם המספרים תקועים על 0, Trig ו-Echo כנראה התחלפו.
מה קרה כאן
חיברנו ארבעה רעיונות לכדי מכשיר אחד:
מדידה (הבלוק העגלגל ultrasonic) נכנסת למשתנה, המשתנה נבדק בתנאי, והתנאי מפעיל לולאה שמזיזה מנוע מעלה-מעלה. ומעל הכול שומר הדגל — משתנה קטן שזוכר מה כבר עשינו, וחוסך מהפח להשתגע.
זה בדיוק אותו מבנה שנמצא בדלת של קניון, במכסה של מכונת כביסה ובמעלית. מכאן והלאה, כשתראו מכשיר שפועל לבד — תדעו לנחש איך הוא בנוי מבפנים.
תרגילים
- פח רגיש יותר. שנו את המספר בבלוק if <(distance) < (25)> מ-25 ל-10. עכשיו צריך להתקרב ממש. אל תשכחו לשנות גם את ה-25 בתנאי הסגירה — אחרת המכסה ייפתח ולא יידע מתי להיסגר.
- פתיחה מהירה, סגירה איטית. בלולאת הפתיחה שנו את wait (5) milliseconds ל-2, ובלולאת הסגירה ל-15. תקבלו מכסה שקופץ למעלה ויורד בעדינות.
- מכסה שנשאר פתוח יותר זמן. הגדילו את wait (500) milliseconds שבתחילת תנאי הסגירה ל-3000. עכשיו יש לכם שלוש שניות שלמות לזרוק את הזבל.
- אתגר — פח שמודיע. הוסיפו זמזם לפין פנוי, ובתוך תנאי הפתיחה, מיד אחרי set [isOpened] to (1), שתלו בלוק buzzer frequency קצר. הפח יצפצף "שלום" בכל פתיחה. רמז: תצטרכו גם בלוק buzzer stop אחרי המתנה קצרה.


