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

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

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

לחצן שמדליק אור — שתי דרכים, שתי תוכניות

מה בשיעור?

  • להבדיל בין שליטה רגעית לשליטה במצב מתחלף
  • לקרוא בלוק if ולזהות את החור המשושה של התנאי
  • להשתמש בבלוק if/else כדי לבחור בין שתי אפשרויות
  • להכיר את אופרטורי ההשוואה ואת and ו-or
  • להסביר מה זו קפיצת מגע ולמה צריך השהיה
  • לשמור מצב במשתנה ולהפוך אותו בכל לחיצה

מה נלמד כאן

  • שתי דרכים שונות לגמרי לשלוט באור בעזרת לחצן
  • הבלוק if — איך המחשב מקבל החלטה
  • הבלוק if / else — מה לעשות כשהתשובה היא "לא"
  • מה זו קפיצת מגע ולמה לחיצה אחת נספרת לפעמים כשלוש
  • לשמור "מצב" במשתנה ולהפוך אותו בכל לחיצה

שני סוגים של כפתורים

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

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

אצבע לוחצת על פעמון דלת חכם מואר

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

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

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


הידע שצריך

1. בלוק ההחלטה — if

עד עכשיו כל התוכניות שלנו הלכו בקו ישר: בלוק, בלוק, בלוק. עכשיו נלמד לתת ללוח להחליט.

בלוק if then ריק, עם חור משושה לתנאי

if < > then — בלוק כתום מקבוצת Control. יש בו שני מקומות:

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

אם התנאי מתקיים, מה שבפנים רץ. אם לא — הלוח פשוט מדלג עליו וממשיך הלאה.

בעברית פשוטה: "אם קר בחוץ, לבש מעיל." קר? לובשים. לא קר? לא קורה כלום מיוחד.

2. כשיש שתי אפשרויות — if / else

בלוק if then else עם שני חללים מסומנים A ו-B

if < > then ... else ... — אותו בלוק, רק עם מדף שני.

  • החלל A, מתחת ל-then — רץ כשהתשובה כן.
  • החלל B, מתחת ל-else — רץ כשהתשובה לא.

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

בעברית: "אם יורד גשם — קח מטרייה, אחרת — קח כובע."

3. מה נכנס לחור המשושה

בלוק השוואה גדול או שווה ל-50

בלוק השוואה קטן או שווה ל-50

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

בקבוצת Operators תמצאו את כל בלוקי ההשוואה:

הבלוק הפירוש
= שווה ל
!= לא שווה ל
> גדול מ
< קטן מ
>= גדול או שווה ל
<= קטן או שווה ל

4. לחבר שתי שאלות ביחד

בלוק and עם שני חורים משושים

בלוק or עם שני חורים משושים

לפעמים שאלה אחת לא מספיקה. לכן יש בלוקים שמחברים תנאים:

  • and — נכון רק אם שני התנאים נכונים. "אם יום שבת וגם שמש — לים."
  • or — נכון אם לפחות אחד מהם נכון. "אם חולה או חופשה — נשארים בבית."
  • not — הופך את התשובה. מה שהיה כן הופך ללא.

שימו לב שגם לבלוקים האלה יש חורים משושים בתוכם. אפשר לקנן תנאי בתוך תנאי בתוך תנאי, כמו בובות בבושקה.

5. הבעיה הנסתרת — קפיצת מגע

בתוך הלחצן יש שני פסי מתכת קטנים. כשלוחצים, הם נפגשים. אבל הם לא נפגשים בעדינות — הם מתנגשים, קופצים, ומתנגשים שוב, כמה פעמים, בתוך כמה מילישניות. זה נקרא קפיצת מגע (debounce).

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

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


החיבור

סכמה — נורית עם נגד 200 אום על פין IO05, ולחצן עם נגד 10 קילו-אום מ-5V אל פין IO16

שני מעגלים נפרדים, שנפגשים רק בתוכנית:

הרכיב הפין הנגד
נורית IO5 220Ω בדרך ל-GND
לחצן IO16 10kΩ בדרך אל 5V

תרשים חיווט — נורית, נגד ולחצן על לוח הניסוי, מחוברים ללוח ESP32

מה עושה נגד ה-10kΩ? הוא מחזיק את פין 16 צמוד ל-5V כל עוד הלחצן משוחרר, כך שהלוח קורא שם 1. כשלוחצים, הלחצן פותח דרך ישירה ל-GND, והפין צונח ל-0.

זה אולי מרגיש הפוך — ובעצם זה באמת הפוך. תזכרו את המשפט הזה:

⚠️ משוחרר = 1. לחוץ = 0.

