תוכן עניינים:

ספרייה עבור BMP280 ו- BME280: 7 שלבים
ספרייה עבור BMP280 ו- BME280: 7 שלבים

וִידֵאוֹ: ספרייה עבור BMP280 ו- BME280: 7 שלבים

וִידֵאוֹ: ספרייה עבור BMP280 ו- BME280: 7 שלבים
וִידֵאוֹ: מדריך להשאלה עבור ספריות ציבוריות דיגיטליות 2024, יולי
Anonim
ספרייה עבור BMP280 ו- BME280
ספרייה עבור BMP280 ו- BME280
ספרייה עבור BMP280 ו- BME280
ספרייה עבור BMP280 ו- BME280
ספרייה עבור BMP280 ו- BME280
ספרייה עבור BMP280 ו- BME280

מבוא

לא יצא לי לכתוב את הספרייה הזו. זה "קרה" כתופעת לוואי של פרויקט שהתחלתי שמשתמש ב- BMP280. הפרויקט עדיין לא הסתיים, אבל אני חושב שהספרייה מוכנה לשתף אחרים. לאחר מכן היה לי צורך להשתמש ב- BME280, המוסיף מדידת לחות ליכולת הלחץ והטמפרטורה של ה- BMP280. ה- BME280 הוא "תואם לאחור" עם BMP280 - כלומר, כל הרשמים והשלבים הדרושים לקריאת לחץ וטמפרטורה מה- BME280 זהים לאלה המשמשים את BMP280. ישנם רישומים ושלבים נוספים הדרושים לקריאת לחות, החלים על BME280 בלבד. זה מעלה את השאלה, ספרייה אחת לשניהם, או שתי ספריות נפרדות. החומרה לשני סוגי המכשירים ניתנת להחלפה מלאה. אפילו רבים מהמודולים הנמכרים (למשל ב- Ebay ו- AliExpress) מסומנים ב- BME/P280. כדי לברר באיזה סוג מדובר, עליך להסתכל על הכתיבה (הזעירה) על החיישן עצמו, או לבדוק את בייט מזהה המכשיר. החלטתי ללכת על ספרייה אחת. נראה שזה הסתדר תקין.

משוב, במיוחד כל הצעות לשיפור, יתקבל בברכה.

תכונות ויכולות הספרייה

ספרייה היא תוכנה המספקת ממשק תכנות יישומים (API) למתכנת לממש את יכולות המכשיר, מבלי בהכרח להתמודד עם כל הפרטים הדקים. רצוי, ה- API צריך להיות קל למתחילים עם דרישות פשוטות להתחיל, תוך מתן ניצול מלא של יכולות המכשיר. רצוי שהספרייה צריכה לעקוב אחר כל הנחיות ספציפיות של יצרן המכשיר, וכן שיטות עבודה כלליות לתוכנה. השתדלתי להשיג את כל אלה. כשהתחלתי עם BMP280, מצאתי 3 ספריות שונות עבורו: Adafruit_BMP280; Seeed_BMP280; ואחת בשם BMP280 מיצרן המכשירים. לא Adafruit ולא Seeed סיפקו יכולות מורחבות, למרות שהם עבדו היטב והיו קלים לשימוש ביישומים בסיסיים. לא הצלחתי להבין כיצד להשתמש בזה שיוצר על ידי יצרן המכשיר (Bosch Sensortec). זה יכול להיות החסר שלי, ולא שלהם. אולם הספרייה הייתה הרבה יותר מסובכת משני האחרים, לא הצלחתי למצוא הוראות או דוגמאות לשימוש (לאחר מכן מצאתי שהדוגמאות נמצאות בקובץ "bmp280_support.c", אולם אלה לא הועילו לי במיוחד).

כתוצאה מגורמים אלה, החלטתי לכתוב ספרייה משלי ל- BMP280.

