Съдържание:

Библиотека за BMP280 и BME280: 7 стъпки
Библиотека за BMP280 и BME280: 7 стъпки

Видео: Библиотека за BMP280 и BME280: 7 стъпки

Видео: Библиотека за BMP280 и BME280: 7 стъпки
Видео: BME280, Датчик атмосферного давления с гигрометром 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 извода или към 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 резистор, на практика не би трябвало да представлява проблем, стига да няма твърде много други устройства на същата шина, също с резистори за издърпване.

След като свържете хардуера, можете лесно да проверите дали вашето устройство е BMP280 или BME280, като стартирате скицата I2CScan_ID, която можете да намерите тук:

Можете също да проверите дали имате BMP280 или BME280, като погледнете самото устройство. Намерих за необходимо да използвам цифров микроскоп, за да направя това, но ако зрението ви е много добро, може да успеете да го направите без никакви помощни средства. Има две линии за печат върху корпуса на устройството. Ключът е първата буква на втория ред, която в случая с устройства BMP280 е „K“, а в случая с устройства BME280 е „U“.

Стъпка 2: API, предоставени от библиотеката

API, предоставени от библиотеката
API, предоставени от библиотеката
API, предоставени от библиотеката
API, предоставени от библиотеката

Включване на библиотеката в скица

Библиотеката е включена в скица по стандартен начин с помощта на израза

#include "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 ();

Тази версия на 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, филтър, spiw_en

или objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, 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 () с параметри, които го приспиват (напр. Mode = 0). Например:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, mode, t_sb, филтър, spiw_en [, osrs_h]

След това, когато се иска измерване, събудете устройството с конфигурационна команда за регистри F2 (ако е необходимо) и F4, която задава подходящите стойности на osrs_h, osrs_t и osrs_p, плюс режим = 1 (режим на единичен кадър). Например:

[objectName.updateF2Control (1);] // osrs_h - никога не е необходимо за BMP280, // и не е необходимо за BME280, ако броят на измерванията не се променя // от стойността, предоставена в begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, режим

След като събуди устройството, то ще започне да измерва, но резултатът няма да бъде наличен за няколко милисекунди - поне 4 ms, може би до 70 ms или повече, в зависимост от броя на посочените измервания. Ако командата за четене бъде изпратена незабавно, устройството ще върне стойностите от предишното измерване - което може да бъде приемливо в някои приложения, но в повечето случаи е вероятно по -добре да се забави, докато новото измерване стане налично.

Това забавяне може да се извърши по няколко начина.

  1. изчакайте фиксиран период от време, за да покриете най -дългото очаквано забавяне
  2. изчакайте време, изчислено от максималното време за измерване на измерване (т.е. 2,3 мс), умножено по броя на измерванията, плюс режийни разходи, плюс запас.
  3. изчакайте по -кратко време, изчислено както по -горе, но като използвате номиналното време за измерване (т.е. 2 ms) плюс режийни разходи, и след това започнете да проверявате бита "Измервам" в регистъра на състоянието. Когато статутният бит отчита 0 (т.е. не се измерва), вземете показанията за температура и налягане.
  4. незабавно започнете да проверявате регистъра на състоянието и получавайте показания за температура и налягане, когато статутният бит отчита 0,

Ще покажа пример за един начин да направите това малко по -късно.

Операции с регистър за конфигуриране

За да се случи всичко това, се нуждаем от няколко инструмента, които все още не съм въвел. Те са:

байт readRegister (reg)

void updateRegister (reg, стойност)

Всяка от тях има няколко производни команди в библиотеката, които правят софтуера за конкретни действия малко по -опростен.

Примерът powerSaverPressureAndTemperature.ino използва метод № 3. Редът с код, който извършва многократната проверка, е

while (bmp0.readRegister (0xF3) >> 3); // цикъл unsl F3bit 3 == 0

Обърнете внимание, че тази скица е за микроконтролер ESP8266. Използвах WeMos D1 mini pro. Скицата няма да работи с микроконтролери Atmega, които имат различни инструкции за сън. Тази скица упражнява няколко други команди, така че ще ги представя всички, преди да опиша тази скица по -подробно.

Когато микроконтролерът спи паралелно със сензора BMP280, конфигурирането на сензора за необходимите измервания може да се извърши в командата begin (), като се използват 6 параметри. Ако обаче микроконтролерът не спи, а сензорът е, тогава по време на измерването сензорът трябва да се събуди и да му се каже неговата конфигурация за измерване. Това може да стане директно с

updateRegister (reg, стойност)

но е малко по -лесно със следните три команди:

updateF2Control (osrs_h); // Само BME280

updateF4Control (osrs_t, osrs_p, режим); updateF5Config (t_sb, филтър, spi3W_en);

След като измерването е извършено, ако използваният режим е Single shot (Принудителен режим), тогава устройството автоматично ще се върне в режим на заспиване. Ако обаче измервателният набор включва множество измервания, използващи непрекъснат (нормален) режим, тогава 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" на тези функции си струва малко обяснение. Алгоритмите за компенсиране на налягането и влажността включват компонент, зависим от температурата, който се постига чрез променливата t_fine. Функцията calcTemperature записва стойност в t_fine въз основа на логиката на алгоритъма за компенсация на температурата, която след това се използва като вход както в calcPressure, така и в calcHumidity.

Пример за използването на тези функции може да се намери в примерната скица rawPressureAndTemperature.ino, а също и в кода за функцията readHumidity () във файла.cpp на библиотеката.

Надморска височина и налягане на морското равнище

