מודול DHT22: חיישן טמפרטורה ולחות יחסית (AM2302)

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

חיישן DHT22 על מטריצה, עם ארדואינו ברקע

קחו כל קיט ארדואינו טיפוסי למתחילים, או אוסף חיישנים זול, ורוב הסיכויים שתמצאו שם מין תיבה פלסטית קטנטנה מחוררת, בצבע תכלת או לבן. זהו חיישן משולב של טמפרטורה ולחות יחסית. הנפוץ והזול יותר, זה שבצבע תכלת, נקרא DHT11. הוא מסוגל למדוד טמפרטורות בטווח 0 עד 50 מעלות צלזיוס עם דיוק של פלוס-מינוס 2 מעלות, ולחות יחסית בטווח 20-80% עם דיוק של 5% (אבסולוטי!) כלומר, לא משהו.

יכולות ומחיר

החיישן הלבן, שעליו נדבר כאן, הוא DHT22 (נקרא גם AM2302), שמסוגל – לפחות על הנייר – להרבה יותר מזה: מינוס ארבעים עד פלוס שמונים מעלות צלזיוס עם דיוק של 0.5 מעלה, ומלוא הטווח של לחות יחסית (0-100%), אם כי הדיוק נמוך כמו זה של ה-DHT11. ליכולות המשופרות האלה יש מחיר: ניתן לבצע דגימה אמינה ב-DHT22 רק פעם בשתי שניות, במקום פעם בשנייה ב-DHT11. מצד שני, קשה לדמיין מצב שבו המייקר הממוצע יצטרך למדוד טמפרטורה ולחות יחסית בתדירות כזו או גבוהה יותר.

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

נכון לכתיבת שורות אלה, חיישן DHT22 ממקור נורמלי (כגון Adafruit) עולה בסביבות $10, ואילו בסין אפשר למצוא אותו גם בכ-10 שקלים, אם כי לכו תדעו אם לא שמו לכם DHT11 זול בפלסטיק לבן.

חיבורים וצריכת חשמל

ל-DHT22 יש ארבע רגליים: פלוס, נתונים, רגל שלא מחוברת לכלום, ומינוס. מומלץ להוסיף קבל 0.1 מיקרו-פאראד בין Vcc ל-GND לסינון רעשים. מתח ההפעלה המתאים הוא בין 3.3V ל-6V.

מיפוי פינים של חיישן DHT22
מיפוי פינים של חיישן DHT22 (לחצו להגדלה)

כשהחיישן במצב מנוחה, הצריכה שלו היא בסביבות 46 מיקרואמפר (מדדתי גם ב-5V וגם ב-3.3V). כשהוא מקבל פקודה להתחיל שידור נתונים – נגיע לזה מייד – הצריכה קופצת לכ-2 מיליאמפר למשך הפקודה, ובין סיום הפקודה לחזרה למצב מנוחה, הצריכה יורדת ל-1.5 מיליאמפר למשך קצת פחות מחצי שנייה. שם נמצא גם חלון הזמן שבו החיישן מחזיר לנו תשובה, שאת התזמון המדויק שלה נראה בהמשך.

פרוטוקול תקשורת ונתונים (השגוי והנכון!)

ברוב המדריכים ברשת אומרים להוסיף נגד pull-up חיצוני לרגל ה-Data. בחיישן שאצלי, בכל אופן, רגל ה-Data כבר מחוברת בנגד pull-up פנימי של 4.7K למתח Vcc. רגל זו משמשת גם לקלט (פקודת שידור) וגם לפלט (הנתונים). כדי לבקש מהחיישן נתונים, אנחנו צריכים "למשוך" את Data לאדמה למשך אלפית שנייה אחת לפחות. כשנשחרר את Data, החיישן עצמו יוריד ויעלה את המתח שם כדי לשדר לנו אות "קיבלתי את הפקודה" ואחריו 40 ביטים (5 בייטים).

פקודת שידור ואישור הפקודה כפי שנלכדו בלוג'יק אנלייזר
פקודת שידור ואישור הפקודה כפי שנלכדו בלוג'יק אנלייזר (לחצו להגדלה)

המידע משודר כשהביט המשמעותי ביותר (MSB) הוא הראשון. כל ביט מתחיל במתח נמוך למשך כ-50 מיליוניות השנייה (אצלי נמדדו 54), ולאחר מכן מתח גבוה למשך 26-28us לביט "0", או כ-70us לביט "1". לדברי ה-Datasheet הזה, הבייט השלישי והרביעי הם החלק השלם והחלק העשרוני של הטמפרטורה, בהתאמה. הנה המדידה הראשונה שביצעתי, כולל פענוח ביטים ידני:

התוצאות הראשונות שהגיעו מהחיישן
התוצאות הראשונות שהגיעו מהחיישן (לחצו להגדלה)

הבייט השלישי והרביעי כאן הם 0 ו-219. אני אמנם לא חזאי, אבל אני די בטוח שכאשר ביצעתי את המדידה הזו, הטמפרטורה הסביבתית לא הייתה 0.219 מעלות. למעשה, אם לסמוך על מדחומים אחרים, היא הייתה קרובה במידה חשודה דווקא ל-21.9 מעלות. ה-Datasheet לא נכון! חיפשתי מקורות נוספים ומצאתי את הדף הזה ב-Waveshare, לפיו הלחות היחסית והטמפרטורה נשלחות כשני מספרים של 16 ביט, לפי הסדר הזה, וצריך לחלק אותם ב-10 כדי להגיע לערכים האמתיים. זה כבר נראה הגיוני יותר: שני הבייטים הראשונים ביחד נותנים 623, כלומר לחות יחסית של 62.3%, ושני הבייטים הבאים הם ביחד 219 (21.9 מעלות צלזיוס).

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

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

הערות נוספות

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

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

ולסיום, נקודה חשובה למי שמתכוון להשתמש בספריית DHT לארדואינו של Adafruit, שאת הקישור אליה הבאתי למעלה. משך שידור הנתונים מהחיישן הוא קצת פחות מ-4 אלפיות השנייה, אך בזמן הזה קורים דברים בפרקי זמן שצריך למדוד במדויק, ופעולות סטנדרטיות של ארדואינו – כגון קליטת מידע מ-Serial או אפילו ספירת millis – עלולות להפריע. הפתרון שבחרו בספרייה הוא לחסום את כל הפסיקות של הארדואינו עד שהשידור יסתיים. ביישומים פשוטים זה לא משנה, אך אם במקביל לקריאת החיישן הקוד שלכם עושה עוד פעולה קריטית מבחינת תזמון, עלולות לצוץ בעיות וכדאי לקחת את זה בחשבון.

להרשמה
הודע לי על
1 תגובה
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

סוף סוף הסבר שאפשר להבין על לחות יחסית!