מדידת טמפרטורה ולחות לעתים קרובות שימושית ביישומים רבים כמו אוטומציה ביתית, ניטור סביבה, תחנת מזג אוויר וכו '. חיישן הטמפרטורה הנפוץ ביותר ליד LM35 הוא ה- DHT11, לפני כן בנינו פרויקטים רבים של DHT11 על ידי ממשק זה עם Arduino, עם Raspberry Pi ולוחות פיתוח רבים אחרים. במאמר זה נלמד כיצד לממשק את ה- DHT11 הזה עם PIC16F87A שהוא מיקרו-בקר PIC בן 8 סיביות. נשתמש במיקרו-בקר זה כדי לקרוא את ערכי הטמפרטורה והלחות באמצעות DHT11 ולהציגו על צג LCD. אם אתה חדש לחלוטין בשימוש במיקרו-בקרים של PIC, אתה יכול להשתמש בסדרת הדרכות PIC שלנו כדי ללמוד כיצד לתכנת ולהשתמש במיקרו-בקר PIC, שנאמר, בוא נתחיל.
DHT11 - מפרט ועבודה
חיישן DHT11 זמין בצורה של מודול או בצורה של חיישן. במדריך זה אנו משתמשים בחיישן, ההבדל היחיד בין שניהם הוא שבצורת המודול יש לחיישן קבלים סינון ונגד משיכה המחובר לסיכת הפלט של החיישן. אז אם אתה משתמש במודול אתה לא צריך להוסיף אותם חיצונית. DHT11 בצורה חיישן מוצג להלן.
חיישן DHT11 מגיע עם מעטפת צבע כחול או לבן. בתוך מעטפת זו, יש לנו שני מרכיבים חשובים המסייעים לנו לחוש את הלחות והטמפרטורה היחסית. המרכיב הראשון הוא זוג אלקטרודות; ההתנגדות החשמלית בין שתי האלקטרודות הזו נקבעת על ידי מצע מחזיק לחות. כך שההתנגדות הנמדדת היא ביחס הפוך ללחות היחסית של הסביבה. לחות יחסית נמוכה יותר תהיה ערך ההתנגדות ולהיפך. כמו כן, שים לב שלחות יחסית שונה מלחות בפועל. לחות יחסית מודדת את תכולת המים באוויר ביחס לטמפרטורה באוויר.
הרכיב הנוסף הוא תרמיסטור NTC צמוד על פני השטח. המונח NTC מייצג מקדם טמפרטורה שלילי, לעליית הטמפרטורה ערך ההתנגדות יקטן. הפלט של החיישן מכויל מהמפעל ולכן כמתכנת אנחנו לא צריכים לדאוג לכיול החיישן. פלט החיישן הניתן על ידי תקשורת חד-חוטית, בואו נראה את הסיכה ודיאגרמת החיבור של חיישן זה.
המוצר נמצא באריזת שורה אחת של 4 פינים. הסיכה הראשונה מחוברת על פני ה- VDD והסיכה הרביעית מחוברת על פני ה- GND. הסיכה השנייה היא סיכת הנתונים, המשמשת למטרות תקשורת. סיכת נתונים זו זקוקה לנגד-משיכה של 5k. עם זאת, אחרים יכולים להשתמש גם בנגדים כגון 4.7k עד 10k. הסיכה השלישית אינה מחוברת לשום דבר. אז זה מתעלם.
גיליון הנתונים מספק מפרט טכני וכן מידע על ממשקים שניתן לראות בטבלה שלהלן -
הטבלה שלעיל מציגה טווח מדידות טמפרטורה ולחות ודיוק. הוא יכול למדוד טמפרטורה בין 0-50 מעלות צלזיוס עם דיוק של +/- 2 מעלות צלזיוס ולחות יחסית בין 20-90% לחות יחסית עם דיוק של +/- 5% לחות יחסית. מפרט הפירוט ניתן לראות בטבלה שלהלן.
מתקשר עם חיישן DHT11
כפי שצוין קודם לכן, על מנת לקרוא את הנתונים מ- DHT11 עם PIC עלינו להשתמש ב- PIC פרוטוקול תקשורת חוט אחד. ניתן להבין את הפרטים כיצד לבצע זאת מתוך דיאגרמת הממשק של DHT 11 אשר ניתן למצוא בגיליון הנתונים שלה, זהה להלן.
DHT11 זקוק לאות התחלה מה- MCU כדי להתחיל את התקשורת. לכן, בכל פעם שה- MCU צריך לשלוח אות התחלה לחיישן DHT11 כדי לבקש ממנו לשלוח את ערכי הטמפרטורה והלחות. לאחר השלמת אות ההתחלה, ה- DHT11 שולח אות תגובה הכולל את מידע הטמפרטורה והלחות. תקשורת הנתונים נעשית על ידי פרוטוקול תקשורת נתונים של אוטובוס יחיד. אורך הנתונים המלא הוא 40bit והחיישן שולח תחילה ביט נתונים גבוה יותר.
בשל הנגיעה הנמשכת, קו הנתונים נשאר תמיד ברמת VCC במצב סרק. ה- MCU צריך להוריד מתח זה גבוה לנמוך לטווח מינימלי של 18ms. במהלך תקופה זו, חיישן DHT11 מזהה את אות ההתחלה והמיקרו-בקר הופך את קו הנתונים לגובה 20-40us. זמן 20-40 אוס זה נקרא תקופת המתנה שבה ה- DHT11 מתחיל לתגובה. לאחר תקופת המתנה זו, DHT11 שולח את הנתונים ליחידת המיקרו-בקר.
פורמט DATA חיישן DHT11
הנתונים מורכבים מחלקים עשרוניים ואינטגרליים המשולבים יחד. החיישן עוקב אחר פורמט הנתונים שלהלן -
נתוני RH אינטגרליים 8 סיביות + נתוני RH עשרוניים 8 סיביות + נתוני T אינטגרליים 8 ביט + נתוני T עשרוניים 8 סיביות + בדיקת 8 ביט
אפשר לאמת את הנתונים על ידי בדיקת ערך סכום הבדיקה עם הנתונים שהתקבלו. ניתן לעשות זאת מכיוון שאם הכל תקין ואם החיישן העביר נתונים מתאימים, אז בדיקת הבדיקה צריכה להיות סכום של "נתוני RH אינטגרליים 8 ביט + נתונים RH עשרוניים 8 ביט + נתוני T אינטגרליים 8 ביט + נתונים T עשרוניים 8 ביט".
רכיבים נדרשים
לפרויקט זה נדרשים הדברים הבאים -
- הגדרת תכנות PIC מיקרו-בקר (8 ביט).
- קרש לחם
- יחידת אספקת חשמל 5V 500mA.
- נגד 4.7k 2 יחידות
- נגד 1k
- PIC16F877A
- גביש 20mHz
- קבלים 33pF 2 יח '
- LCD בעל אופי 16x2
- חיישן DHT11
- חוטי מגשר
סכמטי
תרשים המעגל לממשק DHT11 עם PIC16F877A מוצג להלן.
השתמשנו ב- LCD בגודל 16x2 כדי להציג את ערכי הטמפרטורה והלחות שאנו מודדים מ- DHT11. ה- LCD מתממשק במצב 4 חוטים וגם החיישן וגם ה- LCD מופעלים על ידי ספק כוח חיצוני 5V. השתמשתי בקרש לחם כדי ליצור את כל החיבורים הנדרשים והשתמשתי במתאם חיצוני 5V. אתה יכול גם להשתמש בלוח אספקת החשמל הזה כדי להפעיל את הלוח שלך עם 5 וולט.
לאחר שהמעגל מוכן, כל שעלינו לעשות הוא להעלות את הקוד הנתון בתחתית דף זה ונוכל להתחיל לקרוא את הטמפרטורה והלחות כמו שמוצג להלן. אם אתה רוצה לדעת איך נכתב הקוד ואיך הוא עובד קרא עוד. כמו כן תוכלו למצוא את העבודה המלאה של פרויקט זה בסרטון המופיע בתחתית עמוד זה.
DHT11 עם הסבר קוד PIC MPLABX
הקוד נכתב באמצעות MPLABX IDE והורכב באמצעות מהדר XC8 אשר שניהם מסופקים על ידי Microchip עצמו והוא חופשי להורדה ושימוש. אנא עיין בהדרכות הבסיסיות להבנת יסודות התכנות, רק שלושת הפונקציות החשובות הנדרשות לצורך תקשורת עם חיישן DHT11 נדונו להלן. הפונקציות הן -
בטל dht11_init (); בטל find_response (); char read_dht11 ();
הפונקציה הראשונה משמשת לאות ההתחלה עם dht11. כפי שנדון בעבר, כל תקשורת עם DHT11 מתחילה באות התחלה, כאן כיוון הסיכה משתנה בהתחלה כדי להגדיר את סיכת הנתונים כפלט מהמיקרו-בקר. ואז קו הנתונים מושך נמוך וממשיך לחכות ל- 18mS. אחרי זה שוב התור מוגבר על ידי המיקרו-בקר וממשיך לחכות עד 30US. לאחר זמן המתנה זה, סיכת הנתונים הוגדרה כקלט למיקרו-בקר לקבלת הנתונים.
בטל dht11_init () { DHT11_Data_Pin_Direction = 0; // הגדר את RD0 כפלט DHT11_Data_Pin = 0; // RD0 שולח 0 לחיישן __השהיית_מס (18); DHT11_Data_Pin = 1; // RD0 שולח 1 לחיישן __השהיה_ (30); DHT11_Data_Pin_Direction = 1; // הגדר את RD0 כקלט }
הפונקציה הבאה משמשת להגדרת ביט בדיקה בהתאם למצב סיכת הנתונים. הוא משמש לאיתור התגובה מחיישן DHT11.
בטל find_response () { Check_bit = 0; __השהיית_אוס (40); אם (DHT11_Data_Pin == 0) { __השהה_אוס (80); אם (DHT11_Data_Pin == 1) { Check_bit = 1; } __השהייה_אוס (50);} }
לבסוף פונקצית הקריאה dht11; כאן הנתונים נקראים בפורמט של 8 סיביות כאשר הנתונים מוחזרים באמצעות פעולת העברת סיביות בהתאם למצב סיכת הנתונים.
char read_dht11 () { char data, for_count; עבור (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __השהיית_ (30); אם (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // נקה ביט (7-b) } אחר { data- = (1 << (7 - for_count)); // הגדר סיבית (7-b) תוך כדי (DHT11_Data_Pin); } } להחזיר נתונים; }
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s>
לאחר מכן, הכל נעשה לתפקיד הראשי. ראשית, אתחול המערכת מתבצע במקום בו אתחול ה- LCD וכיוון יציאת סיכות ה- LCD מוגדר לפלט. היישום פועל בתוך הפונקציה הראשית
בטל main () { system_init (); בעוד (1) { __השהיית_מס (800); dht11_init (); תגובת איתור (); אם (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); סיכום = read_dht11 (); אם (סיכום == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { לחות = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((לחות / 10)% 10)); lcd_data (48+ (לחות% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("לחות:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48+ (RH% 10)); lcd_puts ("%"); } אחר { lcd_puts ("שגיאת סיכום"); } } אחר { clear_screen (); lcd_com (0x80); lcd_puts ("שגיאה !!!"); lcd_com (0xC0); lcd_puts ("אין תגובה."); } __השהיית_מס (1000); } }
התקשורת עם חיישן DHT11 נעשית בתוך בעוד הלולאה שבה אות תחילת מוגש החיישן. לאחר מכן, מופעלת פונקציית find_response . אם ה- Check_bit הוא 1 אז התקשורת הנוספת מתבצעת אחרת LCD יציג דיאלוג שגיאות.
בהתאם לנתוני 40bit, read_dht11 נקרא 5 פעמים (5 פעמים x 8bit) ומאוחסן הנתונים לפי פורמט הנתונים המסופק בגליון הנתונים. גם מצב בדיקת הבדיקה נבדק ואם יתגלו שגיאות, הוא יודיע גם על גבי LCD. לבסוף, הנתונים מומרים ומועברים ל- LCD בעל אופי 16x2.
ניתן להוריד קוד מלא למדידת טמפרטורה ולחות זו של PIC מכאן. בדוק גם את סרטון ההדגמה המופיע להלן.
מקווה שהבנתם את הפרויקט ונהניתם לבנות משהו שימושי. אם יש לך שאלות השאיר אותן בסעיף ההערות למטה או השתמש בפורומים שלנו לשאלות טכניות אחרות.