» אלקטרוניקה » ארדואינו »תחנת מזג אוויר ביתית על GY-BMP280-3.3 ו- Ds18b20

תחנת מזג אוויר ביתית ב- GY-BMP280-3.3 ו- Ds18b20


אני רוצה לאסוף עשה זאת בעצמך מכשיר שיודד לחץ וטמפרטורה אטמוספריים. חיישן הטמפרטורה חייב להיות מרוחק ומהודק, מכיוון שהוא חייב למדוד את הטמפרטורה במרחק מסוים מהמכשיר. הייתי רוצה שיהיה מכשיר נייד כזה עם טווח עבודה של בין -30 מעלות צלזיוס ל -50 מעלות צלזיוס. אבל זה דורש שכל הרכיבים יוכלו לעבוד בטווח טמפרטורות זה. רכיבים שיכולים לעבוד בטווח טמפרטורה מורחב יקרים יותר, וקשה יותר לקנות אותם.
כדי להגשים את החלום שלי למציאות, יעזרו לי על ידי הלוח, שתיארתי במאמר "לוח GY-BMP280-3.3 למדידת לחץ וטמפרטורה ברומטרית».

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

בואו נתחיל.

שלב ראשון. התקן פגז תוכנה בחינם במחשב שלך ארדואינו IDE לכתיבת תוכניות (סקיצות), להרכיבן ואז לכתוב אותן למיקרו-בקר Mega328P המותקן על הלוח. אני ממליץ להוריד את גרסת הקליפה של ARDUINO 1.6.5. למה? בתחילה, פרויקט ARDUINO היה אחד, כעת היזמים התפזרו וממשיכים לפתח את מערכת ARDUINO, אך כל אחד בדרכו שלו, עם ניואנסים קטנים. השתמשתי בגרסה ARDUINO 1.6.5. יש להתקין אותו ולבדוק אותו לשיתוף פעולה עם לוח Arduino Uno בעזרת הדוגמאות הפשוטות ביותר.

שלב שני. אנו בודקים את לוח GY-BMP280-3.3 אם הוא מודד לחץ וטמפרטורה ברומטריים. אנו לוקחים 4 חוטים, מחברים אותם GY-BMP280-3.3 לבין Arduino Uno, כפי שמוצג בתמונה ובתרשים. קימורים קווי רב צבעוניים דקים הם מוליכים.



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


לאחר כתיבת נתונים למיקרו-בקר של לוח Arduino Uno, הוא מתחיל מייד לבצע את התוכנית (קוד) ושולח את הנתונים באמצעות כבל USB למחשב שאליו מחובר לוח Arduino Uno.ואנחנו יכולים לראות את תוצאת המדידה של לוח GY-BMP280-3.3 בחלון ה- Arduino IDE, המכונה "צג היציאה הסדרתית".


אנו יכולים לראות את תוצאת המדידות בלוח ה- GY-BMP280-3.3 בתוכנית Windows Hyper Terminal הרגילה, לאחר סגירת מעטפת Arduino Uno והגדרת הפעלה בתוכנית Hyper Terminal. כלומר, אנו יכולים לקבל את תוצאות הלוח GY-BMP280-3.3 על ידי חיבור ה- Arduino Uno לכל מחשב עם כבל USB עליו מותקן מנהל ההתקן של לוח Arduino Uno. ישנן מספר ספריות לעבודה עם GY-BMP280-3.3. הכל עבד בשבילי עם הספרייה. הקובץ שתוריד מאתר זה ייראה כך: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. יש לשנות את שמו בשם: iarduino_Pressure_BMP.zip. כעת עלינו להתקין את ספריית iarduino_Pressure_BMP במעטפת ה- Arduino IDE.


הפעל את ה- Arduino IDE, עבור לתפריט סקיצה / כלול ליברברי / Add.ZIP Library ... ואז בחר את הקובץ iarduino_Pressure_BMP.zip ולחץ על כפתור הפתיחה. אתה צריך גם להתקין את הספריות:,. לאחר התקנת הספריות אנו מבצעים אתחול מחדש של מעטפת ה- Arduino IDE, כלומר סוגרים אותה ומתחילים אותה מחדש. ואז בחר בתפריט File / Samples / Iarduino לחץ BMP (חיישני לחץ) / דוגמה.

אנו רואים את הקוד בחלון.

יהיה צורך לשנות מעט את הקוד.