Известна е връзката между атмосферното налягане и надморската височина. Времето също влияе върху налягането. Когато метеорологичните организации публикуват информация за атмосферното налягане, те обикновено я коригират за надморска височина и така „синоптичната карта“показва изобари (линии с постоянно налягане), стандартизирани за средно морско равнище. Така че наистина има 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 с малки изключения, както следва:

  • битовете "ID" на BME280 са настроени на 0x60, така че може да се разграничи от BMP280, който може да бъде 0x56, 0x57 или 0x58
  • контролът на времето за заспиване (t_sb) се променя така, че двете дълги времена в BMP280 (2000 ms и 4000 ms) се заменят в BME280 с кратки времена от 10 ms и 20 ms. Максималното време за сън в BME280 е 1000 ms.
  • В BME280 суровите стойности на температурата и налягането винаги са 20 бита, ако се прилага филтриране. Използването на 16 до 19 битови стойности е ограничено до случаи без филтриране (т.е. филтър = 0).

Всяка температура и налягане са 20 -битови стойности, които трябва да бъдат преобразувани в конвенционална температура и налягане чрез доста сложен алгоритъм, използващ 3 16 -битови параметри за калибриране за температура и 9 16 -битови параметри за калибриране плюс температурата за налягане. Гранулацията на измерването на температурата е 0,0003 градуса по Целзий за най -малко значима промяна на бита (20 -битово отчитане), увеличавайки се до 0,0046 градуса по Целзий, ако се използва 16 -битовото отчитане.

Влажността е 16 -битова стойност, която трябва да се преобразува в относителна влажност чрез друг сложен алгоритъм, използващ 6 параметри за калибриране, които са смес от 8, 12 и 16 бита.

Информационният лист показва абсолютната точност на отчитането на температурата като +-0,5 C при 25 C и +-1 C в диапазона от 0 до 65 C.

Гранулираността на измерването на налягането е 0,15 паскала (т.е. 0,0015 хектопаскала) при 20 -битова разделителна способност или 2,5 паскала при 16 -битова разделителна способност. Стойността на суровото налягане се влияе от температурата, така че около 25 ° С, повишаването на температурата с 1 градус С намалява измереното налягане с 24 Паскала. Температурната чувствителност се отчита в алгоритъма за калибриране, така че стойностите на подаденото налягане трябва да бъдат точни при различни температури.

Информационният лист показва абсолютната точност на отчитането на налягането като +-1 hPa за температури между 0 C и 65 C.

Точността на влажността е дадена в информационния лист като +-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 ms). Добавете към това фиксирани режийни разходи от около 2 ms (обикновено малко по -малко) означава, че последователността на измерване, която може да се състои от 1 до 32 отделни измервания, може да отнеме от 4 ms до 66 ms.

Информационният лист предоставя набор от препоръчителни комбинации от свръхпроба на температура и налягане за различни приложения.

Регистри за контрол на конфигурацията

Двата регистъра за управление на конфигурацията в BMP280 са на адреси на регистрите 0xF4 и 0xF5 и са съпоставени с 6 индивидуални стойности за управление на конфигурацията. 0xF4 се състои от:

  • 3 бита osrs_t (измерете температурата 0, 1, 2, 4, 8 или 16 пъти);
  • 3 бита osrs_p (измерете налягане 0, 1, 2, 4, 8 или 16 пъти); и
  • 2 битов режим (Sleep, Forced (т.е. Single Shot), Normal (т.е. непрекъснат)).

0xF5 се състои от:

  • 3 бита t_sb (време в режим на готовност, 0.5ms до 4000 ms);
  • 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 Burst режим

Информационният лист BMP280 предоставя указания относно отчитането на данните (раздел 3.9). Той казва: "силно се препоръчва да се използва пакетно четене и да не се адресира всеки регистър поотделно. Това ще предотврати възможно смесване на байтове, принадлежащи към различни измервания, и ще намали интерфейсния трафик." Не се дават указания относно отчитането на параметрите на компенсация/калибриране. Предполага се, че това не е проблем, тъй като те са статични и не се променят.

Тази библиотека чете всички непрекъснати стойности в една операция на четене - 24 байта в случай на параметрите за компенсация на температурата и налягането, 6 байта за температура и налягане заедно и 8 байта за влажност, температура и налягане, взети заедно. Когато се проверява само температурата, се четат само 3 байта.

Използване на макроси (#define и т.н.)

В тази библиотека няма макроси, освен обичайния библиотечен макрос "include guard", който предотвратява дублирането.

Всички константи се дефинират с помощта на ключовата дума const, а отпечатването на грешки се контролира със стандартни C функции.

Това беше източникът на известна несигурност за мен, но съветът, който получавам, като прочетох много публикации по тази тема, е, че използването на #define за деклариране на константи (поне) и (вероятно) контрол за отпечатване на грешки е ненужно и нежелателно.

Случаят за използването на const, а не на #define е доста ясен - const използва същите ресурси като #define (т.е. нула) и получените стойности следват правилата за обхват, като по този начин намаляват вероятността от грешки.

Случаят с контрола за отпечатване на грешки е малко по -неясен, тъй като начинът, по който го направих, означава, че крайният код съдържа логиката за операторите за отпечатване на грешки, въпреки че те никога не се упражняват. Ако библиотеката ще се използва в голям проект на микроконтролер с много ограничена памет, това може да се превърне в проблем. Тъй като разработката ми беше на ESP8266 с голяма флаш памет, това не изглеждаше проблем за мен.

Стъпка 6: Температурна ефективност

Смятам да добавя това по -късно.

Стъпка 7: Ефективност на налягането

Смятам да добавя това по -късно.

Препоръчано: