מה נלמד כאן
- מה ההבדל בין אות דיגיטלי (רק דולק או כבוי) לבין אות אנלוגי (כל דבר באמצע)
- מה זה PWM ואיך אפשר לזייף איתו מתח באמצע
- מה זה משתנה ואיך יוצרים אחד ב-ACECode
- מה זה לולאה עם תנאי ומתי היא נעצרת
- הבלוקים write analog pin, repeat until, set, change ו-wait milliseconds
למה אור שנושם יפה יותר
תסתכלו על שלט של מחשב נייד כשהוא ישן. האור הקטן לא מהבהב חד — הוא מתחזק לאט ונחלש לאט, כמו נשימה. זה נראה רגוע, כמעט חי.

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

הוא נותן לפין רק שתי אפשרויות: high או low. אין שום דבר באמצע. אות כזה נקרא אות דיגיטלי, והוא בדיוק כמו שאלת נכון או לא נכון — יש רק שתי תשובות.
הרבה דברים בעולם עובדים ככה: מנעול חכם נעול או פתוח, גלאי עשן צופר או שקט, כפתור לחוץ או משוחרר. פשוט, מהיר ואמין.
אבל בעולם האמיתי רוב הדברים לא כאלה. טמפרטורה לא קופצת מ-0 ל-30 — היא עולה לאט דרך כל המספרים באמצע. וכך גם קול, אור ומהירות. ערך שיכול להיות כל דבר בטווח נקרא אות אנלוגי.
⚠️ והנה הבעיה: ה-ESP32 לא באמת יודע להוציא מתח אנלוגי. הוא יודע רק high ו-low. אז איך בכל זאת נקבל אור בחצי עוצמה? בעזרת טריק שנקרא PWM.
PWM — איך מזייפים מתח באמצע
PWM הוא קיצור של Pulse Width Modulation, ובעברית: שינוי רוחב הפעימה.
הרעיון פשוט להפליא. הלוח מדליק ומכבה את הפין מהר מאוד — אלפי פעמים בשנייה. העין שלכם לא מסוגלת לעקוב אחרי זה, אז היא רואה רק את הממוצע.

בתרשים יש שני מושגים:
- מחזור (Pulse Period) — הזמן של פעימה שלמה אחת, מההתחלה עד שהכול חוזר על עצמו.
- רוחב הפעימה (Pulse Width) — כמה זמן מתוך המחזור הפין היה דולק.
היחס ביניהם נקרא מחזור עבודה (Duty Cycle), והוא כל הסיפור. ככל שהפין דולק חלק גדול יותר מהמחזור — המתח הממוצע גבוה יותר, והנורית בהירה יותר.
תראו מה קורה כשמשנים את היחס:
0% — הפין תמיד כבוי. המתח הממוצע 0V. הנורית חשוכה.

25% — רבע מהזמן דולק. הנורית מאירה חלש.

50% — חצי מהזמן דולק. הנורית בערך בחצי עוצמה.

75% — שלושה רבעים מהזמן דולק. הנורית כמעט מלאה.

100% — הפין תמיד דולק. הנורית בעוצמה מלאה.

זה הטריק. הלוח לא באמת מוציא מתח באמצע — הוא מרצד כל כך מהר שהתוצאה נראית כמו מתח באמצע. כמו מניפה שמסתובבת מהר ונראית כמו עיגול שקוף.
הבלוק שעושה את זה
ב-ACECode הבלוק נקרא write analog pin [5] to [0], והוא נמצא במגירה Robots.
התפריט הראשון בוחר את הפין, והתיבה הלבנה מקבלת מספר בין 0 ל-255. המספר הזה הוא מחזור העבודה: 0 זה 0%, 255 זה 100%.

הערך 0 — הנורית כבויה לגמרי.

הערך 127 — בערך חצי עוצמה.

הערך 255 — עוצמה מלאה.
💡 למה דווקא 255? כי זה המספר הגדול ביותר שאפשר לשמור בבית אחד של זיכרון. תחשבו על זה כמו סרגל עם 256 קווים, מ-0 עד 255.
משתנה — קופסה עם מספר בתוכה
עכשיו אנחנו יודעים לקבוע עוצמה. אבל אור נושם צריך שהעוצמה תשתנה כל הזמן — 0, 5, 10, 15... עד 255, ואז בחזרה למטה.
אנחנו לא נכתוב 52 בלוקים. במקום זה נשתמש במשתנה.
משתנה הוא קופסה עם שם, שאפשר לשמור בתוכה מספר. אפשר להסתכל מה יש בפנים, ואפשר להחליף את מה שבפנים מתי שרוצים. בתוכנית שלנו הקופסה תיקרא lightness (עוצמה), והיא תזכור כמה חזק הנורית מאירה עכשיו.
איך יוצרים משתנה ב-ACECode
לוחצים על המגירה Variables, ואז על Make a Variable. נפתח חלון קטן שבו כותבים את השם:

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

💡 במצב Online mode אפשר לסמן את המשתנה כדי לראות על המסך את הערך שלו משתנה בזמן אמת. זה עוזר מאוד כשמשהו לא עובד וצריך להבין למה.
לולאה עם תנאי
בשיעור הקודם הכרנו את forever — לולאה שלא נגמרת לעולם. עכשיו נכיר לולאה אחרת: כזאת שנעצרת כשמשהו קורה.
הבלוק נקרא repeat until, והוא נמצא במגירה Control. הצורה שלו מעניינת: יש לו זרוע שעוטפת בלוקים בתוכה, ולמעלה יש חור בצורת משושה — שם נכנס התנאי.
הנה הלב של התוכנית:

תקראו את זה בקול:
- set [lightness] to [0] — שמים 0 בקופסה. הנורית חשוכה.
- repeat until [lightness = 255] — חזור שוב ושוב עד שהקופסה מגיעה ל-255. בתוך הלולאה: change [lightness] by [5] מוסיף 5 בכל סיבוב. 0, 5, 10, 15... הנורית מתחזקת.
- כשהקופסה הגיעה ל-255, הלולאה נעצרת ועוברים ללולאה הבאה.
- repeat until [lightness = 0] — חזור עד שהקופסה מגיעה ל-0. בתוכה change [lightness] by [-5] מוריד 5 בכל סיבוב. הנורית נחלשת.
עלייה, ירידה, עלייה, ירידה. זאת הנשימה.
החיבור
החיבור זהה בדיוק לשיעור הראשון. אם המעגל שלכם עדיין בנוי — אפשר פשוט להמשיך.
מה צריך: לוח ESP32, לוח ניסוי 400 נקודות, נורית LED אחת, ונגד 220Ω אחד.

הזרם יוצא מפין IO5, עובר בנגד, ממשיך בנורית ומסיים ב-GND.

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

ועכשיו בלוק־בלוק:
set [lightness] data type [integer]

בלוק מהמגירה Variables. הוא אומר איזה סוג מספר נשמור בקופסה. integer פירושו מספר שלם — בלי נקודה עשרונית. אם לא תשימו את הבלוק הזה, הלוח יניח בעצמו שמדובר במספר שלם.
set [lightness] to [0]

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

בלוק מהמגירה Operators. הצורה המשושה שלו מתאימה בדיוק לחור המשושה של repeat until. הוא בודק אם שני הדברים בשני הצדדים שווים, ועונה כן או לא.
בתוכנית שלנו נשים בצד השמאלי את המשתנה lightness, ובצד הימני את המספר 255 (או 0). ככה הלולאה יודעת מתי להיעצר.
change [lightness] by [5]
בלוק מהמגירה Variables. הוא מוסיף לקופסה את המספר שכתבתם. מספר חיובי מעלה, מספר שלילי מוריד. לכן בלולאת העלייה כתוב 5, ובלולאת הירידה כתוב מינוס 5.
write analog pin [5] to [lightness]

שימו לב לדבר היפה שקורה כאן: במקום מספר קבוע, גוררים את המשתנה עצמו לתוך התיבה הלבנה. עכשיו כל שינוי בקופסה משנה מיד את עוצמת הנורית.
wait [20] milliseconds

בלוק המתנה, אבל הפעם במילישניות — אלפיות השנייה. 1000 מילישניות הן שנייה אחת.
למה כל כך קצר? כי יש 51 צעדים בכל כיוון. אם כל צעד יחכה שנייה שלמה, נשימה אחת תיקח כמעט שתי דקות. עם 20 מילישניות כל כיוון לוקח בערך שנייה — וזה בדיוק הקצב של נשימה.
מריצים
⬇ להורדת הקובץ Breathing_light.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.
עוברים ל-Upload mode, בוחרים ESP32, בוחרים את הפורט הנכון ולוחצים Upload. מחכים שהמונה יגיע ל-100%.
ההסבר המלא על צריבה נמצא בשיעור ההתקנה.
מה אמור לקרות

הנורית מתחזקת לאט עד למקסימום, ואז נחלשת לאט עד שהיא כבית — וחוזר חלילה. בלי קפיצות, בלי הבהובים. היא נושמת.
לא עובד?
- אם הנורית פשוט מהבהבת חד במקום להתחזק בהדרגה — בדקו שהיא מחוברת לפין שתומך ב-PWM, ושהבלוק הוא write analog pin ולא set digital pin.
- אם היא דולקת בעוצמה קבועה — בדקו שגררתם את המשתנה lightness לתוך התיבה של write analog pin, ולא השארתם שם מספר.
- אם שום דבר לא קורה — בדקו את הכיוון של הנורית ואת הצריבה.
מה קרה כאן
הלוח רץ בלולאה אינסופית, ובתוכה שתי לולאות מותנות:
- הקופסה lightness מתחילה ב-0.
- לולאת עלייה: מוסיפים 5 לקופסה, שולחים את הערך החדש לנורית, מחכים 20 מילישניות. חוזרים — עד שהקופסה מגיעה ל-255.
- לולאת ירידה: מורידים 5 מהקופסה, שולחים לנורית, מחכים. חוזרים — עד שהקופסה מגיעה ל-0.
- הבלוק forever מחזיר אותנו להתחלה.
שני רעיונות גדולים נכנסו לכם לתוכנית היום. הראשון: משתנה — מספר ששומרים ומשנים, במקום לכתוב הכול מראש. השני: לולאה מותנית — לולאה שיודעת מתי לעצור.
שניהם ילוו אתכם בכל שאר הקורס.
תרגילים
- נשימה איטית. שנו את שני בלוקי wait [20] milliseconds ל-50. הנשימה תהיה איטית ורגועה יותר. נסו גם 5 — מה קורה?
- קפיצות גדולות. שנו את change [lightness] by [5] ל-25 (ואת השני למינוס 25). הנורית תקפוץ בין עוצמות במקום לזרום. למה זה קורה?
- חצי נשימה. שנו את המספר בבלוק ההשוואה של הלולאה הראשונה מ-255 ל-100. הנורית תעלה רק עד עוצמה בינונית ותרד. שימו לב: מה צריך לשנות כדי שהלולאה השנייה עדיין תעבוד?
- אתגר: שתי נוריות מתחלפות. הוסיפו נורית שנייה על פין אחר עם נגד 220Ω, והוסיפו בלוק write analog pin נוסף שמקבל את 255 פחות lightness. כשאחת מתחזקת — השנייה נחלשת.