כאשר הסתכלתי על מצב הספרייה עבור BME280, מצאתי ספריות נפרדות Adafruit_BME280, Seed_BME280 ועוד אחת BME280_MOD-1022 שנכתבה על ידי Embedded Adventures. אף אחד מהם לא שילב את הפונקציות עבור BMP280 בספרייה המסוגלת להשתמש ב- BME280. אף אחד מהם לא תמך במפורש ביכולת של המכשירים לאחסן כמה פיסות נתונים בזמן שהמכשיר והמיקרו -מעבד השולט בו ישנים (יכולת זו ניכרת בגיליון הנתונים ונתמכת בספרייה שכתבתי ותיארתי כאן).

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

יכולות מכשירים

BMP280 ו- BME280 הם התקני הרכבה על פני השטח בגודל של כ -5 מ"מ וגובהו 1 מ"מ. ישנם 8 רפידות ממשק, כולל 2 רפידות כניסת חשמל נפרדות ושתי כריות קרקע. הם זמינים ב- eBay כמודול עם החוצה 4 או 6 סיכות. למודול 4 פינים יש כתובת I2C קבועה ולא ניתן להגדיר אותו לשימוש בפרוטוקול SPI.

ניתן להשתמש במודול 6 פינים או במכשיר החשוף עם פרוטוקולי I2C או SPI. במצב I2C זה יכול להיות בעל שתי כתובות שונות, שהושגו על ידי חיבור סיכת ה- SDO או לקרקע (עבור כתובת בסיס = 0x76) או ל- Vdd (עבור כתובת בסיס +1 = 0x77). במצב SPI יש לו את הסידור הרגיל של שעון אחד, 2 נתונים (אחד לכל כיוון) וסיכת בחירת התקן (CS).

הספרייה שכתבתי ומתארת כאן תומכת רק ב- I2C. לספריות Adafruit_BMP280 ו- BME_MOD-1022 יש תמיכה הן ב- i2C והן ב- SPI.

את הספרייה ניתן להוריד כאן:

github.com/farmerkeith/BMP280-library

שלב 1: הגדרת החומרה

הגדרת החומרה
הגדרת החומרה

לפני שהספרייה יכולה להיות שימושית יש צורך לחבר מיקרו -בקר ל- BMP280 (או לשניים מהם אם תרצה).

השתמשתי ב- WeMos D1 mini pro, אז אראה את הקשרים שלו. בקרי מיקרו אחרים יהיו דומים, אתה רק צריך לחבר את סיכות ה- SDA וה- SCL כראוי.

במקרה של ה- WeMos D1 mini pro, החיבורים הם:

פונקציה WeMos סיכת BMP280 סיכות הערות

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin נקוב 3.3V קרקע GND בקרת כתובת SDO Ground או Vdd I2C בחר CSB Vdd (GND בוחר SPI)

שים לב שסיכת SDO בחלק ממודולי MP280 מסומנת ב- SDD, וסיכה Vdd עשויה להיות מסומנת כ- VCC. הערה: לקווי SDA ו- SCL צריכים להיות נגדי משיכה בין הקו לסיכה Vin. בדרך כלל ערך של 4.7K אמור להיות תקין. בחלק מהמודולים BMP280 ו- BME280 יש נגדי משיכה של 10K הכלולים במודול (וזה לא נוהג טוב, שכן הצבת מכשירים מרובים באוטובוס I2C עלולה לטעון אותו יתר על המידה). אולם שימוש בשני מודולים BME/P280 כל אחד עם נגד 10K לא אמור להוות בעיה בפועל כל עוד אין יותר מדי מכשירים אחרים באותו אוטובוס גם עם נגדי משיכה.

לאחר שהחומרה מחוברת, תוכל לבדוק בקלות אם המכשיר שלך הוא BMP280 או BME280 על ידי הפעלת הסקיצה I2CScan_ID שתמצא כאן:

אתה יכול גם לבדוק אם יש לך BMP280 או BME280 על ידי התבוננות במכשיר עצמו. מצאתי צורך להשתמש במיקרוסקופ דיגיטלי לשם כך, אך אם ראייתך טובה מאוד ייתכן שתוכל לעשות זאת ללא כל עזרים. על מעטפת המכשיר יש שתי שורות הדפסה. המפתח הוא האות הראשונה בשורה השנייה, שבמקרה של התקני BMP280 היא "K" ובמקרה של התקני BME280 היא "U".

שלב 2: ממשקי API המסופקים על ידי הספרייה

ממשקי API המסופקים על ידי הספרייה
ממשקי API המסופקים על ידי הספרייה
ממשקי API המסופקים על ידי הספרייה
ממשקי API המסופקים על ידי הספרייה

כולל הספרייה במערכון

הספרייה כלולה בסקיצה בצורה הסטנדרטית באמצעות המשפט

#כלול "farmerkeith_BMP280.h"

הצהרה זו צריכה להיכלל בחלק המוקדם של המערכון לפני תחילת פונקציית ההתקנה ().

יצירת אובייקט תוכנה BME או BMP

ישנן 3 רמות ליצירת אובייקט התוכנה BMP280. הפשוט ביותר הוא פשוט

bme280 objectName; או bmp280 objectName;

לדוגמה, BMP280 bmp0;

זה יוצר אובייקט תוכנה עם כתובת ברירת המחדל של 0x76 (כלומר עבור SDO המחובר לקרקע).

לשלב הבא ליצירת אובייקט תוכנה BME280 או BMP280 יש פרמטר של 0 או 1, כדלקמן:

bme280 objectNameA (0);

bmp280 objectNameB (1);

הפרמטר (0 או 1) מתווסף לכתובת הבסיס של I2C, כך שניתן להשתמש בשני התקני BME280 או BMP280 באותו אוטובוס I2C (כולל אחד מכל אחד).

הרמה השלישית ליצירת אובייקט תוכנה BME או BMP280 כוללת שני פרמטרים. הפרמטר הראשון, שהוא 0 או 1, הוא עבור הכתובת, כמו במקרה הקודם. הפרמטר השני שולט בהדפסת באגים. אם הוא מוגדר ל -1, כל עסקה עם אובייקט התוכנה מביאה ליציאות Serial.print המאפשרות למתכנת לראות את פרטי העסקה. לדוגמה:

bmp280 objectNameB (1, 1);

אם פרמטר הדפסת באגים מוגדר ל- 0, אובייקט התוכנה חוזר להתנהגות רגילה (ללא הדפסה).

הצהרה זו או הצהרות אלה יש לכלול לאחר הפונקציה #include ולפני פונקציית ההתקנה ().

אתחול אובייקט תוכנת BME או BMP

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

לצורך אתחול פשוט למטרות כלליות, ההצהרה היא:

objectName.begin ();

גרסה זו של begin () קוראת את פרמטרי הכיול מהמכשיר ומגדירה osrs_t = 7 (16 מדידות טמפרטורה), osrs_p = 7 (16 מדידות לחץ), mode = 3 (רציף, רגיל), t_sb = 0 (0.5 ms שינה בין ערכות מדידה), מסנן = 0 (K = 1, כך שאין סינון) ו- spiw_en = 0 (SPI מושבת, לכן השתמש ב- I2C). במקרה של BME280, יש פרמטר נוסף osrs_h = 7 עבור 16 מדידות לחות.

יש גרסה נוספת של begin () שלוקחת את כל ששת (או 7) הפרמטרים. המקבילה להצהרה לעיל היא

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en

או objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

רשימת הקודים המלאה ומשמעויותיהם נמצאת בגיליון הנתונים BME280 ו- BMP280, וגם בהערות בקובץ.cpp בספרייה.

מדידת טמפרטורה ולחץ פשוטה

כדי לקבל מדידת טמפרטורה הדרך הפשוטה ביותר היא

טמפרטורה כפולה = objectName.readTemperature (); // למדוד טמפרטורה

כדי לקבל מדידת לחץ הדרך הפשוטה ביותר היא

לחץ כפול = objectName.readPressure (); // למדוד לחץ

כדי לקבל מדידת לחות הדרך הפשוטה ביותר היא

לחות כפולה = objectName.readHumidity (); // למדוד לחות (BME280 בלבד)

כדי לקבל טמפרטורה ולחץ ניתן להשתמש בשתי ההצהרות הנ ל אחת אחרי השנייה, אך ישנה אפשרות נוספת שהיא:

טמפרטורה כפולה;

לחץ כפול = objectName.readPressure (טמפרטורה); // למדוד לחץ וטמפרטורה

הצהרה זו קוראת את הנתונים ממכשיר BME280 או BMP280 רק פעם אחת ומחזירה טמפרטורה ולחץ. זהו שימוש מעט יותר יעיל באוטובוס I2C ומבטיח ששתי הקריאות מתאימות לאותו מחזור מדידה.

עבור BME 280, הצהרה משולבת המקבלת את כל שלושת הערכים (לחות, טמפרטורה ולחץ) היא:

טמפרטורה כפולה, לחץ; לחות כפולה = objectName.readHumidity (טמפרטורה, לחץ); // למדוד לחות, לחץ וטמפרטורה

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

מקרי שימוש אלה מכוסים במערכונים לדוגמה המסופקים עם הספרייה, היותם basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino ו- basicHumidityAndTemperatureAndPressure.ino.

מדידת טמפרטורה ולחץ מתוחכמת יותר

למרות שסדרת ההצהרות לעיל תעבוד ללא בעיות, ישנן מספר בעיות:

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

תוצאה שמשתמשת פחות כוח, ונותנת טמפרטורה קרובה יותר לסביבה, ניתן להשיג על ידי שימוש ב- start () עם פרמטרים שמרדים אותו (למשל mode = 0). לדוגמה:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en [, osrs_h]

לאחר מכן, כאשר מבקשים מדידה, להעיר את המכשיר עם פקודת תצורה לרישום F2 (במידת הצורך) ו- F4 שקובעים את הערכים המתאימים של osrs_h, osrs_t ו- osrs_p, plus plus = 1 (מצב צילום יחיד). לדוגמה:

[objectName.updateF2Control (1);] // osrs_h - מעולם לא היה צורך ב- BMP280, // ואין צורך ב- BME280 אם מספר המדידות אינו משתנה // מהערך שסופק ב- begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

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

עיכוב זה יכול להתבצע בכמה אופנים.

  1. המתן פרק זמן קבוע כדי לכסות את העיכוב הצפוי הארוך ביותר
  2. המתן כמות זמן המחושבת מזמן המדידה המרבי לכל מדידה (כלומר 2.3 ms) כפולה ממספר המדידות, בתוספת תקורה, בתוספת מרווח.
  3. המתן פרק זמן קצר יותר המחושב כמפורט לעיל, אך השתמש בזמן המדידה הנומינלי (כלומר 2 אלפיות השנייה) בתוספת תקורה ולאחר מכן התחל לבדוק את ביט "אני מודד" ברשם הסטטוסים. כאשר ביט הסטטוס קורא 0 (כלומר, לא מדידה), קבל את קריאות הטמפרטורה והלחץ.
  4. התחל מייד לבדוק את רשימת הסטטוסים וקבל את קריאות הטמפרטורה והלחץ כאשר ביט הסטטוס קורא 0,

אראה דוגמה לאחת הדרכים לעשות זאת מעט מאוחר יותר.

פעולות רישום תצורה

כדי לגרום לכל זה לקרות, אנו זקוקים למספר כלים שטרם הצגתי. הם:

בייט readRegister (reg)

void updateRegister (reg, value)

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

הדוגמה powerSaverPressureAndTemperature.ino משתמשת בשיטה מס '3. שורת הקוד שעושה את הבדיקה החוזרת היא

while (bmp0.readRegister (0xF3) >> 3); // לולאה עד F3bit 3 == 0

שים לב שסקיצה זו מיועדת למיקרו -בקר ESP8266. השתמשתי ב- WeMos D1 mini pro. המערכון לא יעבוד עם בקרי מיקרו Atmega, שיש להם הוראות שינה שונות. סקיצה זו מפעילה מספר פקודות אחרות, לכן אציג את כולן לפני שאתאר את הסקיצה בפירוט רב יותר.

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

updateRegister (reg, value)

אבל הוא קצת יותר קל עם שלוש הפקודות הבאות:

updateF2Control (osrs_h); // BME280 בלבד

updateF4Control (osrs_t, osrs_p, mode); updateF5Config (t_sb, filter, spi3W_en);

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

updateF4Control16xSleep ();

updateF4ControlSleep (ערך);

שני אלה קובעים את סיביות המצב ל- 00 (כלומר מצב שינה). עם זאת הראשון מגדיר את osrs_t ו- osrs_p ל- 111 (כלומר 16 מדידות) ואילו השני מאחסן את 6 הסיביות הנמוכות מ"ערך "לביטים 7: 2 ברגיסט 0xF4.

באופן דומה ההצהרה הבאה מאחסן את ששת הביטים הנמוכים של "ערך" לביטים 7: 2 ברשומת 0xF5.

updateF5ConfigSleep (ערך);

השימוש בפקודות האחרונות מאפשר אחסון של 12 סיביות מידע ברשמי BMP280 F4 ו- F5. לפחות במקרה של ה- ESP8266, כאשר המיקרו -בקר מתעורר לאחר תקופה של שינה, הוא מתחיל בתחילת הסקיצה ללא ידיעה על מצבו לפני פקודת השינה. כדי לאחסן ידע על מצבו לפני פקודת השינה, ניתן לאחסן נתונים בזיכרון הבזק, באמצעות הפונקציות EEPROM או על ידי כתיבת קובץ באמצעות SPIFFS. עם זאת, לזיכרון פלאש יש מגבלה של מספר מחזורי הכתיבה, בסדר גודל של 10, 000 עד 100, 000. המשמעות היא שאם המיקרו-בקר עובר מחזור שינה-ער כל כמה שניות, הוא יכול לחרוג מכתיבת הזיכרון המותרת. הגבלה בעוד מספר חודשים. לאחסון כמה פיסות נתונים ב- BMP280 אין מגבלה כזו.

ניתן לאחזר את הנתונים המאוחסנים ברשומות F4 ו- F5 כאשר הבקר המיקרו מתעורר באמצעות הפקודות

readF4Sleep ();

readF5Sleep ();

פונקציות אלה קוראות את הרישום המתאים, משנות את התוכן כדי להסיר את 2 ה- LSB ומחזירים את 6 הסיביות הנותרות. פונקציות אלה משמשות בדוגמת הסקיצה powerSaverPressureAndTemperatureESP.ino כדלקמן:

// קרא ערך של EventCounter בחזרה מ- bmp0

בתים bmp0F4value = bmp0.readF4Sleep (); // 0 עד 63 בתים bmp0F5value = bmp0.readF5Sleep (); // 0 עד 63 eventCounter = bmp0F5value*64+bmp0F4value; // 0 עד 4095

פונקציות אלה קוראות את הרישום המתאים, משנות את התוכן כדי להסיר את 2 ה- LSB ומחזירים את 6 הסיביות הנותרות. פונקציות אלה משמשות בדוגמת הסקיצה powerSaverPressureAndTemperature.ino כדלקמן:

// קרא ערך של EventCounter בחזרה מ- bmp1

בתים bmp1F4value = bmp1.readF4Sleep (); // 0 עד 63 בתים bmp1F5value = bmp1.readF5Sleep (); // 0 עד 63 eventCounter = bmp1F5value*64+bmp1F4value; // 0 עד 4095

פונקציות טמפרטורה ולחץ גולמיות

לפונקציות הבסיסיות readTemperature, readPressure ו- readHumidity יש שני מרכיבים. ראשית, ערכי הטמפרטורה והלחץ הגולמיים של 20 סיביות מתקבלים מה- BME/P280, או שמערך הלחות הגולמי של 16 סיביות מתקבל מה- BME280. לאחר מכן אלגוריתם הפיצוי משמש ליצירת ערכי הפלט במעלות צלזיוס, hPa או %RH.

הספרייה מספקת פונקציות נפרדות עבור רכיבים אלה, כך שניתן להשיג את נתוני הטמפרטורה הגולמית, הלחץ והלחות, ואולי לתפעל בצורה כלשהי. האלגוריתם להפקת הטמפרטורה, הלחץ והלחות מערכי גלם אלה מסופק גם הוא. בספרייה אלגוריתמים אלה מיושמים באמצעות חשבון נקודה צפה באורך כפול. זה עובד היטב על ESP8266 שהוא מעבד 32 סיביות ומשתמש ב -64 סיביות למשתני צף "כפולים". הנגשת פונקציות אלה עשויה להיות שימושית להערכת ואולי שינוי החישוב עבור פלטפורמות אחרות.

פונקציות אלה הן:

readRawPressure (rawTemperature); // קורא נתוני לחץ וטמפרטורה גולמיים מ- BME/P280readRawHumidity (rawTemperature, rawPressure); // קורא נתוני לחות, טמפרטורה ולחץ גולמיים מ- BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

הטיעון "בסדר-בסדר" לפונקציות אלה שווה קצת הסבר. אלגוריתמי פיצוי הלחץ והלחות כוללים מרכיב תלוי טמפרטורה אשר מושג באמצעות המשתנה t_fine. הפונקציה calcTemperature כותבת ערך ב- t_fine בהתבסס על ההיגיון של אלגוריתם פיצוי הטמפרטורה, המשמש לאחר מכן כקלט הן ב- calcPressure והן ב- calcHumidity.

דוגמה לשימוש בפונקציות אלה ניתן למצוא בסקיצה לדוגמא rawPressureAndTemperature.ino, וגם בקוד עבור הפונקציה readHumidity () בקובץ.cpp של הספרייה.

לחץ גובה וגובה פני הים

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

  • גובה מעל פני הים
  • לחץ האוויר בפועל בגובה זה
  • לחץ אוויר שווה בגובה פני הים (ליתר דיוק, ממוצע פני הים, מכיוון שרמת הים המיידית משתנה כל הזמן)

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

calcAltitude (לחץ, seaLevelhPa);

calcNormalisedPressure (לחץ, גובה);

יש גם גרסה פשוטה יותר, המניחה את הלחץ הסטנדרטי של פני הים של 1013.15 hPa.

calcAltitude (לחץ); // סטנדרטי של seaLevelPressure

שלב 3: פרטי מכשיר BMP280

פרטי מכשיר BMP280
פרטי מכשיר BMP280

יכולות חומרה

ל- BMP280 יש 2 בתים של נתוני תצורה (בכתובות רישום 0xF4 ו- 0xF5) המשמשים לשליטה במספר אפשרויות מדידה ופלט נתונים. הוא מספק גם 2 סיביות של מידע סטטוס ו -24 בתים של פרמטרי כיול המשמשים בהמרת ערכי הטמפרטורה והלחץ הגולמיים ליחידות טמפרטורה ולחץ רגילות. ל- BME280 נתונים נוספים כדלקמן:

  • 1 בתים נוספים של נתוני תצורה בכתובת הרשומה 0xF2 המשמשים לשליטה על מדידות לחות מרובות;
  • 8 בתים נוספים של פרמטרי כיול המשמשים בהמרת ערך הלחות הגולמית לאחוז לחות יחסית.

רשימות הטמפרטורה, הלחץ והסטטוס עבור BME280 זהים ל BMP280 עם חריגים קלים כדלקמן:

  • סיביות ה"זהות "של BME280 מוגדרות ל- 0x60, כך שניתן להבחין בה בין BMP280 שעשויות להיות 0x56, 0x57 או 0x58
  • פקד זמן השינה (t_sb) משתנה כך ששני הזמנים הארוכים ב- BMP280 (2000 ms ו- 4000 ms) מוחלפים ב- BME280 בזמנים קצרים של 10 ms ו- 20 ms. זמן השינה המרבי ב- BME280 הוא 1000 אלפיות השנייה.
  • ב- BME280 הערכים הגולמיים של הטמפרטורה והלחץ הם תמיד 20 סיביות אם הוחל סינון. השימוש בערכים של 16 עד 19 סיביות מוגבל למקרים ללא סינון (כלומר מסנן = 0).

טמפרטורה ולחץ הם כל ערכי 20 סיביות, אותם יש להמיר לטמפרטורה ולחץ קונבנציונאלי באמצעות אלגוריתם די מורכב באמצעות 3 פרמטרים של כיול של 16 סיביות לטמפרטורה, ו -9 פרמטרים של כיול של 16 ביט בתוספת הטמפרטורה ללחץ. הגרנולטיות של מדידת הטמפרטורה היא 0.0003 מעלות צלזיוס לשינוי סיביות פחות משמעותי (קריאה של 20 סיביות), ועולה ל 0.0046 מעלות צלזיוס אם משתמשים בפריצת 16 סיביות.

לחות היא ערך של 16 סיביות שצריך להמיר ללחות יחסית באמצעות אלגוריתם מורכב אחר באמצעות 6 פרמטרי כיול שהם תערובת של 8, 12 ו -16 סיביות.

גליון הנתונים מציג את הדיוק המוחלט של קריאת הטמפרטורה כ -0.5 מעלות צלזיוס ב 25 מעלות צלזיוס ו -1 מעלות צלזיוס בטווח 0 עד 65 מעלות צלזיוס.

המפורטות של מדידת הלחץ היא 0.15 פסקל (כלומר 0.0015 hekto פסקל) ברזולוציה של 20 ביט, או 2.5 פסקל ברזולוציה של 16 סיביות. ערך הלחץ הגולמי מושפע מהטמפרטורה, כך שבסביבות 25C, עלייה בטמפרטורה של 1 מעלות צלזיוס מפחיתה את הלחץ הנמדד ב- 24 פסקל. רגישות הטמפרטורה מובאת בחשבון באלגוריתם הכיול, ולכן ערכי הלחץ הנמסרים צריכים להיות מדויקים בטמפרטורות שונות.

דף הנתונים מציג את הדיוק המוחלט של קריאת הלחץ כ -1 hPa לטמפרטורות שבין 0 C ל- 65 C.

דיוק הלחות ניתן בגיליון הנתונים כ -3% לחות יחסית, ו -1% היסטריה.

איך זה עובד

את 24 הבייטים של נתוני כיול הטמפרטורה והלחץ, וגם במקרה של BME280, יש לקרוא את 8 הבייטים של נתוני כיול הלחות מהמכשיר ולאחסן אותם במשתנים. נתונים אלה מתוכנתים בנפרד במכשיר במפעל, כך שלמכשירים שונים יש ערכים שונים - לפחות עבור חלק מהפרמטרים. BME/P280 יכול להיות באחד משני מצבים. במצב אחד הוא מודד. במצב השני הוא מחכה (ישן).

באיזה מצב הוא נמצא ניתן לבדוק על ידי הסתכלות בביט 3 של הרישום 0xF3.

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

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

הדרך הנוספת להפעלת BME/P280 היא מצב Single Shot (נקרא מצב Forced בגליון הנתונים). במצב זה המכשיר מתעורר משינה על ידי פקודה למדידה, הוא מבצע מערך מדידות ואז חוזר לישון. מספר המדידות האישיות בערכה נשלט בפקודת התצורה שמעירה את המכשיר.

ב- BMP280, אם מתבצעת מדידה אחת, מאוכלסים 16 הסיביות המשמעותיות ביותר בערך, וארבעת הביטים הפחות משמעותיים בקריאת הערך הם כולם אפסים. ניתן להגדיר את מספר המדידות ל -1, 2, 4, 8 או 16 וככל שמספר המדידות גדל, מספר הביטים המאוכלסים בנתונים גדל, כך שעם 16 מדידות כל 20 הסיביות מאוכלסות בנתוני מדידה. גליון הנתונים מתייחס לתהליך זה כדגימת יתר.

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

כל מדידה בודדת אורכת כ -2 אלפיות השנייה (ערך אופייני; הערך המקסימלי הוא 2.3 אלפיות השנייה). הוסף לכך תקורה קבועה של כ -2 אלפיות השנייה (בדרך כלל קצת פחות) פירושה שרצף מדידה, שיכול להיות מורכב מ -1 עד 32 מדידות בודדות, יכול להימשך בין 4 אלפיות השנייה עד ל -66 אלפיות השנייה.

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

