فهرست مطالب:

کتابخانه برای BMP280 و BME280: 7 مرحله
کتابخانه برای BMP280 و BME280: 7 مرحله

تصویری: کتابخانه برای BMP280 و BME280: 7 مرحله

تصویری: کتابخانه برای BMP280 و BME280: 7 مرحله
تصویری: Lesson 30: BMP280 Temperature Sensor with LCD1602 | 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 قابل اجرا است. این س theال را ایجاد می کند ، یک کتابخانه برای هر دو ، یا دو کتابخانه جداگانه. سخت افزار دو نوع دستگاه کاملاً قابل تعویض است. حتی بسیاری از ماژول های فروخته شده (به عنوان مثال در 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 پد ورودی برق جداگانه و دو پد Ground وجود دارد. آنها در eBay به عنوان ماژول با 4 یا 6 پین در دسترس هستند. ماژول 4 پین دارای آدرس I2C ثابت است و نمی توان آن را برای استفاده از پروتکل SPI پیکربندی کرد.

ماژول 6 پین یا دستگاه برهنه را می توان با پروتکل های I2C یا SPI استفاده کرد. در حالت I2C می تواند دو آدرس متفاوت داشته باشد که با اتصال پین SDO به Ground (برای آدرس پایه = 0x76) یا به Vdd (برای آدرس پایه +1 = 0x77) بدست می آید. در حالت SPI دارای آرایش معمول 1 ساعت ، 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 Ground GND آدرس کنترل SDO Ground یا Vdd I2C CSB Vdd را انتخاب کنید (GND SPI را انتخاب می کند)

توجه داشته باشید که پین SDO در برخی از ماژول های MP280 دارای برچسب SDD است و پین Vdd ممکن است برچسب VCC داشته باشد. توجه: خطوط SDA و SCL باید دارای مقاومت کششی بین خط و پین Vin باشند. به طور معمول مقدار 4.7K باید خوب باشد. برخی از ماژول های BMP280 و BME280 دارای مقاومت های کششی 10K در ماژول هستند (این عمل خوبی نیست ، زیرا قرار دادن چندین دستگاه در گذرگاه I2C ممکن است بار بیش از حد آن را بارگذاری کند). با این حال ، استفاده از 2 ماژول BME/P280 که هر کدام دارای یک مقاومت 10K هستند ، در عمل مشکلی ایجاد نمی کند ، مگر اینکه تعداد زیادی دستگاه دیگر در یک گذرگاه با مقاومت کششی وجود نداشته باشد.

پس از اتصال سخت افزار ، می توانید با اجرای طرح I2CScan_ID دستگاه خود را به راحتی BMP280 یا BME280 بررسی کنید که می توانید در اینجا پیدا کنید:

همچنین می توانید با مشاهده خود دستگاه BMP280 یا BME280 را بررسی کنید. استفاده از میکروسکوپ دیجیتال را برای این کار ضروری دیدم ، اما اگر بینایی شما بسیار خوب باشد ممکن است بتوانید بدون هیچ گونه کمکی این کار را انجام دهید. دو خط چاپ روی بدنه دستگاه وجود دارد. کلید حرف اول در خط دوم است ، که در مورد دستگاههای BMP280 یک "K" و در مورد دستگاههای BME280 یک "U" است.

مرحله 2: API های ارائه شده توسط کتابخانه

API های ارائه شده توسط کتابخانه
API های ارائه شده توسط کتابخانه
API های ارائه شده توسط کتابخانه
API های ارائه شده توسط کتابخانه

شامل کتابخانه در طرح

کتابخانه با استفاده از دستور به صورت استاندارد در یک طرح گنجانده شده است

#شامل "farmerkeith_BMP280.h"

این عبارت قبل از شروع تابع setup () باید در قسمت اولیه طرح قرار گیرد.

ایجاد یک شیء نرم افزاری 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 و قبل از تابع setup () گنجانده شوند.

راه اندازی شیء نرم افزاری BME یا BMP

قبل از استفاده ، لازم است پارامترهای کالیبراسیون را از دستگاه بخوانید و آن را برای هر حالت اندازه گیری ، نمونه برداری بیش از حد و تنظیمات فیلتر مناسب تنظیم کنید.

برای راه اندازی ساده و عمومی ، این عبارت به شرح زیر است:

objectName.begin ()؛

این نسخه شروع () پارامترهای کالیبراسیون را از دستگاه می خواند و 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 اندازه گیری رطوبت وجود دارد.

نسخه دیگری از begin () وجود دارد که همه شش (یا 7) پارامتر را می گیرد. معادل عبارت بالا برابر است

objectName.begin (7 ، 7 ، 3 ، 0 ، 0 ، 0) ؛ // osrs_t ، osrs_p ، حالت ، t_sb ، فیلتر ، spiw_fa

یا objectName.begin (7 ، 7 ، 3 ، 0 ، 0 ، 0 ، 7) ؛ // osrs_t ، osrs_p ، حالت ، t_sb ، فیلتر ، 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. با توجه به توان مصرفی ، دستگاه گرم می شود و بنابراین دمای اندازه گیری شده بالاتر از دمای محیط خواهد بود. این را در مرحله بعد بیشتر توضیح خواهم داد.

نتیجه ای که از قدرت کمتری استفاده می کند و دمایی نزدیک به محیط می دهد را می توان با استفاده از begin () با پارامترهایی که آن را در حالت خواب قرار می دهد (به عنوان مثال حالت = 0) به دست آورد. مثلا:

objectName.begin (1 ، 1 ، 0 ، 0 ، 0 ، 0 [، 1]) ؛ // osrs_t ، osrs_p ، حالت ، t_sb ، فیلتر ، spiw_en [، osrs_h]

سپس ، هنگامی که اندازه گیری مورد نیاز است ، دستگاه را با یک دستور پیکربندی بیدار کنید تا F2 (در صورت لزوم) و F4 را که مقادیر مناسب osrs_h ، osrs_t و osrs_p ، plus mode = 1 (حالت تک شات) را تنظیم می کند ، ثبت کند. مثلا:

[objectName.updateF2Control (1)؛] // osrs_h - هرگز برای BMP280 مورد نیاز نیست ،

// و برای BME280 در صورتی که تعداد اندازه ها تغییر نکند // از مقدار ارائه شده در شروع () لازم نیست. objectName.updateF4Control (1 ، 1 ، 1) ؛ // osrs_t ، osrs_p ، حالت

با بیدار کردن دستگاه ، اندازه گیری آن شروع می شود ، اما نتیجه برای چند میلی ثانیه در دسترس نخواهد بود - حداقل 4 میلی ثانیه ، شاید تا 70 میلی ثانیه یا بیشتر ، بسته به تعداد اندازه گیری های مشخص شده. اگر دستور خواندن بلافاصله ارسال شود ، دستگاه مقادیر اندازه گیری قبلی را برمی گرداند - که ممکن است در برخی از برنامه ها قابل قبول باشد ، اما در بیشتر موارد احتمالاً بهتر است تا زمانی که اندازه گیری جدید در دسترس نیست به تأخیر بیندازید.

این تأخیر را می توان به روش های مختلفی انجام داد.

  1. مدت زمان معینی منتظر بمانید تا طولانی ترین تاخیر مورد انتظار را پوشش دهید
  2. منتظر مدت زمان محاسبه شده از حداکثر زمان اندازه گیری در هر اندازه گیری (یعنی 2.3 میلی ثانیه) بر تعداد اندازه گیری ها ، به علاوه سربار ، به علاوه حاشیه باشید.
  3. منتظر مدت زمان كوتاه تر محاسبه شده در بالا باشید ، اما از زمان اندازه گیری اسمی (یعنی 2 میلی ثانیه) به علاوه سربار استفاده كنید و سپس بیت "اندازه گیری می كنم" را در ثبت وضعیت شروع كنید. وقتی بیت وضعیت 0 را می خواند (یعنی اندازه گیری نمی شود) ، دما و فشار را بدست آورید.
  4. بلافاصله شروع به بررسی وضعیت وضعیت کنید و هنگامی که بیت وضعیت 0 را می خواند ، دما و فشار را دریافت کنید ،

من بعداً نمونه ای از روشهای انجام این کار را نشان خواهم داد.

عملیات ثبت پیکربندی

برای تحقق همه این موارد ، ما به چندین ابزار نیاز داریم که من هنوز آنها را معرفی نکرده ام. آن ها هستند:

بایت خواندن ثبت نام (reg)

void update ثبت نام (reg ، value)

هر کدام از اینها چندین دستور مشتق شده در کتابخانه دارند که نرم افزار را برای اقدامات خاص کمی ساده تر می کند.

مثال powerSaverPressureAndTemperature.ino از روش شماره 3 استفاده می کند. خط کد که چک مکرر را انجام می دهد عبارت است از

while (bmp0.readRegister (0xF3) >> 3)؛ // حلقه untl F3bit 3 == 0

توجه داشته باشید که این طرح برای میکروکنترلر ESP8266 است. من از WeMos D1 mini pro استفاده کردم. این طرح با میکروکنترلرهای Atmega کار نمی کند ، که دستورالعمل های متفاوتی برای خوابیدن دارند. این طرح چندین دستور دیگر را تمرین می کند ، بنابراین قبل از توضیح بیشتر در مورد این طرح ، همه آنها را معرفی می کنم.

هنگامی که میکروکنترلر به موازات سنسور BMP280 خوابیده است ، پیکربندی سنسور برای اندازه گیری های مورد نیاز را می توان در دستور () () با استفاده از 6 پارامتر انجام داد. اما اگر میکروکنترلر خواب نیست ، اما سنسور خوابیده است ، در هنگام اندازه گیری سنسور باید بیدار شود و پیکربندی اندازه گیری خود را اعلام کند. این را می توان مستقیماً با استفاده از

updateRegister (reg ، value)

اما با سه دستور زیر کمی ساده تر است:

updateF2Control (osrs_h) ؛ // فقط BME280

updateF4Control (osrs_t ، osrs_p ، حالت) ؛ 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 ، هنگامی که میکروکنترلر بعد از مدتی از خواب بیدار می شود ، در ابتدای طرح بدون اطلاع از وضعیت قبل از فرمان خواب شروع به کار می کند. برای ذخیره اطلاعات قبل از فرمان sleep ، داده ها را می توان در حافظه فلش ذخیره کرد ، با استفاده از توابع EEPROM یا با نوشتن یک فایل با استفاده از SPIFFS. با این حال ، حافظه فلش دارای تعداد چرخه های نوشتاری از 10 تا 100 هزار است. این بدان معناست که اگر میکروکنترلر هر چند ثانیه یک چرخه خواب و بیداری را طی می کند ، می تواند از نوشتن حافظه مجاز فراتر رود. محدودیت در چند ماه ذخیره چند بیت داده در 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 بیت باقی مانده را برمی گردانند. این توابع در مثال sketch 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 (درجه حرارت خام) ؛ // داده های فشار خام و دما را از BME/P280readRawHumidity (rawTemperature، rawPressure) می خواند ؛ // داده های رطوبت ، دما و فشار خام را از BME280 calcTemperature (rawTemperature، t_fine) می خواند. calcPressure (فشار خام ، t_fine) ؛ calcHumidity (خام ، رطوبت ، t_fine)

استدلال "t-fine" برای این توابع ارزش کمی توضیح دارد. هر دو الگوریتم جبران فشار و رطوبت شامل یک جزء وابسته به دما است که از طریق متغیر t_fine بدست می آید. تابع calcTemperature بر اساس منطق الگوریتم جبران دما ، مقدار t_fine را می نویسد ، که سپس به عنوان ورودی در calcPressure و calcHumidity مورد استفاده قرار می گیرد.

نمونه ای از استفاده از این توابع را می توان در مثال sketch rawPressureAndTemperature.ino و همچنین کد عملکرد () readHumidity () در فایل.cpp کتابخانه یافت.

ارتفاع و فشار سطح دریا

بین فشار جوی و ارتفاع رابطه شناخته شده ای وجود دارد. آب و هوا نیز بر فشار تأثیر می گذارد. وقتی سازمان های هواشناسی اطلاعات فشار اتمسفر را منتشر می کنند ، معمولاً آن را برای ارتفاع تنظیم می کنند و بنابراین "نمودار سینوپتیک" ایزوبار (خطوط فشار ثابت) استاندارد شده به معنی سطح دریا را نشان می دهد. بنابراین واقعاً 3 ارزش در این رابطه وجود دارد و دانستن دو مورد از آنها مشتق از ارزش سوم را امکان پذیر می کند. 3 مقدار عبارتند از:

  • ارتفاع از سطح دریا
  • فشار واقعی هوا در آن ارتفاع
  • فشار معادل هوا در سطح دریا (دقیق تر ، به معنی سطح دریا ، زیرا سطح آنی دریا به طور مداوم تغییر می کند)

این کتابخانه دو عملکرد برای این رابطه ارائه می دهد ، به شرح زیر:

calcAltitude (فشار ، seaLevelhPa) ؛

فشار طبیعی (فشار ، ارتفاع) ؛

همچنین یک نسخه ساده شده وجود دارد که فشار استاندارد سطح دریا را 1013.15 hPa فرض می کند.

calcAltitude (فشار) ؛ // استاندارد seaLevel Pressure فرض شده است

مرحله 3: جزئیات دستگاه BMP280

BMP280 جزئیات دستگاه
BMP280 جزئیات دستگاه

قابلیت های سخت افزاری

BMP280 دارای 2 بایت داده پیکربندی (در آدرس های ثبت شده 0xF4 و 0xF5) است که برای کنترل چندین اندازه گیری و گزینه های خروجی داده استفاده می شود. همچنین 2 بیت اطلاعات وضعیت و 24 بایت پارامترهای کالیبراسیون ارائه می دهد که در تبدیل مقادیر دما و فشار خام به واحدهای دما و فشار معمولی استفاده می شود. BME280 دارای اطلاعات اضافی به شرح زیر است:

  • 1 بایت اضافی از داده های پیکربندی در آدرس ثبت 0xF2 که برای کنترل اندازه گیری رطوبت متعدد استفاده می شود.
  • 8 بایت اضافی از پارامترهای کالیبراسیون مورد استفاده در تبدیل مقدار رطوبت خام به درصد رطوبت نسبی.

دما ، فشار و ثبت کننده برای BME280 همانند BMP280 استثنائات جزئی به شرح زیر است:

  • بیت های "ID" 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 بیتی) است و در صورت استفاده از بازخوانی 16 بیتی به 0.0046 درجه سانتیگراد افزایش می یابد.

رطوبت یک مقدار 16 بیتی است که باید از طریق الگوریتم پیچیده دیگری با استفاده از 6 پارامتر کالیبراسیون که ترکیبی از 8 ، 12 و 16 بیت است ، به رطوبت نسبی تبدیل شود.

برگه اطلاعات دقت مطلق بازخوانی دما را به عنوان +-0.5 درجه سانتی گراد در 25 درجه سانتی گراد و +-1 درجه سانتی گراد در محدوده 0 تا 65 درجه سانتیگراد نشان می دهد.

دانه بندی اندازه گیری فشار 0.15 پاسکال (یعنی 0.0015 هکتو پاسکال) در وضوح 20 بیت یا 2.5 پاسکال در وضوح 16 بیت است. مقدار فشار خام تحت تأثیر دما قرار می گیرد ، به طوری که در حدود 25 درجه سانتی گراد ، افزایش درجه حرارت 1 درجه سانتیگراد فشار اندازه گیری شده را 24 پاسکال کاهش می دهد. حساسیت دما در الگوریتم کالیبراسیون لحاظ شده است ، بنابراین مقادیر فشار تحویل داده شده باید در دماهای مختلف دقیق باشد.

برگه داده دقت مطلق بازخوانی فشار را +1 hPa برای دمای بین 0 تا 65 درجه سانتی گراد نشان می دهد.

صحت رطوبت در برگه داده به صورت +-3٪ RH و +-1٪ هیسترزیس ارائه شده است.

چگونه کار می کند

24 بایت داده های کالیبراسیون دما و فشار ، و همچنین در مورد BME280 8 بایت داده های کالیبراسیون رطوبت ، باید از دستگاه خوانده شده و در متغیرها ذخیره شود. این داده ها به صورت جداگانه در دستگاه در کارخانه برنامه ریزی می شوند ، بنابراین دستگاه های مختلف مقادیر متفاوتی دارند - حداقل برای برخی از پارامترها. BME/P280 می تواند در یکی از دو حالت باشد. در یک حالت اندازه گیری می شود. در حالت دیگر منتظر است (خوابیده است).

با نگاه کردن به بیت 3 ثبات 0xF3 می توان وضعیت آن را بررسی کرد.

نتایج آخرین اندازه گیری را می توان در هر زمان با خواندن مقدار داده مربوطه ، صرف نظر از اینکه دستگاه در حال خواب یا اندازه گیری است ، بدست آورید.

همچنین دو روش برای کار با BME/P280 وجود دارد. یکی حالت پیوسته (در حالت عادی حالت عادی نامیده می شود) است که مکرراً بین حالت های اندازه گیری و حالت خواب در حال چرخش است. در این حالت دستگاه مجموعه ای از اندازه گیری ها را انجام می دهد ، سپس به خواب می رود ، سپس برای اندازه گیری دیگری بیدار می شود و غیره. تعداد اندازه گیری های فردی و مدت زمان خواب چرخه را می توان از طریق رجیسترهای پیکربندی کنترل کرد.

روش دیگر عملکرد BME/P280 حالت Single Shot است (در برگه اطلاعات حالت اجباری نامیده می شود). در این حالت دستگاه با دستور اندازه گیری از خواب بیدار می شود ، مجموعه ای از اندازه گیری ها را انجام می دهد ، سپس دوباره به خواب می رود. تعداد اندازه گیری های فردی در مجموعه در فرمان پیکربندی که دستگاه را بیدار می کند کنترل می شود.

در 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.5 میلی ثانیه تا 4000 میلی ثانیه) ؛
  • فیلتر 3 بیتی (زیر را ببینید) ؛ و
  • 1 بیت 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 بایت خوانده می شود.

استفاده از ماکروها (#تعریف و غیره)

در این کتابخانه هیچ ماکروی غیر از کتابخانه معمول "شامل گارد" وجود ندارد که از تکرار جلوگیری می کند.

همه ثابتها با استفاده از کلید واژه const تعریف می شوند و چاپ اشکال زدایی با توابع استاندارد C کنترل می شود.

این منبع عدم قطعیت برای من بوده است ، اما توصیه ای که از خواندن بسیاری از پست ها در این زمینه دریافت می کنم این است که استفاده از #تعریف برای اعلام ثابت (حداقل) و (احتمالاً) کنترل چاپ اشکال زدایی غیر ضروری و نامطلوب است.

مورد استفاده از const به جای #تعریف کاملاً واضح است - const از منابع مشابه #define (یعنی صفر) استفاده می کند و مقادیر حاصل از قوانین محدوده پیروی می کند ، در نتیجه احتمال خطاها را کاهش می دهد.

مورد مربوط به کنترل چاپ اشکال زدایی کمی روشن تر است ، زیرا شیوه ای که من انجام داده ام به این معنی است که کد نهایی دارای منطق دستورات اشکال زدایی اشکال است ، حتی اگر آنها هرگز اعمال نشوند. اگر قرار است از کتابخانه در پروژه ای بزرگ بر روی میکروکنترلر با حافظه بسیار محدود استفاده شود ، این ممکن است به یک مشکل تبدیل شود. از آنجا که توسعه من در ESP8266 با حافظه فلش بزرگ بود ، به نظر نمی رسید که این برای من مشکلی باشد.

مرحله 6: عملکرد دما

قصد دارم بعداً این را اضافه کنم.

مرحله 7: عملکرد فشار

قصد دارم بعداً این را اضافه کنم.

توصیه شده: