- רכיבים נדרשים: -
- חיישן טמפרטורה DS18B20:
- תרשים מעגל: -
- צעדים או זרימת קוד: -
- הסבר קוד:
- קבלת נתונים מחיישן הטמפרטורה DS18B20:
באופן כללי, חיישן הטמפרטורה LM35 משמש עם מיקרו-בקרים למדידת הטמפרטורה מכיוון שהוא זול וזמין בקלות. אך LM35 נותן ערכים אנלוגיים ועלינו להמיר אותם לדיגיטל באמצעות ADC (Analog to Digital Converter). אך כיום אנו משתמשים בחיישן טמפרטורה DS18B20 בו איננו זקוקים להמרת ADC כדי לקבל את הטמפרטורה. כאן נשתמש במיקרו-בקר PIC עם DS18B20 למדידת הטמפרטורה.
אז הנה אנו בונים מדחום עם המפרט הבא באמצעות יחידת מיקרו-בקר PIC16F877A ממיקרו- שבב.
- זה יציג טווח מלא של טמפרטורה מ -55 מעלות ל +125 מעלות.
- זה יציג את הטמפרטורה רק אם הטמפרטורה משתנה + / -.2 מעלות.
רכיבים נדרשים: -
- Pic16F877A - חבילת PDIP40
- לוח לחם
- פיקיט -3
- מתאם 5V
- LCD JHD162A
- חיישן טמפרטורה DS18b20
- חוטים לחיבור ציוד היקפי.
- נגדי 4.7k - 2 יחידות
- סיר 10k
- קריסטל 20mHz
- 2 יחידות קבלים קרמיים של 33pF
חיישן טמפרטורה DS18B20:
DS18B20 הוא חיישן מצוין לחישה מדויקת של הטמפרטורה. חיישן זה מספק רזולוציה של 9 עד 12 ביט על חישת טמפרטורה. חיישן זה מתקשר עם חוט אחד בלבד ואינו זקוק לשום ADC בכדי לרכוש טמפרטורות אנלוגיות ולהמירן באופן דיגיטלי.
המפרט של החיישן הוא: -
- מודד טמפרטורות מ -55 ° C עד + 125 ° C (-67 ° F עד + 257 ° F)
- ± 0.5 ° C דיוק מ -10 ° C ל- + 85 ° C
- רזולוציה ניתנת לתכנות מ 9 ביט ל 12 ביט
- אין צורך ברכיבים חיצוניים
- החיישן משתמש בממשק 1-Wire®
אם נסתכל על תמונת pinout לעיל מגליון הנתונים, אנו יכולים לראות שהחיישן נראה בדיוק כמו חבילה BC547 או BC557, TO-92. הסיכה הראשונה היא קרקע, הסיכה השנייה היא DQ או הנתונים והסיכה השלישית היא VCC.
להלן המפרט החשמלי מגליון הנתונים שיהיה צורך בתכנון שלנו. מתח האספקה המדורג לחיישן הוא + 3.0 וולט עד 5.5 וולט. זה גם צריך להרים את מתח האספקה זהה למתח האספקה שצוין לעיל.
כמו כן, יש מרווח דיוק שהוא + -0.5 מעלות צלזיוס לטווח של -10 מעלות צלזיוס עד +85 מעלות צלזיוס, והדיוק משתנה עבור מרווח הטווח המלא, שהוא + -2 מעלות עבור -55 מעלות ל + טווח של 125 מעלות.
אם נסתכל שוב בגליון הנתונים, נראה את מפרט החיבור של החיישן. אנו יכולים לחבר את החיישן במצב כוח טפילי בו יש צורך בשני חוטים, DATA ו- GND, או שנוכל לחבר את החיישן באמצעות ספק כוח חיצוני, שם יש צורך בשלושה חוטים נפרדים. נשתמש בתצורה השנייה.
מכיוון שכעת אנו מכירים את דירוגי ההספק של החיישן ואזורים הקשורים לחיבור, אנו יכולים כעת להתרכז בהפיכת הסכימטיקה.
תרשים מעגל: -
אם אנו רואים את תרשים המעגל נראה כי: -
LCD בעל אופי 16x2 מחובר על פני מיקרו-בקר PIC16F877A, שבו RB0, RB1, RB2 מחוברים לסיכה LCD RS, R / W ו- E. ו- RB4, RB5, RB6 ו- RB7 מחוברים על פני 4 פינים D4, D5, D6 של LCD, D7. ה- LCD מחובר במצב 4 ביט או במצב נגיסה.
מתנד גביש של 20 מגה-הרץ עם שני קבלים קרמיים של 33pF מחובר על פני פין OSC1 ו- OSC2. זה יספק תדר שעון קבוע של 20Mhz למיקרו-בקר.
DS18B20 מחובר גם בהתאם לתצורת הסיכה ועם נגד של 4.7k כלפי מעלה כפי שפורט לעיל. חיברתי את כל זה בקרש הלחם.
אם אתה לא חדש במיקרו-בקר PIC, עקוב אחר ההדרכות שלנו למיקרו-בקר PIC המציין את תחילת העבודה עם מיקרו-בקר PIC.
צעדים או זרימת קוד: -
- הגדר את התצורות של המיקרו-בקר הכוללות תצורת מתנד.
- הגדר את היציאה הרצויה עבור LCD כולל רישום TRIS.
- כל מחזור עם חיישן ds18b20 מתחיל באיפוס, ולכן נאפס את ה- ds18b20 ונחכה לדופק הנוכחות.
- כתוב את לוח השריטה והגדר את הרזולוציה של חיישן 12bit.
- דלג על קריאת ה- ROM ואחריו דופק איפוס.
- הגש את הפקודה להמרת טמפרטורה.
- קרא את הטמפרטורה ממשטח השריטה.
- בדוק את ערך הטמפרטורה בין אם הוא שלילי או חיובי.
- הדפיסו את הטמפרטורה על גבי LCD בגודל 16x2.
- המתן לשינויי הטמפרטורה למשך +/- 20 מעלות צלזיוס.
הסבר קוד:
הקוד המלא עבור מדחום דיגיטלי זה ניתן בסוף הדרכה זו עם סרטון הדגמה. תזדקק לכמה קבצי כותרות להפעלת תוכנית זו שניתן להוריד מכאן.
ראשית, עלינו להגדיר את סיביות התצורה במיקרו-בקר pic ואז להתחיל בפונקציה ראשית בטלה .
ואז מתחת לארבע שורות משמשים לכלול קובץ כותרת ספרייה, lcd.h ו- ds18b20.h . ו- xc.h מיועד לקובץ כותרת של מיקרו-בקר.
#לִכלוֹל
הגדרות אלה משמשות למשלוח פקודה לחיישן הטמפרטורה. הפקודות מפורטות בגליון הנתונים של החיישן.
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
טבלה 3 מגיליון הנתונים של החיישן מציגה את כל הפקודות שבהן פקודות המאקרו משמשות למשלוח פקודות בהתאמה.
הטמפרטורה תוצג על המסך רק אם הטמפרטורה משתנה +/- .20 מעלות. אנו יכולים לשנות את פער הטמפרטורה הזה ממאקרו temp_gap זה. על ידי שינוי הערך במאקרו זה, המפרט ישתנה.
שני משתנים צפים אחרים המשמשים לאחסון נתוני הטמפרטורה המוצגים ומבדילים אותם בפער הטמפרטורה
# הגדר temp_gap 20 float pre_val = 0, aft_val = 0;
בשנת void main () פונקציה, lcd_init () ; היא פונקציה לאתחול LCD. זה lcd_init () הפונקציה נקראת מן lcd.h הספרייה.
רישומי TRIS משמשים לבחירת סיכות קלט / פלט כקלט או פלט. שני משתנים קצרים ולא חתומים TempL ו- TempH משמשים לאחסון נתוני הרזולוציה של 12 סיביות מחיישן הטמפרטורה.
בטל ראשי (בטל) {TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; לא חתום TempL קצר, TempH; לא חתום t, t2; הפרש צף 1 = 0, הבדל 2 = 0; lcd_init ();
בואו נראה את לולאת ה- while, כאן אנו שוברים את loop the while (1) לגושים קטנים.
קווים אלה משמשים כדי לחוש שחיישן הטמפרטורה מחובר או לא.
בעוד (ow_reset ()) {lcd_com (0x80); lcd_puts ("אנא התחבר"); lcd_com (0xC0); lcd_puts ("Temp-Sense Probe"); }
על ידי שימוש בקטע קוד זה אנו מאותחלים את החיישן ושולחים פקודה להמרת הטמפרטורה.
lcd_puts (""); ow_reset (); write_byte (write_scratchpad); כתוב_בית (0); כתוב_בית (0); כתיבת בית (רזולוציה_12 ביט); // רזולוציה של 12 ביט ow_reset (); write_byte (skip_rom); כתוב_בית (המרת_טמפ);
קוד זה מיועד לאחסון נתוני הטמפרטורה של 12 ביט בשני משתנים קצרים שלא חתומים.
בעוד (read_byte () == 0xff); __השהיית_מס (500); ow_reset (); write_byte (skip_rom); write_byte (read_scratchpad); TempL = read_byte (); TempH = read_byte ();
ואז אם תבדוק את הקוד השלם למטה, נוצר תנאי אם-אחר כדי לגלות את סימן הטמפרטורה אם הוא חיובי או שלילי.
על ידי שימוש בקוד הצהרת ה- If אנו מבצעים מניפולציה בנתונים ונראה האם הטמפרטורה שלילית או לא וקובעים כי שינויי הטמפרטורה הם בטווח של +/-.20 מעלות או לא. וגם אחר חלק בדקנו האם הטמפרטורה היא חיובית או לא והטמפרטורה משתנית זיהוי.
קוד
קבלת נתונים מחיישן הטמפרטורה DS18B20:
בואו נראה את פער הזמן של ממשק 1-Wire®. אנו משתמשים ב- 20Mhz Crystal. אם נסתכל בתוך הקובץ ds18b20.c, נראה
#define _XTAL_FREQ 20000000
הגדרה זו משמשת לשגרת עיכוב מהדר XC8. 20Mhz מוגדר כתדר הקריסטל.
ביצענו חמש פונקציות
- ow_reset
- read_bit
- read_byte
- write_bit
- כתיבת_בית
פרוטוקול 1-Wire ® זקוק לחריצים הקשורים לתזמון כדי לתקשר. בתוך גיליון הנתונים נקבל מידע מושלם שקשור לחריץ הזמן.
בתוך הפונקציה שלמטה יצרנו את משבצת הזמן המדויקת. חשוב ליצור את העיכוב המדויק להחזקה ושחרור ולשלוט על סיבית ה- TRIS של יציאת החיישן המתאים.
לא חתום char__reset (בטל) {DQ_TRIS = 0; // טריס = 0 (פלט) DQ = 0; // הגדר מספר סיכה לנמוך (0) __המתנה_אוס (480); // חוט אחד דורש עיכוב זמן DQ_TRIS = 1; // טריס = 1 (קלט) __המתנה_אוס (60); // חוט 1 דורש עיכוב בזמן אם (DQ == 0) // אם יש תנוחת נוכחות {__השהיית_ (480); החזר 0; // להחזיר 0 (חוט אחד הוא נוכחות)} אחר {__המתנה_אוס (480); להחזיר 1; // להחזיר 1 (חוט אחד אינו נוכחות)}} // 0 = נוכחות, 1 = ללא חלק
עכשיו לפי מתחת זמן חריץ התיאור המשמש קרוא וכתוב, יצרנו את הקריאה ואת כתיבת פונקצית בהתאמה.
לא חתום char read_bit (בטל) {char לא חתום i; DQ_TRIS = 1; DQ = 0; // משוך את DQ נמוך כדי להתחיל את חריץ הזמן DQ_TRIS = 1; DQ = 1; // ואז להחזיר גבוה עבור (i = 0; i <3; i ++); // עיכוב 15us מתחילת החזרת timeslot (DQ); // ערך החזרה של קו DQ} ריק_כתוב ביט (char bitval) {DQ_TRIS = 0; DQ = 0; // משוך DQ נמוך כדי להתחיל את חריץ הזמן אם (bitval == 1) DQ = 1; // להחזיר DQ גבוה אם כתוב 1 __לעכב_ (5); // ערך החזק למשך שארית הזמן DQ_TRIS = 1; DQ = 1; } // Delay מספק 16us לכל לולאה, בתוספת 24us. לכן עיכוב (5) = 104us
בדוק עוד את כל הכותרות הקשורות וקבצי ה- C כאן.
אז ככה נוכל להשתמש בחיישן DS18B20 כדי להשיג את הטמפרטורה באמצעות מיקרו-בקר PIC.
אם ברצונך לבנות מדחום דיגיטלי פשוט עם LM35, עיין בהמשך בפרויקטים עם מיקרו-בקרים אחרים:
- מדידת טמפרטורת החדר עם פטל פטל
- מדחום דיגיטלי באמצעות Arduino ו- LM35
- מדחום דיגיטלי באמצעות LM35 ו- 8051
- מדידת טמפרטורה באמצעות מיקרו-בקר LM35 ו- AVR