جدول المحتويات:

مكتبة BMP280 و BME280: 7 خطوات
مكتبة BMP280 و BME280: 7 خطوات

فيديو: مكتبة BMP280 و BME280: 7 خطوات

فيديو: مكتبة BMP280 و BME280: 7 خطوات
فيديو: Lesson 29: Introduction to BMP280 Temperature Sensor| Arduino Step By Step Course 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) للمبرمج لممارسة قدرات الجهاز ، دون الحاجة بالضرورة إلى التعامل مع جميع التفاصيل الدقيقة. مرغوب فيه ، يجب أن تكون واجهة برمجة التطبيقات سهلة للمبتدئين بمتطلبات بسيطة للبدء ، مع توفير الاستغلال الكامل لقدرات الجهاز. من المستحسن أن تتبع المكتبة أي إرشادات محددة من الشركة المصنعة للجهاز ، بالإضافة إلى الممارسات الجيدة العامة للبرامج. لقد سعيت لتحقيق كل هذا. عند البدء بـ 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 وسادات للواجهة ، بما في ذلك وسادتا إدخال منفصلتان للطاقة ومنصتان أرضيتان. وهي متوفرة على موقع 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 pin BMP280 pin Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND التحكم في العنوان SDO Ground أو Vdd I2C حدد CSB Vdd (GND يحدد SPI)

لاحظ أن دبوس SDO الموجود في بعض وحدات MP280 يسمى SDD ، وقد يكون دبوس Vdd مُسمى VCC. ملاحظة: يجب أن تحتوي خطوط SDA و SCL على مقاومات سحب بين الخط ودبوس Vin. عادةً يجب أن تكون القيمة 4.7 كيلو بايت على ما يرام. تحتوي بعض وحدات BMP280 و BME280 على مقاومات سحب 10 كيلو متضمنة في الوحدة (وهي ليست ممارسة جيدة ، لأن وضع أجهزة متعددة على ناقل I2C قد يؤدي إلى تحميلها بشكل مفرط). ومع ذلك ، فإن استخدام وحدتين BME / P280 بمقاوم 10K لا ينبغي أن يكون مشكلة في الممارسة العملية طالما لا يوجد العديد من الأجهزة الأخرى على نفس الناقل أيضًا بمقاومات سحب.

بمجرد توصيل الأجهزة ، يمكنك بسهولة التحقق مما إذا كان جهازك هو BMP280 أو BME280 عن طريق تشغيل الرسم التخطيطي I2CScan_ID الذي يمكنك العثور عليه هنا:

يمكنك أيضًا التحقق مما إذا كان لديك BMP280 أو BME280 من خلال النظر إلى الجهاز نفسه. لقد وجدت أنه من الضروري استخدام مجهر رقمي للقيام بذلك ، ولكن إذا كان بصرك جيدًا جدًا ، فقد تتمكن من القيام بذلك دون أي مساعدات. يوجد سطرين للطباعة على غلاف الجهاز. المفتاح هو الحرف الأول في السطر الثاني ، وهو في حالة أجهزة BMP280 هو "K" وفي حالة أجهزة BME280 هو "U".

الخطوة 2: واجهات برمجة التطبيقات التي توفرها المكتبة

واجهات برمجة التطبيقات التي توفرها المكتبة
واجهات برمجة التطبيقات التي توفرها المكتبة
واجهات برمجة التطبيقات التي توفرها المكتبة
واجهات برمجة التطبيقات التي توفرها المكتبة

بما في ذلك المكتبة في رسم تخطيطي

يتم تضمين المكتبة في رسم تخطيطي بالطريقة القياسية باستخدام البيان

# تضمين "farmerkeith_BMP280.h"

يجب تضمين هذه العبارة في الجزء الأول من المخطط قبل بدء وظيفة الإعداد ().

إنشاء كائن برنامج BME أو BMP

هناك 3 مستويات لإنشاء كائن برنامج BMP280. أبسط هو عادل

اسم الكائن bme280 ؛ أو 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 وقبل وظيفة setup ().

تهيئة كائن برنامج BME أو BMP

قبل الاستخدام ، من الضروري قراءة معلمات المعايرة من الجهاز ، وتكوينها لأي وضع قياس ، وتجاوز في العينات ، وإعدادات مرشح مناسبة.

من أجل تهيئة بسيطة للأغراض العامة ، فإن البيان هو:

objectName.begin () ،

يقرأ هذا الإصدار من start () معلمات المعايرة من الجهاز ويضبط osrs_t = 7 (16 قياسًا لدرجة الحرارة) ، osrs_p = 7 (16 قياسًا للضغط) ، الوضع = 3 (مستمر ، عادي) ، t_sb = 0 (0.5 مللي ثانية من السكون بين مجموعات القياس) ، عامل التصفية = 0 (K = 1 ، لذلك لا يوجد تصفية) و spiw_en = 0 (SPI معطل ، لذا استخدم I2C). في حالة BME280 ، توجد معلمة إضافية osrs_h = 7 لـ 16 قياسًا للرطوبة.

هناك إصدار آخر من start () يأخذ جميع المعلمات الستة (أو 7). ما يعادل البيان أعلاه هو

objectName.begin (7 ، 7 ، 3 ، 0 ، 0 ، 0) ؛ // osrs_t، osrs_p، mode، t_sb، filter، spiw_ar

أو 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 ، فإن العبارة المجمعة التي تحصل على القيم الثلاث (الرطوبة ودرجة الحرارة والضغط) هي:

درجة حرارة مزدوجة ، ضغط ؛ رطوبة مزدوجة = اسم الكائن.قراءة الرطوبة (درجة الحرارة ، الضغط) ؛ // قياس الرطوبة والضغط ودرجة الحرارة

يقرأ هذا البيان البيانات من جهاز BMP280 مرة واحدة فقط ، ويعيد جميع القيم الثلاثة. يعد هذا استخدامًا أكثر فاعلية إلى حد ما لناقل I2C ويضمن أن تتوافق القراءات الثلاث مع نفس دورة القياس. لاحظ أنه يمكن تغيير أسماء المتغيرات إلى أي شيء يحبه المستخدم ، ولكن ترتيبها ثابت - تأتي درجة الحرارة أولاً ، ويأتي الضغط في المرتبة الثانية.

يتم تغطية حالات الاستخدام هذه في أمثلة الرسومات المقدمة مع المكتبة ، وهي basicTemperature.ino و basicPressure.ino و basicHumidity.ino و basicTemperatureAndPressure.ino و basicHumidityAndTemperatureAndPressure.ino.

قياس درجة الحرارة والضغط الأكثر تطوراً

على الرغم من أن سلسلة البيانات المذكورة أعلاه ستعمل دون مشاكل ، إلا أن هناك مشكلتين:

  1. الجهاز يعمل بشكل مستمر ، وبالتالي يستهلك الطاقة بأقصى مستوى. إذا كانت الطاقة تأتي من بطارية ، فقد يكون من الضروري تقليل ذلك.
  2. بسبب الطاقة المستهلكة ، سيواجه الجهاز ارتفاعًا في درجة الحرارة ، وبالتالي ستكون درجة الحرارة المقاسة أعلى من درجة الحرارة المحيطة. سأغطي هذا أكثر في خطوة لاحقة.