בשורה החמישית, הסר שני חתכים "//" והוסף (0x76) או (0x77) בשורה האחת-עשרה. (0x76) היא הכתובת של לוח הברומטר. הלוח שלי ב- GY-BMP280-3.3 המחובר לאוטובוס I2C התגלה כאותה כתובת (0x76). כיצד לגלות את מספר המכשיר המחובר לאוטובוס I2C? תקבל את התשובה לשאלה זו על ידי קריאת המאמר המלא.

אז, תיקנו את הקוד בחלון, עכשיו נתחיל לבדוק ולקמפל את הקוד בתפריט Sketch / Check / Compile. אם האימות וההדרכה של הקוד מוצלחים, אז בתפריט Sketch / Load, אנו מתחילים את הקלטת התוכנית ב- Arduino Uno.

אם ההורדה הצליחה, אז על ידי פתיחת צג היציאה הסדרתית בתפריט: כלים / צג יציאה טורית, נראה את הנתונים שנשלחו על ידי לוח GY-BMP280-3.3.

בתצלום המסך הבא, התוצאה של לוח GY-BMP280-3.3 עובד על מחשב שעליו לא מותקנת מעטפת ה- Arduino IDE. הנתונים מתקבלים על ידי תוכנית PuTTY.

במקביל, צולם ברומטר אנדרואיד במעבדה, שהיה ממוקם ליד לוח GY-BMP280-3.3. על ידי השוואה בין קריאות המכשיר, אתה עצמך יכול להסיק מסקנות לגבי הדיוק של הלוח GY-BMP280-3.3. ברומטר אנרואידי מוסמך על ידי מעבדת המדינה.


שלב שלישי. בדיקת תצוגת LCD באמצעות מודול הממשק של I2C. אנו מוצאים תצוגת LDC עם מודול ממשק שמתחבר דרך אוטובוס I2C ל- UNO Arduino.
תחנת מזג אוויר ביתית ב- GY-BMP280-3.3 ו- Ds18b20

אנו בודקים את פעולתה בעזרת דוגמאות ממעטפת ה- Arduino IDE. אך לפני כן אנו קובעים את הכתובת של מודול הממשק. למודול הממשק שלי כתובת 0x3F. הכנסתי את הכתובת הזו לשורת השרטוט: LiquidCrystal_I2C lcd (0x3F, 16.2);
קבעתי את הכתובת הזו באמצעות סקיצה "סורק הכתובת של מכשיר I2C" המתואר ב.
השגתי את מעטפת ה- Arduino IDE, מתוך המאמר העתקתי את קוד התוכנית והדבקתי את חלון ה- Arduino IDE שלה.

התחלתי את הקומפילציה, ואז כתבתי את הקוד ללוח Arduino UNO, אליו התחברו לוח GY-BMP280-3.3 ותצוגת LDC עם מודול הממשק I2C. ואז בצג היציאה הסדרתית קיבלתי את התוצאה הבאה. למודול הממשק שלי כתובת 0x3F.

שלב רביעי. בדיקת חיישן הטמפרטורה DS18b20. אנו מחברים את זה כדלקמן.

ספריית OneWire Arduino לעבודה עם חיישן הטמפרטורה DS18b20 כבר מותקנת.

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

שלב חמישי. הרכבה בבית תחנות מזג אוויר ב- GY-BMP280-3.3 ו- Ds18b20.
אנו מרכיבים את המכשיר לפי הסכימה:

קיבלתי את הקוד למכשיר על ידי שילוב של כל הדוגמאות לאחת והגדרת הפלט במסך התצוגה של LDC. הנה מה שיש לי:

// Uncomment ליישום תוכנה של אוטובוס I2C: //
// # הגדר סיכה_SW_SDA 3 // הקצה כל סיכת ארדואינו לעבוד כקו SDA של אוטובוס התוכנה I2C.
// # הגדר סיכה_SW_SCL 9 // הקצה כל סיכת ארדואינו שתפעל כקו SCL לאוטובוס התוכנה I2C.
// ביטול אי התאמה לרוב הלוחות: //
# כלול
#include // ספריית iarduino תשתמש בשיטות ובפונקציות של ספריית ה- Wire.
# כלול // ספרייה לעבודה מסוג LDC מסוג 1602 באוטובוס I2C

                                                            //
