דלגו לתוכן המרכזי
KitLab
שיעור קודם
מנורת מצב רוח — כפתור שמחליף צבעים· 25 / 41
מנורת מצב רוח — כפתור שמחליף צבעים
🎬

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

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

מנורת מצב רוח — כפתור שמחליף צבעים

מה בשיעור?

  • להסביר איך שלוש נוריות יוצרות כל צבע
  • לקרוא את מצב הפוטנציומטר עם בלוק read analog pin
  • להבין מה זה משתנה ולמה שומרים בו מספר
  • להשתמש בבלוק map כדי לכווץ 0-4095 לשבע מדרגות
  • לבנות שרשרת של בלוקי if — אחד לכל צבע
  • לשנות ערכי אדום/ירוק/כחול וליצור צבעים משלכם

מה נלמד כאן

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

המנורה שמשנה מצב רוח

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

מנורת לילה צבעונית בחדר ילדים עם כפתור סיבוב

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

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

את נורית ה-RGB הכרתם בשיעור 3, ואת הפוטנציומטר — הכפתור המסתובב — בשיעור 7. כאן מחברים ביניהם.


הרכיבים

נורית RGB

שלוש נוריות, ארבע רגליים. הרגל הארוכה היא הקתודה המשותפת — המינוס של כל השלוש יחד, והיא הולכת ל-GND. שלוש הרגליים האחרות הן הפלוס של האדום, של הירוק ושל הכחול, וכל אחת מקבלת נגד 220Ω משלה ופין משלה על הלוח.

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

פוטנציומטר

כפתור מסתובב עם שלוש רגליים. רגל אחת ל-3.3V, רגל אחת ל-GND, והרגל האמצעית — זו ששולחת את התשובה — לפין 32.

תרשים המעגל — נורית RGB על פינים 5, 16 ו-17 עם נגדי 220 אוהם, ופוטנציומטר על פין 32

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


החיבור

חיבור על לוח הניסוי — פוטנציומטר ונורית RGB מחוברים ללוח ה-ESP32

צריכים: לוח ESP32, לוח ניסוי, פוטנציומטר אחד, נורית RGB אחת ושלושה נגדים של 220Ω.

  1. נורית RGB — הרגל הארוכה אל GND. אדום דרך נגד אל פין 5, ירוק דרך נגד אל פין 16, כחול דרך נגד אל פין 17.
  2. פוטנציומטר — רגל צד אחת אל 3.3V, רגל צד שנייה אל GND, הרגל האמצעית אל פין 32.
  3. פסי החשמל של לוח הניסוי מחוברים ללוח.

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


הבלוקים

תוכנית הבלוקים — משתנה level, בלוק map מ-0-4095 ל-0-6, ושבעה בלוקי if שכל אחד קובע צבע אחר לנורית ה-RGB

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

1. set [level] to (-1)

לפני ה-forever יש בלוק כתום אחד: set [level] to (-1).

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

למה -1 בהתחלה? כי -1 הוא מספר שאף פעם לא יהיה צבע אמיתי. זו דרך להגיד ״עדיין לא קראנו כלום מהכפתור״.

2. forever

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

3. set [level] to (read analog pin [32])

לתוך הקופסה level נכנס עכשיו המספר שהלוח קרא מהפוטנציומטר. אחרי הבלוק הזה, level מחזיק מספר בין 0 ל-4095.

4. map (level) from [0] [4095] to [0] [6]

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

תחשבו על סרגל ארוך של 4096 סנטימטרים, ועליכם להעתיק את המקום שלכם לסרגל קטן שיש בו רק 7 מספרים — 0 עד 6. אם אתם בהתחלה של הסרגל הארוך, אתם בהתחלה גם בקטן. אם אתם באמצע — אתם באמצע. map עושה בדיוק את החישוב הזה.

ארבעת החלונות הלבנים אומרים: מאיפה לאן (from 0 to 4095) ולאיפה לאן (to 0 to 6). אחרי הבלוק הזה, level מחזיק מספר קטן וקל — 0, 1, 2, 3, 4, 5 או 6. שבע מדרגות. שבעה צבעים.

5. שרשרת בלוקי if (level = N) then

מתחת ל-map יושבים שבעה בלוקי if זה אחרי זה. לכל אחד יש חריץ משושה עם בלוק ההשוואה הירוק =, ובתוכו: הקופסה level מצד אחד, מספר מצד שני.

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

6. RGB light red [פין] (עוצמה) green [פין] (עוצמה) blue [פין] (עוצמה)

בתוך כל if יושב בלוק כחול אחד. יש לו שלושה תפריטים נפתחים — הם בוחרים לאיזה פין מחובר כל צבע (אצלנו 5, 16 ו-17) — ושלושה חלונות לבנים, לעוצמה של כל צבע, בין 0 ל-255.

(בצילום מהמדריך התפריטים מוצגים על 0, כי זו תמונת הדגמה. בקובץ המוכן שתורידו הם כבר מוגדרים לפינים הנכונים.)

וזו טבלת הצבעים של התוכנית:

level אדום ירוק כחול הצבע שרואים
0 0 0 0 כבוי
1 255 0 0 אדום
2 0 255 0 ירוק
3 0 0 255 כחול
4 128 0 128 סגול
5 255 255 0 צהוב
6 255 255 255 לבן

באג אמיתי — תמצאו אותו

תסתכלו טוב בתמונה של הבלוקים. שני ה-if האחרונים שניהם בודקים level = 5. אחד מהם היה אמור לבדוק level = 6.

מה יקרה בגלל זה? כשתסובבו עד הסוף, level יהיה 6, אף if לא יתאים — והנורית פשוט תישאר על הצבע הקודם. הלבן לעולם לא יופיע.

זה קורה גם למבוגרים שכותבים תוכניות. מתקנים את זה בשנייה: לוחצים על החלון הלבן ב-if האחרון ומשנים 5 ל-6.


מריצים

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

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

המעגל המורכב — פוטנציומטר ונורית RGB דולקת בכחול על לוח הניסוי

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

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


מה קרה כאן

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

כפתור → מספר גדול (0-4095) → מספר קטן (0-6) → צבע

הטריק המרכזי הוא map. בלי הבלוק הזה הייתם צריכים לכתוב תנאי מסובך לכל טווח — ״אם בין 0 ל-585״, ״אם בין 586 ל-1170״ — וזה מעייף ומלא טעויות. map עושה את החישוב במקומכם ומחזיר מספר קטן שקל להשוות אליו.

המשתנה level הוא ה״זיכרון״ של התוכנית. בלעדיו לא היה איפה לשמור את התשובה בין שלב לשלב.


תרגילים

  1. המציאו צבע. שנו את השורה של level = 4 מ-(128, 0, 128) ל-(255, 100, 0). קיבלתם כתום. נסו גם (0, 255, 255) — תכלת.

  2. פחות מדרגות, יותר בהיר. שנו ב-map את המספר האחרון מ-6 ל-3. עכשיו הכפתור נותן רק ארבעה מצבים, וכל אחד תופס רבע מהסיבוב — הרבה יותר קל לכוון בדיוק.

  3. תקנו את הבאג. שנו את ה-if האחרון מ-level = 5 ל-level = 6 והעלו מחדש. עכשיו הסיבוב עד הסוף נותן לבן.

  4. מנורת לילה חכמה. החליפו את read analog pin [32] בקריאה מחיישן האור של שיעור 6. עכשיו הצבע לא תלוי בכפתור אלא בכמות האור בחדר — כחול בבוקר, אדום בערב.

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

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

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