רשימות בקרת תצורה

שני אוגרי בקרת התצורה ב- BMP280 נמצאים בכתובות הרשומות 0xF4 ו- 0xF5, ומופים על 6 ערכי בקרת תצורה בודדים. 0xF4 מורכב מ:

  • 3 סיביות osrs_t (למדוד טמפרטורה 0, 1, 2, 4, 8 או 16 פעמים);
  • 3 סיביות osrs_p (למדוד לחץ 0, 1, 2, 4, 8 או 16 פעמים); ו
  • מצב 2 סיביות (שינה, כפייה (כלומר צילום יחיד), רגיל (כלומר רציף).

0xF5 מורכב מ:

  • 3 סיביות t_sb (זמן המתנה, 0.5ms עד 4000ms);
  • מסנן 3 סיביות (ראה להלן); ו
  • 1 bit spiw_en שבוחר SPI או I2C.

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

ערך (n) = ערך (n-1) * (K-1) / K + מדידה (n) / K

כאשר (n) מציין את ערך המדידה והפלט העדכני ביותר; ו- K הוא פרמטר המסנן. פרמטר המסנן K וניתן להגדיר אותו ל- 1, 2, 4, 8 או 16. אם K מוגדר ל -1 המשוואה הופכת רק לערך (n) = מדידה (n). הקידוד של פרמטר המסנן הוא:

  • מסנן = 000, K = 1
  • מסנן = 001, K = 2
  • מסנן = 010, K = 4
  • מסנן = 011, K = 8
  • מסנן = 1xx, K = 16

BME 280 מוסיף עוד פקד בקרת תצורה בכתובת 0xF2, "ctrl_hum" עם פרמטר יחיד של 3 סיביות osrs_h (מדוד לחות 0, 1, 2, 4, 8 או 16 פעמים).

שלב 4: מדידה ותזמון קריאה

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

Iddt - זרם במדידת טמפרטורה. ערך אופייני 325 uA

Iddp - זרם במדידת לחץ. ערך אופייני 720 uA, מקסימום 1120 uA

Iddsb - זרם במצב המתנה. ערך אופייני 0.2 uA, מקסימום 0.5 uA

Iddsl - זרם במצב שינה. ערך אופייני 0.1 uA, מקסימום 0.3 uA

שלב 5: הנחיות תוכנה

הנחיות תוכנה
הנחיות תוכנה
הנחיות תוכנה
הנחיות תוכנה

מצב פרץ I2C

גליון הנתונים BMP280 מספק הנחיות לגבי קריאת נתונים (סעיף 3.9). כתוב "מומלץ בחום להשתמש בפרץ קריאה ולא להתייחס לכל רישום בנפרד. הדבר ימנע ערבוב אפשרי של בתים השייכים למדידות שונות ויפחית את תעבורת הממשק". לא ניתנת הנחיות בנוגע לקריאת פרמטרי הפיצוי/הכיול. יש להניח שאלה אינם מהווים בעיה מכיוון שהם סטטיים ואינם משתנים.

ספרייה זו קוראת את כל הערכים הרציפים בפעולת קריאה בודדת - 24 בתים במקרה של פרמטרי הטמפרטורה והפיצוי בלחץ, 6 בתים לטמפרטורה ולחץ משולבים, ו -8 בתים ללחות, טמפרטורה ולחץ יחד. כאשר הטמפרטורה בלבד נבדקת, רק 3 בתים נקראים.

שימוש בפקודות מאקרו (#define וכו ')

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

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

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

המקרה לשימוש ב- const ולא ב- #define די ברור - const משתמש באותם משאבים כמו #define (כלומר אפס) והערכים המתקבלים פועלים לפי כללי ההיקף, ובכך מפחיתים את הסיכוי לטעויות.

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

שלב 6: ביצועי טמפרטורה

אני מתכוון להוסיף זאת מאוחר יותר.

שלב 7: ביצועי לחץ

אני מתכוון להוסיף זאת מאוחר יותר.

מוּמלָץ: