מה נלמד כאן
- מה ההבדל בין מכשיר שמחכה ללחיצה לבין מכשיר שמחליט בעצמו
- איך מכניסים קריאה מחיישן ישירות לתוך תנאי, בלי לשמור אותה קודם
- מה עושה הבלוק and ולמה הוא נחוץ כשרוצים ״בין X ל-Y״
- איך שלושה בלוקי if יוצרים שלוש מדרגות חום
- למה חשוב לחשוב על המספרים שנופלים בין התנאים
מכשיר שמחליט לבד
עד עכשיו כל מה שבניתם חיכה לכם. כפתור שלוחצים, שלט שמכוונים, בננה שנוגעים בה. תמיד היה אדם שהתחיל את הפעולה.
עכשיו נבנה משהו אחר: מכשיר שאף אחד לא נוגע בו, והוא בכל זאת פועל. הוא יושב בחדר, מודד את החום שוב ושוב, ומחליט בעצמו מתי להתחיל לנשוב ובאיזו עוצמה.
אתם מכירים את זה מהמקרר בבית. אף אחד לא מדליק את המקרר — הוא מרגיש שהתחמם, מפעיל את המנוע, מקרר, ונרגע. וגם מהמחשב: כשמשחקים משחק כבד, המאווררים בפנים מתחילים להיות רועשים. אף אחד לא לחץ עליהם. הם הרגישו את החום.

מערכת כזאת נקראת בקרה סגורה: מודדים, מחליטים, פועלים — והפעולה משנה את מה שמודדים, אז מודדים שוב. מעגל שלא נגמר. חממות חקלאיות עובדות ככה, חדרי שרתים עובדים ככה, וגם התנור בבית.
הרכיבים
שני הרכיבים כבר מוכרים לכם, אז נזכיר רק את מה שחשוב לפרויקט הזה.
חיישן הטמפרטורה DHT11
את ה-DHT11 פגשתם בשיעור 12. הקופסה הכחולה הקטנה עם החורים מודדת טמפרטורה ולחות ומוסרת אותן ללוח דרך חוט מידע אחד.
שלושה דברים שכדאי לזכור עליו כאן:
- הוא איטי. הוא מוכן למדידה חדשה בערך פעם בשנייה, ולכן בתוכנית שלנו יש המתנה של שנייה שלמה בסוף כל סבב.
- הוא מודד את החום בדיוק במקום שבו הוא יושב, ולא את החום של החדר בממוצע. אם תנשמו עליו הוא יעלה מייד.
- הדיוק שלו הוא בערך מעלה אחת. זה בסדר גמור לפרויקט כזה, אבל אל תצפו מ-30.4 להיות מדויק.
המנוע ומודול ההנעה
המנוע ומודול ההנעה L9119S נלמדו בשיעור 10, ואת אותו חיבור בדיוק ראיתם בשיעור 27. שני פיני השליטה A-1A ו-A-1B עובדים כזוג, ובפרויקט הזה — כמו בקודם — A-1B יישאר תמיד על 0 ואת המהירות נשלח דרך A-1A.
החיבור

| חיבור | לאן |
|---|---|
| A-1A (מודול הנעה) | פין 5 |
| A-1B (מודול הנעה) | פין 16 |
| VCC (מודול הנעה) | 5V |
| GND (מודול הנעה) | GND |
| Vcc (DHT11) | 5V |
| Data (DHT11) | פין 17 |
| GND (DHT11) | GND |
שימו לב לרגל השלישית של ה-DHT11 בסכמה, זו שכתוב עליה NC. זה קיצור של ״לא מחובר״ — היא לא הולכת לשום מקום. אל תנסו לחבר אליה כלום.

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

התוכנית הזאת קצרה להפליא ביחס למה שהיא עושה. כולה יושבת בתוך forever — הבלוק הכתום שעוטף את מה שבפנים וחוזר עליו בלי סוף.
בלוק החיישן
הבלוק הירוק humiture [17] temperature הוא הלב. שימו לב לצורה שלו — הוא עגול, כלומר הוא מספר ולא פעולה. אי אפשר להניח אותו לבד בתוכנית; הוא תמיד נכנס לתוך חור של בלוק אחר.
יש לו שתי תיבות בחירה:
- 17 — מספר הפין שאליו מחובר החיישן. אם תעבירו את החוט לפין אחר, תשנו כאן.
- temperature — מה למדוד. אם תפתחו את התיבה תראו גם humidity, כי אותו חיישן מודד גם לחות. כאן אנחנו רוצים חום.
מדפיסים לקונסול
serial print [115200] (humiture [17] temperature) — שולח את הטמפרטורה הנוכחית למחשב.
זה לא משפיע על המאוורר, אבל בלי זה אתם עובדים בעיוורון. הקונסול הוא מד החום שלכם: הוא מראה בדיוק את המספר שהתוכנית רואה, ובלעדיו אי אפשר לדעת אם המאוורר לא עובד בגלל תקלה או פשוט כי בחדר קריר.
שלוש המדרגות
עכשיו שלושה בלוקי if בזה אחר זה. כל אחד בודק תחום חום אחר.
מדרגה ראשונה — קר, עוצרים:
if < humiture [17] temperature < [30] > then write analog pin [5] to [0] write analog pin [16] to [0]
״אם הטמפרטורה קטנה מ-30 מעלות — שלח 0 לשני הפינים.״ שני אפסים פירושם: אין הפרש מתח על המנוע, המנוע עומד.
מדרגה שנייה — נעים, מאטים:
if < (humiture [17] temperature > [30]) and (humiture [17] temperature < [32]) > then write analog pin [5] to [220] write analog pin [16] to [0]
זה התנאי המעניין בשיעור. הבלוק and הוא בלוק ירוק בצורת משושה שיש בתוכו שני חורים משושים נוספים, אחד משמאל ואחד מימין. הוא מחזיר ״נכון״ רק אם שני התנאים שבתוכו נכונים בו-זמנית.
תקראו אותו בקול: ״אם החום גדול מ-30 וגם קטן מ-32.״ ככה תופסים תחום בין שני מספרים. עם בלוק השוואה אחד אי אפשר — תמיד צריך שניים ו-and ביניהם.
שימו לב שבלוק humiture מופיע כאן פעמיים, פעם בכל צד. זה בסדר גמור — כל אחד מהם קורא את החיישן בנפרד.
מדרגה שלישית — חם, מלוא הכוח:
if < humiture [17] temperature > [32] > then write analog pin [5] to [255] write analog pin [16] to [0]
״אם החום גדול מ-32 — מהירות מלאה.״
מה המספרים 220 ו-255 אומרים
הבלוק write analog pin מקבל מספר בין 0 ל-255, והמספר הזה הוא אחוז הזמן שהפין דלוק. הלוח מדליק ומכבה את הפין מאות פעמים בשנייה; המנוע כבד מדי כדי להספיק להגיב לכל הבהוב, אז הוא פשוט מרגיש את הממוצע ומסתובב בהתאם. השיטה נקראת PWM.
אז 255 הוא ״דלוק כל הזמן״ — כוח מלא. 220 הוא בערך 86% — מהירות נמוכה יותר, שקטה יותר. ו-0 הוא כיבוי מוחלט.
למה לא 128 למהירות הנמוכה? כי מנוע קטן צריך מינימום כוח רק כדי להתחיל להסתובב. מתחת לערך מסוים הוא רק מזמזם ולא זז.
ההמתנה בסוף
wait [1000] milliseconds — שנייה שלמה בין סבב לסבב.
היא כאן משתי סיבות. הראשונה: ה-DHT11 פיזית לא מסוגל לתת מדידה חדשה מהר יותר. השנייה: טמפרטורה של חדר לא משתנה בעשירית שנייה, אז אין שום טעם לבדוק מהר יותר.
החורים בסולם — תשימו לב לזה
תסתכלו שוב על שלושת התנאים ותשאלו את עצמכם: מה קורה בדיוק ב-30.0 מעלות?
התנאי הראשון דורש קטן מ-30 — לא מתקיים. השני דורש גדול מ-30 — לא מתקיים. השלישי דורש גדול מ-32 — לא מתקיים.
אף תנאי לא מתקיים, ולכן שום פקודה לא נשלחת למנוע. הוא פשוט ממשיך לעשות מה שעשה קודם. אותו דבר קורה בדיוק ב-32.0.
זה לא באג חמור — במציאות הטמפרטורה כמעט אף פעם לא נוחתת בדיוק על מספר עגול, והמנוע גם ככה יתעדכן בסבב הבא. אבל זו דרך חשיבה ששווה לאמץ: כשאתם בונים סולם של תנאים, תעברו על הגבולות ותבדקו שכל מספר אפשרי נופל למקום כלשהו. בתרגיל 2 תתקנו את זה.
מריצים
⬇ להורדת הקובץ Smart_Temperature_Controlled_Fan.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.
ההסבר המלא על צריבה נמצא בשיעור ההתקנה.
אחרי הצריבה, פתחו את הקונסול ותראו את הטמפרטורה מתעדכנת פעם בשנייה.

עכשיו הבעיה: בחדר ממוזג המספר יהיה בערך 24, והמאוורר לא יזוז לעולם. אז איך בודקים שזה עובד?
עטפו את החיישן בכף היד למשך חצי דקה. תראו בקונסול את המספר מטפס — 26, 28, 30 — וברגע שהוא עובר את 30, המדחף מתחיל לנשוב. תעזבו, והוא יירגע ויעצור.
אם גם זה לא מספיק — שנו את הספים. תראו בקונסול מה החום אצלכם, ותציבו במקום 30 ו-32 מספרים שנמצאים סביב הערך הזה. זה בדיוק מה שמהנדס אמיתי היה עושה.
מה קרה כאן
הלולאה עושה שלושה דברים, שוב ושוב, פעם בשנייה: מודדת, משווה, מגיבה.
המדידה מגיעה מבלוק אחד ירוק. ההשוואה קורית בשלושה בלוקי if שמחלקים את כל טווח הטמפרטורות לשלושה אזורים. התגובה היא מספר יחיד שנשלח לפין 5.
ומה שיפה כאן הוא מה שאין בתוכנית: אין כפתור, אין שלט, אין משתמש. החיישן החליף את האצבע. וזה כל ההבדל בין מכשיר רגיל למכשיר חכם.
תרגילים
כוונו לחדר שלכם. קראו בקונסול את הטמפרטורה בחדר, ושנו את שני המספרים בתנאים כך שהמדרגה הראשונה תתחיל שתי מעלות מעל מה שראיתם. עכשיו נשיפה קלה על החיישן אמורה להפעיל את המאוורר.
סגרו את החורים. בתנאי השני שנו את > [30] ל-> [29], ובתנאי השלישי שנו את > [32] ל-> [31]. עכשיו עברו בראש על המספרים 29, 30, 31, 32 ו-33 ובדקו שכל אחד מהם נופל למדרגה כלשהי.
מדרגה רביעית. הוסיפו בלוק if נוסף לחום קיצוני: מעל 35 מעלות, המנוע על 255 וגם נורית אדומה על פין 2 נדלקת עם set digital pin [2] to [high].
מאוורר לחות. שנו את תיבת הבחירה בכל בלוקי humiture מ-temperature ל-humidity, ושנו את הספים ל-60 ו-70. עכשיו המאוורר מגיב ללחות במקום לחום. איפה בעולם האמיתי היו רוצים דבר כזה?
אתגר — בלי קפיצות. נסו להוסיף את הרעיון משיעור 27: משתנה בשם fanSpeed שכל תנאי כותב אליו, ובלוק write analog pin יחיד בסוף הלולאה. התוכנית תתקצר ותהיה קלה יותר לשינוי.