בלי נגד ה-10kΩ הפין היה "מרחף" באוויר וקורא מספרים אקראיים, גם כשאף אחד לא נוגע בו.


ניסוי 1 — אור כל עוד לוחצים

תוכנית הבלוקים הראשונה — forever עם if read digital pin 16 = 0 then set pin 5 high else low

שלושה בלוקים בלבד בתוך forever. נקרא אותם בקול:

if < (read digital pin [16]) = [0] > then

read digital pin [16] הוא בלוק עגול מקבוצת Robots. הוא מסתכל על פין 16 ומחזיר את מה שיש שם — 0 או 1. הוא נכנס לתוך בלוק ההשוואה =, וכל המשושה נכנס לחור של ה-if.

התנאי שואל: "האם פין 16 שווה ל-0?" כלומר: "האם הלחצן לחוץ?"

  • כןset digital pin [5] to [high] → הנורית נדלקת.
  • לאelseset digital pin [5] to [low] → הנורית כבית.

וכל זה בתוך forever, כך שהשאלה נשאלת מחדש אלפי פעמים בשנייה.

⬇ להורדת הקובץ Button_light_1.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.

תצלום המעגל — לוח ESP32 מחובר ללוח ניסוי עם נורית אדומה ולחצן אדום

לחצו והחזיקו — הנורית דולקת. הרפו — היא כבית. בדיוק כמו פעמון בדלת.

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


ניסוי 2 — לחיצה מדליקה, לחיצה מכבה

תוכנית הבלוקים השנייה — משתנה light_state, המתנה של 200 מילישניות, wait until, ובלוק if/else מקונן

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

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

המחברת — משתנה

set [light_state] to [0] — בלוק כתום מקבוצת Variables, והוא יושב פעם אחת בראש התוכנית, מחוץ ל-forever.

light_state הוא תיבה קטנה עם שם. בתוכה יושב מספר שאומר מה מצב האור עכשיו: 0 = כבוי, 1 = דלוק. בהתחלה הוא 0, כי האור מתחיל כבוי.

שלב אחרי שלב

if < (read digital pin [16]) = [0] > then — "הלחצן נלחץ?" אם לא, שום דבר לא קורה והסיבוב מתחיל מחדש.

wait [200] milliseconds — זו ההשהיה נגד קפיצות המגע. הלוח עוצר חמישית שנייה ונותן לפסי המתכת להירגע.

wait until < (read digital pin [16]) = [1] > — בלוק חשוב וחדש. הוא עוצר את הכול עד שהתנאי שבתוכו מתקיים. כאן הוא אומר: "חכה עד שהאצבע תעזוב את הלחצן."

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

if < (light_state) = [0] > then ... else ... — ועכשיו ההחלפה עצמה. הלוח מציץ במחברת:

  • אם light_state = 0, כלומר האור כבוי → set digital pin [5] to [high] מדליק אותו, ואז set [light_state] to [1] רושם במחברת "עכשיו דלוק".
  • אחרת, כלומר האור דלוק → set digital pin [5] to [low] מכבה אותו, ואז set [light_state] to [0] רושם "עכשיו כבוי".

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

⬇ להורדת הקובץ Button_light_2.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.

ההסבר המלא על צריבה נמצא בשיעור ההתקנה.

תצלום המעגל בניסוי השני — אותו חיבור של לוח ESP32, נורית ולחצן

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


מה קרה כאן

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

הניסוי הראשון הוא מכונה בלי זיכרון: היא מדווחת על ההווה, כל רגע מחדש.

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

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


תרגילים

  1. הפכו את ההיגיון. בניסוי הראשון שנו את התנאי מ-= [0] ל-= [1]. עכשיו האור דולק כשהלחצן משוחרר ונכבה כשלוחצים. הסבירו לעצמכם למה.

  2. שחקו עם ההשהיה. בניסוי השני שנו את wait [200] milliseconds ל-wait [5] milliseconds. לחצו כמה פעמים. שמים לב שלפעמים לחיצה אחת "קופצת" פעמיים? זו קפיצת המגע במו עיניכם. החזירו ל-200.

  3. הוסיפו נורית שנייה. חברו נורית נוספת לפין IO17, והוסיפו בתוך כל ענף בלוק set digital pin [17] to [ ] הפוך מזה של פין 5. עכשיו כשאחת דולקת השנייה כבית — כמו רמזור קטן.

  4. אתגר — שלושה מצבים. שנו את התוכנית כך שכל לחיצה תעביר בין שלושה מצבים: שתי הנוריות כבויות, רק הראשונה, רק השנייה. רמז: במקום לבדוק אם light_state = 0, ספרו 0, 1, 2 וחזרה ל-0.

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

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

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