#include // חבר את ספריית iarduino_Pressure_BMP לעבודה עם BMP180 או BMP280.
חיישן iarduino_Pressure_BMP (0x76); // הכרז על אובייקט חיישן לעבודה עם חיישן לחץ באמצעות הפונקציות והשיטות של ספריית iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire DS (10);
הגדרת ביטול () {
    lcd.init ();
    lcd.backlight ();
    Serial.begin (9600); // התחל העברת נתונים לצג היציאה הסדרתית ב 9600 baud.
    עיכוב (1000); // אנו מחכים להשלמת המעברים בעת הפעלת חשמל
    sensor.begin (73); // התחל לעבוד עם החיישן. הגובה הנוכחי ייקח כ 73 מ '- גובה העיר בוזולוק מעל פני הים
} //
לולאת חלל () {
// קרא את הנתונים ותצוגה: טמפרטורה ב- ° C, לחץ במ"מ. rt., שינוי גובה ביחס לנקוב בפונקציית התחל (ברירת מחדל 0 מטר)
lcd.setCursor (0,0); // הגדר את נקודת הפלט "P =" ב- LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // חלק את הערך של P שהונפק על ידי BMP280 על ידי 1000 והגדר את הפלט של 3 מקומות עשרוניים
lcd.setCursor (12.0); // הגדר את נקודת הפלט "kPa" ב- LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (חיישן.טמפרטורה, 1); // הגדר את הפלט של מקום עשרוני
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (חיישן.גובה, 1);
    if (sensor.read (1)) {Serial.println ((מחרוזת) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
// קרא את הנתונים ותצוגה: טמפרטורה ב- ° C ולחץ בפא, לחץ בממ. rt., שינוי גובה ביחס לנקוב בפונקציית התחל (ברירת מחדל של 0 מטר).
    if (sensor.read (2)) {Serial.println ((מחרוזת) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
    else {Serial.println ("HET OTBETA OT CEHCOPA");}
    byte i;
  הווה בתים = 0;
  סוג בתים_s;
  נתוני בתים [12];
  בתים addr [8];
  צלזיוס צף, פרנהייט;
  אם (! ds.search (addr)) {
    Serial.println ("אין עוד כתובות.");
    Serial.println ();
    ds.reset_search ();
    עיכוב (250);
    לחזור
  }
  Serial.print ("ROM =");
  עבור (i = 0; i & lt; 8; i ++) {
    Serial.write ('');
    Serial.print (addr [i], HEX);
  }
  אם (OneWire :: crc8 (addr, 7)! = addr [7]) {
      Serial.println ("CRC אינו תקף!");
      לחזור
  }
  Serial.println ();
  // בייט ה- ROM הראשון מציין איזה שבב
  מתג (addr [0]) {
    מקרה 0x10:
      Serial.println ("שבב = DS18S20"); // או DS1820 ישן
      type_s = 1;
      שבירה;
    מקרה 0x28:
      Serial.println ("שבב = DS18B20");
      type_s = 0;
      שבירה;
    מקרה 0x22:
      Serial.println ("שבב = DS1822");
      type_s = 0;
      שבירה;
    ברירת מחדל:
      Serial.println ("המכשיר אינו מכשיר משפחתי DS18x20.");
      לחזור
  }
  ds.reset ();
  ds.select (addr);
  ds.write (0x44, 1); // התחל המרה, עם כיבוי טפילים בסוף
  
  עיכוב (1000); // אולי מספיק 750 מטר, אולי לא
  // אנו עשויים לעשות כאן כוח ds.depd (), אך האיפוס ידאג לכך.
  הווה = ds.reset ();
  ds.select (addr);
  ds.write (0xBE); // קרא את משטח השריטה
  Serial.print ("נתונים =");
  Serial.print (הווה, HEX);
  Serial.print ("");
  עבור (i = 0; i & lt; 9; i ++) {// אנו זקוקים ל 9 בתים
    נתונים [i] = ds.read ();
    Serial.print (נתונים [i], HEX);
    Serial.print ("");
  }
  Serial.print ("CRC =");
  Serial.print (OneWire :: crc8 (נתונים, 8), HEX);
  Serial.println ();
  // המר את הנתונים לטמפרטורה בפועל
  // מכיוון שהתוצאה היא מספר שלם חתום על 16 סיביות, עליה
  // להיות מאוחסן בסוג "int16_t", שהוא תמיד 16 סיביות
  // גם כאשר נערך במעבד 32 סיביות.
  int16_t raw = (נתונים [1] & lt; & lt; 8) | נתונים [0];
  אם (type_s) {
    raw = raw & lt; & lt; 3; ברירת מחדל של רזולוציית 9 ביט
    אם (נתונים [7] == 0x10) {
      // "ספירה נשארת" נותנת רזולוציה מלאה של 12 סיביות
      raw = (raw & amp; 0xFFF0) + 12 - נתונים [6];
    }
  } אחרת {
    בתים cfg = (נתונים [4] & 0x60);
    // ברז הנמוך, החלקים הנמוכים אינם מוגדרים, אז בואו לאפס אותם
    אם (cfg == 0x00) raw = raw & amp; ~ 7; // רזולוציה של 9 סיביות, 93.75 ms
    אחרת אם (cfg == 0x20) raw = raw & amp; ~ 3; // 10 סיביות res, 187.5 ms
    אחרת אם (cfg == 0x40) raw = raw & amp; ~ 1; // 11 סיביות res, 375 ms
    // // ברירת המחדל היא רזולוציה של 12 סיביות, זמן המרה של 750 מילישניות
  }
  צלזיוס = (צף) גולמי / 16.0;
  פרנהייט = צלזיוס * 1.8 + 32.0;
  Serial.print ("טמפרטורה =");
  Serial.print (צלזיוס);
  Serial.print ("צלזיוס,");
  Serial.print (פרנהייט);
  Serial.println ("פרנהייט");
lcd.setCursor (8.1); // הגדר את נקודת הפלט "Tds =" ב- LDC
lcd.print ("Tds =");
lcd.print (צלזיוס, 1);
    עיכוב (3000);
}


הנה מה שיש לי:


הלוח GY-BMP280-3.3 מוציא לחץ בפסלים, וזה לא מאוד נוח. לא הצלחתי לפתור את הבעיה כיצד להפוך את נתוני לחץ GY-BMP280-3.3 לפלט בנתוני לחץ קילוגרמים. פתרתי את הבעיה בקו הפלט של צג ה- LDC.

lcd.print (sensor.pressure / 1000.3); // חלק את הערך של P שהונפק על ידי BMP280 על ידי 1000 והגדר את הפלט של 3 מקומות עשרוניים
לוח GY-BMP280-3.3 מספק גם ערכי גובה.

sensor.begin (73); // התחל לעבוד עם החיישן. הגובה הנוכחי ייקח כ 73 מ '- גובה העיר בוזולוק מעל פני הים
אם תרגעו בים ותשנו את "sensor.begin (73);" על "sensor.begin (0);" בקוד ואז לערוך ושמור את התוכנית בתחנת מזג האוויר הביתית ב- GY-BMP280-3.3 ו- Ds18b20, ולבצע פלט גובה לתצוגת LDC, תקבל גם גובה מטר.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (חיישן.גובה, 1); // הדפיס את ערכי הגובה במטרים עם מקום עשרוני אחד
הכוח מסופק למעגל בגירסתי דרך כבל USB. אתה יכול להשתמש בממיר דופק דחיפה מתח נמוך 5V / 600 mA ותחנת מזג האוויר שלך תהפוך ניידת. סוג זה של ספק כוח מתואר היטב ב- מאמר.

אוסף מוצלח!
5
8.8
6.3

הוסף תגובה

    • לחייךמחייךxaxaבסדרלא יודעיאהוnea
      בוסשריטהשוטהכןכן כןאגרסיביסודי
      סליחהריקודריקוד 2ריקוד 3סליחהעזרהמשקאות
      עצורחבריםטובטובשריקהלהתנדנדלשון
      עשןמוחא כפייםמשוגעלהכריזלזלזלdon-t_mentionלהוריד
      חוםלא מועילצחוק 1מדמפגשמסגדשלילי
      לא_יפופקורןלהענישלקרואלהפחידמפחידחיפוש
      מתגרהתודהזהלרמזאמניקחריףמסכים
      רעדבורהשחורblum3סומקלהתפארשעמום
      מצונזרהנאהסוד 2לאייםניצחוןיוsun_bespectacled
      שוקכבודחחחקדמהברוך הבאkrutoyya_za
      ya_dobryiעוזרne_huliganne_othodiפלומהאיסורקרוב

אנו ממליצים לך לקרוא:

תן אותו לסמארטפון ...