يمكن الحصول على النتيجة التي تستخدم طاقة أقل ، وتعطي درجة حرارة أقرب إلى درجة الحرارة المحيطة ، باستخدام start () مع المعلمات التي تضعها في وضع السكون (مثل الوضع = 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 ، بالإضافة إلى الوضع = 1 (وضع اللقطة الواحدة). على سبيل المثال:

[objectName.updateF2Control (1) ؛] // osrs_h - لم يكن مطلوباً لـ BMP280 ،

// وليس ضروريًا لـ BME280 إذا لم يتم تغيير عدد القياسات // من القيمة المقدمة في start (). objectName.updateF4Control (1، 1، 1) ؛ // osrs_t، osrs_p، mode

بعد إيقاظ الجهاز ، سيبدأ القياس ، لكن النتيجة لن تكون متاحة لبعض المللي ثانية - 4 مللي ثانية على الأقل ، ربما حتى 70 مللي ثانية أو أكثر ، اعتمادًا على عدد القياسات التي تم تحديدها. إذا تم إرسال أمر القراءة على الفور ، فسيعيد الجهاز القيم من القياس السابق - والتي قد تكون مقبولة في بعض التطبيقات ، ولكن في معظم الحالات يكون من الأفضل التأخير حتى يتوفر القياس الجديد.

يمكن القيام بهذا التأخير بعدة طرق.

  1. انتظر فترة زمنية محددة لتغطية أطول تأخير متوقع
  2. انتظر مقدار الوقت المحسوب من الحد الأقصى لوقت القياس لكل قياس (أي 2.3 مللي ثانية) ضعف عدد القياسات ، بالإضافة إلى النفقات العامة ، بالإضافة إلى الهامش.
  3. انتظر فترة زمنية أقصر محسوبة على النحو الوارد أعلاه ، ولكن باستخدام وقت القياس الاسمي (أي 2 مللي ثانية) بالإضافة إلى النفقات العامة ، ثم ابدأ في التحقق من بت "أنا أقيس" في سجل الحالة. عندما تقرأ بت الحالة 0 (أي لا تقيس) ، احصل على قراءات درجة الحرارة والضغط.
  4. ابدأ فورًا في التحقق من سجل الحالة ، واحصل على قراءات درجة الحرارة والضغط عندما تقرأ بت الحالة 0 ،

سأعرض مثالاً على إحدى طرق القيام بذلك لاحقًا.

تكوين عمليات التسجيل

لتحقيق كل هذا ، نحتاج إلى العديد من الأدوات التي لم أقم بإدخالها بعد. هم انهم:

قراءة البايت تسجيل (reg)

تحديث باطل

يحتوي كل من هؤلاء على العديد من الأوامر المشتقة في المكتبة ، مما يجعل البرنامج لإجراءات محددة أبسط قليلاً.

يستخدم المثال powerSaverPressureAndTemperature.ino الطريقة رقم 3. سطر الكود الذي يقوم بالفحص المتكرر هو

بينما (bmp0.readRegister (0xF3) >> 3) ؛ // حلقة untl F3bit 3 == 0

لاحظ أن هذا الرسم التخطيطي مخصص لمتحكم ESP8266. لقد استخدمت جهاز WeMos D1 mini pro. لن يعمل الرسم مع ميكروكنترولر Atmega ، والتي لها تعليمات مختلفة للنوم. يمارس هذا الرسم عدة أوامر أخرى ، لذا سأقدمها جميعًا قبل وصف هذا الرسم بمزيد من التفصيل.

عندما تنام وحدة التحكم الدقيقة بالتوازي مع مستشعر BMP280 ، يمكن تكوين المستشعر للقياسات المطلوبة في الأمر start () ، باستخدام المعلمات الستة. ومع ذلك ، إذا لم يكن المتحكم الدقيق في وضع السكون ، ولكن المستشعر كان في حالة سكون ، فيجب عندئذٍ إيقاظ المستشعر في وقت القياس وإخباره بتكوين القياس الخاص به. يمكن القيام بذلك مباشرة مع

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. ومع ذلك ، فإن ذاكرة الفلاش لها قيود على عدد دورات الكتابة ، بترتيب يتراوح من 10000 إلى 100000. وهذا يعني أنه إذا كان المتحكم الدقيق يمر بدورة سكون واستيقاظ كل بضع ثوانٍ ، فيمكن أن يتجاوز الكتابة في الذاكرة المسموح بها حد في بضعة أشهر. لا يوجد مثل هذا القيد لتخزين بضع أجزاء من البيانات في BMP280.

يمكن استرداد البيانات المخزنة في السجلات F4 و F5 عندما يستيقظ الميكروكونترولر باستخدام الأوامر

readF4Sleep () ،

readF5Sleep () ،

تقرأ هذه الوظائف السجل المقابل ، وتحول المحتويات لإزالة 2 LSBs وإرجاع الـ 6 بت المتبقية. تُستخدم هذه الوظائف في مثال رسم powerSaverPressureAndTemperatureESP.ino على النحو التالي:

// قراءة قيمة EventCounter من bmp0

البايت bmp0F4value = bmp0.readF4Sleep () ، // 0 إلى 63 بايت bmp0F5value = bmp0.readF5Sleep () ؛ // 0 إلى 63 eventCounter = bmp0F5value * 64 + bmp0F4value ؛ // 0 إلى 4095

تقرأ هذه الوظائف السجل المقابل ، وتحول المحتويات لإزالة 2 LSBs وإرجاع 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 (درجة الحرارة الخام ، الضغط الخام) ؛ // يقرأ بيانات الرطوبة ودرجة الحرارة والضغط الخام من BME280 calcTemperature (درجة الحرارة الخام ، t_fine) ؛ calcPressure (ضغط خام ، t_fine) ؛ الرطوبة (الرطوبة الخام ، t_fine)

تستحق حجة "t-fine" لهذه الوظائف القليل من الشرح. تتضمن كل من خوارزميات تعويض الضغط والرطوبة مكونًا يعتمد على درجة الحرارة يتم تحقيقه من خلال متغير t_fine. تكتب الدالة calcTemperature قيمة في t_fine بناءً على منطق خوارزمية تعويض درجة الحرارة ، والتي تُستخدم بعد ذلك كمدخل في كل من calcPressure و calcHumidity.

يمكن العثور على مثال لاستخدام هذه الوظائف في المثال التخطيطي rawPressureAndTemperature.ino ، وكذلك في الكود الخاص بوظيفة readHumidity () في ملف.cpp للمكتبة.

الارتفاع وضغط مستوى سطح البحر

هناك علاقة معروفة بين الضغط الجوي والارتفاع. يؤثر الطقس أيضًا على الضغط. عندما تنشر منظمات الطقس معلومات الضغط الجوي ، فإنها عادةً ما تعدلها وفقًا للارتفاع ولذا فإن "المخطط السينوبتيكي" يعرض خطوط تساوي الضغط (خطوط الضغط المستمر) موحدة لتعني مستوى سطح البحر. إذن هناك 3 قيم في هذه العلاقة ، ومعرفة اثنتين منها تمكن من اشتقاق القيمة الثالثة. القيم الثلاث هي:

  • ارتفاع فوق مستوى سطح البحر
  • ضغط الهواء الفعلي على هذا الارتفاع
  • ضغط جوي مكافئ عند مستوى سطح البحر (بشكل أكثر دقة ، يعني مستوى سطح البحر ، لأن مستوى سطح البحر يتغير باستمرار)

توفر هذه المكتبة وظيفتين لهذه العلاقة ، على النحو التالي:

ارتفاع كلس (الضغط ، مستوى البحر) ؛

calcNormalised الضغط (الضغط ، الارتفاع) ؛

هناك أيضًا نسخة مبسطة تفترض ضغط مستوى سطح البحر القياسي 1013.15 hPa.

ارتفاعات الحساب (الضغط) ؛ // معيار 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 مللي ثانية و 4000 مللي ثانية) في BME280 بأوقات قصيرة تبلغ 10 مللي ثانية و 20 مللي ثانية. الحد الأقصى لوقت السكون في 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 هيكتوباسكال) بدقة 20 بت ، أو 2.5 باسكال بدقة 16 بت. تتأثر قيمة الضغط الخام بدرجة الحرارة ، حيث أن ارتفاع درجة الحرارة بمقدار 1 درجة مئوية تقريبًا يؤدي إلى انخفاض الضغط المقاس بمقدار 24 باسكال. يتم احتساب حساسية درجة الحرارة في خوارزمية المعايرة ، لذلك يجب أن تكون قيم الضغط التي يتم تسليمها دقيقة عند درجات حرارة مختلفة.

تُظهر ورقة البيانات الدقة المطلقة لقراءة الضغط على أنها + -1 hPa لدرجات حرارة بين 0 درجة مئوية و 65 درجة مئوية.

تم تحديد دقة الرطوبة في ورقة البيانات على أنها + -3٪ رطوبة نسبية و + -1٪ تخلفية.

كيف تعمل

يجب قراءة 24 بايت من بيانات معايرة درجة الحرارة والضغط ، وكذلك في حالة BME280 ، 8 بايت من بيانات معايرة الرطوبة من الجهاز وتخزينها في متغيرات. تتم برمجة هذه البيانات بشكل فردي في الجهاز في المصنع ، لذلك فإن الأجهزة المختلفة لها قيم مختلفة - على الأقل بالنسبة لبعض المعلمات. يمكن أن يكون BME / P280 في إحدى الحالتين. في حالة واحدة هو القياس. في الحالة الأخرى تنتظر (نائمة).

يمكن التحقق من الحالة التي توجد بها من خلال النظر في البت 3 من السجل 0xF3.

يمكن الحصول على نتائج أحدث قياس في أي وقت من خلال قراءة قيمة البيانات المقابلة ، بغض النظر عما إذا كان الجهاز في وضع السكون أو القياس.

هناك أيضًا طريقتان لتشغيل BME / P280. الأول هو الوضع المستمر (يسمى الوضع العادي في ورقة البيانات) والذي يتنقل بشكل متكرر بين حالات القياس والسكون. في هذا الوضع ، يجري الجهاز مجموعة من القياسات ، ثم يذهب إلى وضع السكون ، ثم يستيقظ لمجموعة أخرى من القياسات ، وما إلى ذلك. يمكن التحكم في عدد القياسات الفردية ومدة جزء النوم من الدورة من خلال سجلات التكوين.

الطريقة الأخرى لتشغيل BME / P280 هي وضع اللقطة الواحدة (يسمى الوضع القسري في ورقة البيانات). في هذا الوضع ، يتم إيقاظ الجهاز من وضع السكون بأمر للقياس ، ويقوم بمجموعة من القياسات ، ثم يعود إلى النوم. يتم التحكم في عدد القياسات الفردية في المجموعة في أمر التكوين الذي يوقظ الجهاز.

في BMP280 ، إذا تم إجراء قياس واحد ، فسيتم ملء 16 بتة الأكثر أهمية في القيمة ، وأربع بتات أقل أهمية في قراءة القيمة كلها أصفار. يمكن ضبط عدد القياسات على 1 أو 2 أو 4 أو 8 أو 16 ، ومع زيادة عدد القياسات ، يزداد عدد البتات المليئة بالبيانات ، بحيث يتم ملء جميع البتات العشرين ببيانات القياس مع 16 قياسًا. تشير ورقة البيانات إلى هذه العملية على أنها الإفراط في أخذ العينات.

في 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.5 مللي ثانية إلى 4000 مللي ثانية) ؛
  • مرشح 3 بت (انظر أدناه) ؛ و
  • 1 بت spiw_en الذي يحدد SPI أو I2C.

تتحكم معلمة المرشح في نوع من خوارزمية الانحلال الأسي ، أو مرشح الاستجابة النبضية اللانهائية (IIR) ، المطبقة على قيم قياس الضغط الخام ودرجة الحرارة (ولكن ليس على قيم الرطوبة). المعادلة معطاة في ورقة البيانات. عرض آخر هو:

القيمة (ن) = القيمة (ن -1) * (ك -1) / ك + القياس (ن) / ك

حيث (ن) تشير إلى أحدث قيمة للقياس والمخرجات ؛ و 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: أداء الضغط

أخطط لإضافة هذا لاحقًا.

موصى به: