Spisu treści:

Biblioteka dla BMP280 i BME280: 7 kroków
Biblioteka dla BMP280 i BME280: 7 kroków

Wideo: Biblioteka dla BMP280 i BME280: 7 kroków

Wideo: Biblioteka dla BMP280 i BME280: 7 kroków
Wideo: Обзор модуля BMP280 Датчик атмосферного давления для arduino 2024, Lipiec
Anonim
Biblioteka dla BMP280 i BME280
Biblioteka dla BMP280 i BME280
Biblioteka dla BMP280 i BME280
Biblioteka dla BMP280 i BME280
Biblioteka dla BMP280 i BME280
Biblioteka dla BMP280 i BME280

Wstęp

Nie miałem zamiaru pisać tej biblioteki. To "stało się" jako efekt uboczny projektu, który zacząłem, który używa BMP280. Ten projekt nie jest jeszcze skończony, ale myślę, że biblioteka jest gotowa do udostępnienia innym. Następnie musiałem użyć BME280, który dodaje pomiar wilgotności do możliwości BMP280 pod względem ciśnienia i temperatury. BME280 jest "kompatybilny wstecz" z BMP280 - to znaczy, że wszystkie rejestry i kroki potrzebne do odczytania ciśnienia i temperatury z BME280 są takie same jak te używane w BMP280. Do odczytu wilgotności potrzebne są dodatkowe rejestry i czynności, które dotyczą tylko BME280. Rodzi to pytanie, jedna biblioteka dla obu, czy dwie oddzielne biblioteki. Sprzęt dla dwóch typów urządzeń jest w pełni wymienny. Nawet wiele sprzedawanych modułów (na przykład na Ebay i AliExpress) jest oznaczonych jako BME/P280. Aby dowiedzieć się, jaki to typ, musisz spojrzeć na (maleńkie) napis na samym czujniku lub przetestować bajt ID urządzenia. Postanowiłem wybrać jedną bibliotekę. Wygląda na to, że wyszło OK.

Opinie, a zwłaszcza sugestie dotyczące ulepszeń, będą mile widziane.

Funkcje i możliwości biblioteki

Biblioteka to oprogramowanie, które zapewnia programiście interfejs programowania aplikacji (API) w celu wykorzystania możliwości urządzenia, bez konieczności zajmowania się wszystkimi drobnymi szczegółami. Pożądane jest, aby API było łatwe dla początkującego, z prostymi wymaganiami do rozpoczęcia pracy, przy jednoczesnym zapewnieniu pełnego wykorzystania możliwości urządzenia. Pożądane jest, aby biblioteka była zgodna z wszelkimi szczegółowymi wytycznymi producenta urządzenia, a także ogólnymi dobrymi praktykami dotyczącymi oprogramowania. Starałem się to wszystko osiągnąć. Zaczynając od BMP280, znalazłem dla niego 3 różne biblioteki: Adafruit_BMP280; Seeed_BMP280; i jeden o nazwie BMP280 od producenta urządzenia. Ani Adafruit, ani Seeed nie zapewniały rozszerzonych możliwości, chociaż działały dobrze i były łatwe w użyciu w podstawowych zastosowaniach. Nie mogłem rozgryźć, jak korzystać z tego wyprodukowanego przez producenta urządzenia (Bosch Sensortec). To może być mój brak, a nie ich. Jednak biblioteka była znacznie bardziej skomplikowana niż pozostałe dwie, nie mogłem znaleźć żadnych instrukcji ani przykładów użycia (później znalazłem przykłady w pliku "bmp280_support.c", jednak nie były one dla mnie szczególnie pomocne).

W wyniku tych czynników zdecydowałem się napisać własną bibliotekę dla BMP280.

Patrząc na sytuację bibliotek dla BME280, znalazłem osobne biblioteki Adafruit_BME280, Seed_BME280 i jeszcze jedną BME280_MOD-1022 napisaną przez Embedded Adventures. Żaden z nich nie łączył funkcji BMP280 w bibliotece zdolnej do korzystania z BME280. Żaden z nich nie wspierał możliwości urządzenia do przechowywania kilku bitów danych, gdy urządzenie i jego kontrolujący mikroprocesor śpią (ta zdolność jest widoczna w arkuszu danych i obsługiwana w bibliotece, którą napisałem i opisałem tutaj).

Połączona biblioteka powinna obsługiwać wszystkie możliwości BME280, ale gdy jest używana z BMP280, nie powinna narzucać żadnych dodatkowych funkcji z nieużywanych funkcji. Korzyści z połączonej biblioteki obejmują mniejszą liczbę plików bibliotecznych do zarządzania, łatwe mieszanie i dopasowywanie różnych urządzeń w tym samym projekcie oraz uproszczone zmiany w zakresie konserwacji lub aktualizacji, które muszą być wykonywane tylko w jednym miejscu, a nie w dwóch. Te chyba wszystkie są dość drobne, wręcz nieistotne, ale…

Możliwości urządzenia

BMP280 i BME280 to urządzenia do montażu powierzchniowego o powierzchni około 5 mm kwadratowych i wysokości 1 mm. Dostępnych jest 8 padów interfejsu, w tym 2 oddzielne pady wejściowe zasilania i dwa pady uziemiające. Są one dostępne w serwisie eBay jako moduł z wyprowadzonymi 4 lub 6 pinami. Moduł 4-pinowy ma stały adres I2C i nie można go skonfigurować do korzystania z protokołu SPI.

Moduł 6-pinowy lub samo urządzenie może być używany z protokołem I2C lub SPI. W trybie I2C może mieć dwa różne adresy, osiągane przez podłączenie pinu SDO albo do masy (dla adresu bazowego = 0x76) lub do Vdd (dla adresu bazowego +1 = 0x77). W trybie SPI ma typowy układ 1 zegara, 2 danych (po jednym dla każdego kierunku) i pin wyboru urządzenia (CS).

Biblioteka, którą tutaj napisałem i opisałem, obsługuje tylko I2C. Biblioteki Adafruit_BMP280 i BME_MOD-1022 obsługują zarówno i2C, jak i SPI.

Bibliotekę można pobrać tutaj:

github.com/farmerkeith/BMP280-library

Krok 1: Konfiguracja sprzętu

Konfiguracja sprzętu
Konfiguracja sprzętu

Zanim biblioteka będzie użyteczna, konieczne jest podłączenie mikrokontrolera do BMP280 (lub do dwóch jeśli chcesz).

Użyłem WeMos D1 mini pro, więc pokażę jego połączenia. Inne mikrokontrolery będą podobne, wystarczy poprawnie podłączyć piny SDA i SCL.

W przypadku WeMos D1 mini pro połączenia to:

Funkcja WeMos pin BMP280 pin Uwagi

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominalnie 3,3 V Uziemienie GND Kontrola adresu SDO Uziemienie lub Vdd I2C wybierz CSB Vdd (GND wybiera SPI)

Zauważ, że pin SDO w niektórych modułach MP280 jest oznaczony jako SDD, a pin Vdd może być oznaczony jako VCC. Uwaga: Linie SDA i SCL powinny mieć rezystory podciągające między linią a pinem Vin. Zazwyczaj wartość 4,7K powinna być OK. Niektóre moduły BMP280 i BME280 mają wbudowane rezystory podciągające 10K (co nie jest dobrą praktyką, ponieważ umieszczenie wielu urządzeń na magistrali I2C może nadmiernie go obciążać). Jednak użycie 2 modułów BME/P280, każdy z rezystorem 10K, nie powinno stanowić problemu w praktyce, o ile nie ma zbyt wielu innych urządzeń na tej samej magistrali również z rezystorami podciągającymi.

Po podłączeniu sprzętu możesz łatwo sprawdzić, czy Twoje urządzenie to BMP280 czy BME280, uruchamiając szkic I2CScan_ID, który możesz znaleźć tutaj:

Możesz również sprawdzić, czy masz BMP280 lub BME280, patrząc na samo urządzenie. Uznałem, że do tego celu konieczne jest użycie mikroskopu cyfrowego, ale jeśli masz bardzo dobry wzrok, możesz to zrobić bez żadnych pomocy. Na obudowie urządzenia znajdują się dwie linie nadruku. Kluczem jest pierwsza litera w drugiej linii, która w przypadku urządzeń BMP280 to „K”, a w przypadku urządzeń BME280 to „U”.

Krok 2: API udostępniane przez bibliotekę

API udostępniane przez Bibliotekę
API udostępniane przez Bibliotekę
API udostępniane przez Bibliotekę
API udostępniane przez Bibliotekę

Dołączanie biblioteki do szkicu

Biblioteka jest dołączana do szkicu w standardowy sposób za pomocą instrukcji

#zawiera "farmerkeith_BMP280.h"

To stwierdzenie musi być zawarte we wczesnej części szkicu przed uruchomieniem funkcji setup().

Tworzenie obiektu oprogramowania BME lub BMP

Istnieją 3 poziomy tworzenia obiektu oprogramowania BMP280. Najprostsze jest po prostu

bme280 nazwaobiektu; lub bmp280 nazwaobiektu;

na przykład BMP280 bmp0;

Tworzy to obiekt programowy z domyślnym adresem 0x76 (tj. dla SDO podłączonego do masy).

Następny poziom tworzenia obiektu oprogramowania BME280 lub BMP280 ma parametr 0 lub 1 w następujący sposób:

bme280 nazwa obiektuA(0);

bmp280 nazwaobiektuB(1);

Parametr (0 lub 1) jest dodawany do adresu bazowego I2C, dzięki czemu dwa urządzenia BME280 lub BMP280 mogą być używane na tej samej magistrali I2C (w tym po jednym z każdego).

Trzeci poziom tworzenia obiektu oprogramowania BME lub BMP280 ma dwa parametry. Pierwszy parametr, który wynosi 0 lub 1, dotyczy adresu, tak jak w poprzednim przypadku. Drugi parametr kontroluje drukowanie debugowania. Jeśli jest ustawiony na 1, każda transakcja z obiektem programowym daje wyniki Serial.print, które umożliwiają programiście zobaczenie szczegółów transakcji. Na przykład:

bmp280 nazwaobiektuB(1, 1);

Jeśli parametr drukowania debugowania jest ustawiony na 0, obiekt oprogramowania powraca do normalnego zachowania (brak drukowania).

Ta instrukcja lub instrukcje muszą być dołączone po #include i przed funkcją setup().

Inicjalizacja obiektu oprogramowania BME lub BMP

Przed użyciem konieczne jest odczytanie parametrów kalibracji z urządzenia i skonfigurowanie go dla dowolnego trybu pomiaru, nadpróbkowania i ustawień filtrów.

Dla prostej inicjalizacji ogólnego przeznaczenia, instrukcja brzmi:

nazwaobiektu.początek();

Ta wersja begin() odczytuje parametry kalibracji z urządzenia i ustawia osrs_t=7 (16 pomiarów temperatury), osrs_p=7 (16 pomiarów ciśnienia), mode=3 (ciągły, normalny), t_sb=0 (0,5 ms sen pomiędzy zestawów pomiarowych), filter=0 (K=1, więc bez filtrowania) i spiw_en=0 (SPI wyłączone, więc używaj I2C). W przypadku BME280 istnieje dodatkowy parametr osrs_h=7 dla 16 pomiarów wilgotności.

Istnieje inna wersja begin(), która przyjmuje wszystkie sześć (lub 7) parametrów. Odpowiednikiem powyższego stwierdzenia jest

nazwaobiektu.początek(7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, tryb, t_sb, filtr, spiw_en

lub nazwaobiektu.początek(7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, tryb, t_sb, filtr, spiw_en, osrs_h

Pełna lista kodów i ich znaczenia znajduje się w karcie katalogowej BME280 i BMP280, a także w komentarzach w pliku.cpp w bibliotece.

Prosty pomiar temperatury i ciśnienia

Najprostszym sposobem uzyskania pomiaru temperatury jest

podwójna temperatura=nazwaobiektu.odczytTemperatura (); // zmierz temperaturę

Najprostszym sposobem uzyskania pomiaru ciśnienia jest

podwójne ciśnienie=nazwaobiektu.odczytCiśnienie(); // zmierz ciśnienie

Najprostszym sposobem uzyskania pomiaru wilgotności jest

podwójna wilgotność=nazwaobiektu.odczytWilgotność (); // pomiar wilgotności (tylko BME280)

Aby uzyskać zarówno temperaturę, jak i ciśnienie, powyższe dwa stwierdzenia mogą być użyte jedno po drugim, ale jest jeszcze inna opcja, a mianowicie:

podwójna temperatura;

podwójne ciśnienie=nazwaobiektu.odczytCiśnienie (temperatura); // zmierz ciśnienie i temperaturę

To oświadczenie odczytuje dane z urządzenia BME280 lub BMP280 tylko raz i zwraca zarówno temperaturę, jak i ciśnienie. Jest to nieco bardziej efektywne wykorzystanie magistrali I2C i zapewnia, że dwa odczyty odpowiadają temu samemu cyklowi pomiarowemu.

W przypadku BME 280 połączone stwierdzenie, które otrzymuje wszystkie trzy wartości (wilgotność, temperatura i ciśnienie) to:

podwójna temperatura, ciśnienie; podwójna wilgotność=nazwaobiektu.odczytWilgotność (temperatura, ciśnienie); // pomiar wilgotności, ciśnienia i temperatury

Ta instrukcja odczytuje dane z urządzenia BMP280 tylko raz i zwraca wszystkie trzy wartości. Jest to nieco bardziej efektywne wykorzystanie magistrali I2C i zapewnia, że trzy odczyty odpowiadają temu samemu cyklowi pomiarowemu. Zauważ, że nazwy zmiennych mogą być zmieniane na dowolne, ale ich kolejność jest stała – na pierwszym miejscu jest temperatura, a na drugim ciśnienie.

Te przypadki użycia zostały omówione w przykładowych szkicach dostarczonych z biblioteką: basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino i basicHumidityAndTemperatureAndPressure.ino.

Bardziej wyrafinowany pomiar temperatury i ciśnienia

Chociaż powyższa seria stwierdzeń będzie działać bez problemów, istnieje kilka problemów:

  1. urządzenie pracuje w sposób ciągły, a zatem zużywa energię na maksymalnym poziomie. Jeśli energia pochodzi z baterii, może być konieczne jej zmniejszenie.
  2. ze względu na pobór mocy urządzenie będzie się nagrzewać, a zatem zmierzona temperatura będzie wyższa niż temperatura otoczenia. Omówię to więcej w późniejszym kroku.

Wynik, który zużywa mniej energii i daje temperaturę zbliżoną do temperatury otoczenia, można uzyskać za pomocą funkcji begin() z parametrami usypiającymi (np. mode=0). Na przykład:

nazwaobiektu.początek(1, 1, 0, 0, 0, 0[, 1]); // osrs_t, osrs_p, tryb, t_sb, filtr, spiw_en [, osrs_h]

Następnie, gdy potrzebny jest pomiar, wybudź urządzenie poleceniem konfiguracyjnym do rejestrów F2 (jeśli jest to wymagane) i F4, które ustawiają odpowiednie wartości osrs_h, osrs_t i osrs_p, plus mode=1 (tryb pojedynczego strzału). Na przykład:

[nazwa_obiektu.updateF2Control(1);] // osrs_h - nigdy nie potrzebne dla BMP280, // i nie jest potrzebne dla BME280, jeśli liczba pomiarów nie jest zmieniana // w stosunku do wartości podanej w begin(). nazwaobiektu.updateF4Control(1, 1, 1); // osrs_t, osrs_p, tryb

Po wybudzeniu urządzenie rozpocznie pomiar, ale wynik nie będzie dostępny przez kilka milisekund - co najmniej 4 ms, może do 70 ms lub więcej, w zależności od określonej liczby pomiarów. Jeśli komenda odczytu zostanie wysłana natychmiast, urządzenie zwróci wartości z poprzedniego pomiaru - co może być akceptowalne w niektórych aplikacjach, ale w większości przypadków prawdopodobnie lepiej jest odłożyć na później nowy pomiar.

To opóźnienie można wykonać na kilka sposobów.

  1. odczekaj ustaloną ilość czasu, aby pokryć najdłuższe oczekiwane opóźnienie
  2. czekaj ilość czasu obliczoną z maksymalnego czasu pomiaru na pomiar (tj. 2,3 ms) razy liczba pomiarów plus narzut plus margines.
  3. odczekać krótszą ilość czasu wyliczoną jak wyżej, ale używając nominalnego czasu pomiaru (tj. 2 ms) plus narzut, a następnie rozpocząć sprawdzanie bitu „mierzę” w rejestrze stanu. Gdy bit statusu wskazuje 0 (tj. nie mierzy), uzyskaj odczyty temperatury i ciśnienia.
  4. natychmiast rozpocznij sprawdzanie rejestru statusu i uzyskaj odczyty temperatury i ciśnienia, gdy bit statusu wskazuje 0,

Nieco później pokażę przykład jednego ze sposobów.

Operacje rejestru konfiguracji

Aby to wszystko się stało, potrzebujemy kilku narzędzi, których jeszcze nie wprowadziłem. Oni są:

odczyt bajtówRejestr(reg)

void updateRegister(reg, wartość)

Każda z nich ma w bibliotece kilka poleceń pochodnych, które nieco upraszczają oprogramowanie do określonych działań.

Przykładowy powerSaverPressureAndTemperature.ino wykorzystuje metodę nr 3. Wiersz kodu, który wykonuje powtórne sprawdzanie to

while (bmp0.readRegister(0xF3)>>3); // pętla do F3bit 3 ==0

Zauważ, że ten szkic dotyczy mikrokontrolera ESP8266. Użyłem WeMos D1 mini pro. Szkic nie będzie działał z mikrokontrolerami Atmega, które mają inną instrukcję spania. Ten szkic ćwiczy kilka innych poleceń, więc przedstawię je wszystkie przed bardziej szczegółowym opisem tego szkicu.

Gdy mikrokontroler śpi równolegle z czujnikiem BMP280, konfigurację czujnika pod kątem wymaganych pomiarów można wykonać za pomocą polecenia begin(), korzystając z 6 parametrów. Jeśli jednak mikrokontroler nie śpi, a czujnik jest, to w czasie pomiaru należy go wybudzić i podać konfigurację pomiarową. Można to zrobić bezpośrednio za pomocą

aktualizacjaRejestr(reg, wartość)

ale jest to nieco łatwiejsze dzięki następującym trzem poleceniom:

aktualizacjaF2Control(osrs_h); // tylko BME280

updateF4Control(osrs_t, osrs_p, tryb); aktualizacjaF5Config(t_sb, filtr, spi3W_en);

Po wykonaniu pomiaru, jeśli używanym trybem jest Pojedynczy strzał (tryb wymuszony), urządzenie automatycznie przejdzie w stan uśpienia. Jeśli jednak zestaw pomiarowy obejmuje wielokrotne pomiary w trybie ciągłym (normalnym), konieczne będzie ponowne uśpienie BMP280. Można to zrobić za pomocą jednego z dwóch następujących poleceń:

aktualizacjaF4Control16xSleep();

updateF4ControlSleep(wartość);

Oba te ustawiają bity trybu na 00 (tj. tryb uśpienia). Jednak pierwsza ustawia osrs_t i osrs_p na 111 (tj. 16 pomiarów), podczas gdy druga przechowuje młodsze 6 bitów z "value" do bitów 7:2 rejestru 0xF4.

Podobnie, następująca instrukcja przechowuje sześć młodszych bitów „wartości” w bitach 7:2 rejestru 0xF5.

aktualizacjaF5ConfigSleep(wartość);

Zastosowanie tych ostatnich poleceń umożliwia przechowywanie 12 bitów informacji w rejestrach BMP280 F4 i F5. Przynajmniej w przypadku ESP8266, gdy mikrokontroler budzi się po okresie uśpienia, zaczyna na początku szkicu bez wiedzy o swoim stanie przed poleceniem uśpienia. Aby przechować wiedzę o stanie sprzed wydania polecenia uśpienia, dane można przechowywać w pamięci flash, korzystając z funkcji pamięci EEPROM lub zapisując plik przy użyciu SPIFFS. Pamięć flash ma jednak ograniczenie liczby cykli zapisu, rzędu od 10 000 do 100 000. Oznacza to, że jeśli mikrokontroler przechodzi co kilka sekund cykl uśpienia/wybudzenia, może przekroczyć dopuszczalny zapis do pamięci limit za kilka miesięcy. Przechowywanie kilku bitów danych w BMP280 nie ma takiego ograniczenia.

Dane przechowywane w rejestrach F4 i F5 można odzyskać po wybudzeniu mikrokontrolera za pomocą komend

przeczytajF4Sleep();

przeczytajF5Sen();

Funkcje te odczytują odpowiedni rejestr, przesuwają zawartość w celu usunięcia 2 LSB i zwracają pozostałe 6 bitów. Funkcje te są używane w przykładowym szkicu powerSaverPressureAndTemperatureESP.ino w następujący sposób:

// odczytaj wartość EventCounter z powrotem z bmp0

bajt bmp0F4value= bmp0.readF4Sleep(); // 0 do 63 bajtów bmp0F5value= bmp0.readF5Sleep(); // 0 do 63 eventCounter= bmp0F5value*64+bmp0F4value; // 0 do 4095

Funkcje te odczytują odpowiedni rejestr, przesuwają zawartość w celu usunięcia 2 LSB i zwracają pozostałe 6 bitów. Funkcje te są używane w przykładowym szkicu powerSaverPressureAndTemperature.ino w następujący sposób:

// odczytaj wartość EventCounter z powrotem z bmp1

bajt bmp1F4value= bmp1.readF4Sleep(); // 0 do 63 bajtów bmp1F5value= bmp1.readF5Sleep(); // 0 do 63 eventCounter= bmp1F5value*64+bmp1F4value; // 0 do 4095

Funkcje surowej temperatury i ciśnienia

Podstawowe funkcje readTemperature, readPressure i readHumidity składają się z dwóch elementów. Najpierw surowe 20-bitowe wartości temperatury i ciśnienia są uzyskiwane z BME/P280 lub nieprzetworzone 16-bitowe wartości wilgotności są uzyskiwane z BME280. Następnie algorytm kompensacji służy do generowania wartości wyjściowych w stopniach Celsjusza, hPa lub %RH.

Biblioteka zapewnia oddzielne funkcje dla tych komponentów, dzięki czemu można uzyskać surowe dane dotyczące temperatury, ciśnienia i wilgotności i być może w jakiś sposób nimi manipulować. Zapewniony jest również algorytm do uzyskiwania temperatury, ciśnienia i wilgotności z tych nieprzetworzonych wartości. W bibliotece algorytmy te są zaimplementowane przy użyciu arytmetyki zmiennoprzecinkowej o podwójnej długości. Działa dobrze na ESP8266, który jest 32-bitowym procesorem i używa 64 bitów dla „podwójnych” zmiennych zmiennoprzecinkowych. Udostępnienie tych funkcji może być przydatne do oceny i ewentualnej zmiany obliczeń dla innych platform.

Te funkcje to:

readRawPressure (rawTemperature); // odczytuje surowe dane ciśnienia i temperatury z BME/P280readRawHumidity (rawTemperature, rawPressure); // odczytuje surowe dane o wilgotności, temperaturze i ciśnieniu z BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (surowa wilgotność, t_fine)

Argument "t-fine" dla tych funkcji jest wart wyjaśnienia. Algorytmy kompensacji ciśnienia i wilgotności zawierają składnik zależny od temperatury, który jest osiągany przez zmienną t_fine. Funkcja calcTemperature zapisuje wartość w t_fine w oparciu o logikę algorytmu kompensacji temperatury, która jest następnie używana jako dane wejściowe zarówno w calcPressure, jak i calcHumidity.

Przykład wykorzystania tych funkcji można znaleźć w przykładowym szkicu rawPressureAndTemperature.ino, a także w kodzie funkcji readHumidity() w pliku.cpp biblioteki.

Wysokość i ciśnienie na poziomie morza

Znany jest związek między ciśnieniem atmosferycznym a wysokością. Pogoda również wpływa na ciśnienie. Kiedy organizacje meteorologiczne publikują informacje o ciśnieniu atmosferycznym, zwykle dostosowują je do wysokości, a więc „mapa synoptyczna” pokazuje izobary (linie stałego ciśnienia) znormalizowane do średniego poziomu morza. Tak naprawdę w tej relacji są 3 wartości, a znajomość dwóch z nich umożliwia wyprowadzenie trzeciej. Te 3 wartości to:

  • wysokość nad poziomem morza
  • rzeczywiste ciśnienie powietrza na tej wysokości
  • równoważne ciśnienie powietrza na poziomie morza (ściślej, średni poziom morza, ponieważ chwilowy poziom morza stale się zmienia)

Ta biblioteka zapewnia dwie funkcje dla tej relacji, jak następuje:

calcAltitude (ciśnienie, seaLevelhPa);

calcNormalisedCiśnienie (ciśnienie, wysokość);

Istnieje również wersja uproszczona, która zakłada standardowe ciśnienie na poziomie morza 1013,15 hPa.

calcAltitude (ciśnienie); // Standard seaLevelPressure założone

Krok 3: Szczegóły urządzenia BMP280

Szczegóły urządzenia BMP280
Szczegóły urządzenia BMP280

Możliwości sprzętowe

BMP280 posiada 2 bajty danych konfiguracyjnych (pod adresami rejestrów 0xF4 i 0xF5), które służą do sterowania wieloma opcjami pomiaru i wyprowadzania danych. Zapewnia również 2 bity informacji o stanie i 24 bajty parametrów kalibracji, które są używane do konwersji surowych wartości temperatury i ciśnienia na konwencjonalne jednostki temperatury i ciśnienia. BME280 posiada dodatkowe dane w następujący sposób:

  • 1 dodatkowy bajt danych konfiguracyjnych pod adresem rejestru 0xF2 używany do sterowania wielokrotnymi pomiarami wilgotności;
  • 8 dodatkowych bajtów parametrów kalibracyjnych używanych do przeliczania wartości wilgotności surowej na procent wilgotności względnej.

Rejestry temperatury, ciśnienia i statusu dla BME280 są takie same jak dla BMP280 z drobnymi wyjątkami:

  • bity "ID" BME280 są ustawione na 0x60, więc można go odróżnić od BMP280, który może mieć wartość 0x56, 0x57 lub 0x58
  • kontrola czasu uśpienia (t_sb) została zmieniona tak, że dwa długie czasy w BMP280 (2000 ms i 4000 ms) zostały zastąpione w BME280 krótkimi czasami 10 ms i 20 ms. Maksymalny czas uśpienia w BME280 wynosi 1000 ms.
  • W BME280 surowe wartości temperatury i ciśnienia wynoszą zawsze 20 bitów, jeśli stosuje się filtrowanie. Użycie wartości od 16 do 19 bitów jest ograniczone do przypadków bez filtrowania (tj. filter=0).

Temperatura i ciśnienie to 20-bitowe wartości, które należy przekonwertować na konwencjonalną temperaturę i ciśnienie za pomocą dość złożonego algorytmu wykorzystującego 3 16-bitowe parametry kalibracji dla temperatury i 9 16-bitowych parametrów kalibracji plus temperaturę dla ciśnienia. Granulacja pomiaru temperatury wynosi 0,0003 stopnia Celsjusza dla najmniej znaczącej zmiany bitu (odczyt 20-bitowy), wzrastając do 0,0046 stopnia Celsjusza, jeśli używany jest odczyt 16-bitowy.

Wilgotność to 16-bitowa wartość, którą należy przekonwertować na wilgotność względną za pomocą innego złożonego algorytmu wykorzystującego 6 parametrów kalibracji, które są mieszanką 8, 12 i 16 bitów.

Karta katalogowa pokazuje bezwzględną dokładność odczytu temperatury jako +-0,5 C w 25 C i +-1 C w zakresie od 0 do 65 C.

Rozdrobnienie pomiaru ciśnienia wynosi 0,15 paskali (tj. 0,0015 hektopaskali) przy rozdzielczości 20 bitów lub 2,5 paskala przy rozdzielczości 16 bitów. Na wartość ciśnienia surowego wpływa temperatura, tak że około 25°C wzrost temperatury o 1°C powoduje spadek mierzonego ciśnienia o 24 Paskale. W algorytmie kalibracji uwzględniana jest czułość temperaturowa, dlatego dostarczane wartości ciśnienia powinny być dokładne w różnych temperaturach.

Karta katalogowa pokazuje bezwzględną dokładność odczytu ciśnienia jako +-1 hPa dla temperatur od 0 C do 65 C.

Dokładność wilgotności podana jest w karcie katalogowej jako +-3% RH i +-1% histerezy.

Jak to działa

24 bajty danych kalibracyjnych temperatury i ciśnienia, a także w przypadku BME280 8 bajtów danych kalibracyjnych wilgotności muszą być odczytane z urządzenia i zapisane w zmiennych. Dane te są indywidualnie programowane w urządzeniu w fabryce, więc różne urządzenia mają różne wartości - przynajmniej dla niektórych parametrów. BME/P280 może znajdować się w jednym z dwóch stanów. W jednym stanie mierzy. W drugim stanie czeka (śpi).

W jakim stanie jest, można sprawdzić, patrząc na bit 3 rejestru 0xF3.

Wyniki ostatniego pomiaru można uzyskać w dowolnym momencie, odczytując odpowiednią wartość danych, niezależnie od tego, czy urządzenie śpi, czy mierzy.

Istnieją również dwa sposoby obsługi BME/P280. Jednym z nich jest tryb ciągły (nazywany trybem normalnym w arkuszu danych), który wielokrotnie przełącza się między stanami pomiaru i snu. W tym trybie urządzenie wykonuje zestaw pomiarów, następnie przechodzi w stan uśpienia, budzi się na kolejny zestaw pomiarów i tak dalej. Liczbę pojedynczych pomiarów i czas trwania części snu cyklu można kontrolować za pomocą rejestrów konfiguracyjnych.

Innym sposobem obsługi BME/P280 jest tryb Single Shot (nazywany w arkuszu danych trybem Forced). W tym trybie urządzenie jest wybudzane z uśpienia poleceniem pomiaru, wykonuje zestaw pomiarów, po czym wraca do stanu uśpienia. Ilość pojedynczych pomiarów w zestawie jest kontrolowana w poleceniu konfiguracyjnym, które wybudza urządzenie.

W BMP280, jeśli wykonywany jest pojedynczy pomiar, 16 najbardziej znaczących bitów w wartości jest wypełnianych, a cztery najmniej znaczące bity w odczycie wartości są zerami. Liczbę pomiarów można ustawić na 1, 2, 4, 8 lub 16, a wraz ze wzrostem liczby pomiarów zwiększa się liczba bitów wypełnianych danymi, tak że przy 16 pomiarach wszystkie 20 bitów jest wypełnianych danymi pomiarowymi. Arkusz danych określa ten proces jako nadpróbkowanie.

W BME280 to samo ustawienie obowiązuje, o ile wynik nie jest filtrowany. Jeśli stosuje się filtrowanie, wartości zawsze wynoszą 20 bitów, niezależnie od tego, ile pomiarów jest wykonywanych w każdym cyklu pomiarowym.

Każdy pojedynczy pomiar trwa około 2 milisekund (typowa wartość; maksymalna wartość to 2,3 ms). Dodanie do tego stałego narzutu wynoszącego około 2 ms (zwykle nieco mniej) oznacza, że sekwencja pomiarowa, która może składać się z od 1 do 32 pojedynczych pomiarów, może trwać od 4 ms do 66 ms.

Karta katalogowa zawiera zestaw zalecanych kombinacji nadpróbkowania temperatury i ciśnienia dla różnych zastosowań.

Rejestry kontroli konfiguracji

Dwa rejestry kontroli konfiguracji w BMP280 znajdują się pod adresami rejestrów 0xF4 i 0xF5 i są mapowane na 6 indywidualnych wartości kontroli konfiguracji. 0xF4 składa się z:

  • 3 bity osrs_t (zmierz temperaturę 0, 1, 2, 4, 8 lub 16 razy);
  • 3 bity osrs_p (zmierz ciśnienie 0, 1, 2, 4, 8 lub 16 razy); oraz
  • 2 bity Tryb (Uśpienie, Wymuszony (tj. Pojedynczy strzał), Normalny (tj. ciągły).

0xF5 składa się z:

  • 3 bity t_sb (czas czuwania, 0,5 ms do 4000 ms);
  • 3-bitowy filtr (patrz poniżej); oraz
  • 1-bitowy spiw_en, który wybiera SPI lub I2C.

Parametr filtra steruje rodzajem algorytmu wykładniczego zaniku lub filtrem Infinite Impulse Response (IIR), stosowanym do surowych wartości pomiaru ciśnienia i temperatury (ale nie do wartości wilgotności). Równanie podano w arkuszu danych. Kolejna prezentacja to:

Wartość(n) = Wartość(n-1) * (K-1)/K + pomiar(n) / K

gdzie (n) wskazuje ostatni pomiar i wartość wyjściową; a K jest parametrem filtra. Parametr filtru K i może być ustawiony na 1, 2, 4, 8 lub 16. Jeśli K jest ustawione na 1, równanie staje się po prostu Wartość(n) = pomiar(n). Kodowanie parametru filtra to:

  • filtr = 000, K=1
  • filtr = 001, K=2
  • filtr = 010, K=4
  • filtr = 011, K=8
  • filtr = 1xx, K=16

BME 280 dodaje kolejny rejestr kontroli konfiguracji pod adresem 0xF2, „ctrl_hum” z pojedynczym 3-bitowym parametrem osrs_h (pomiar wilgotności 0, 1, 2, 4, 8 lub 16 razy).

Krok 4: Czas pomiaru i odczytu

Planuję dodać to później, pokazując synchronizację poleceń i odpowiedzi pomiarowych.

Iddt - prąd przy pomiarze temperatury. Typowa wartość 325 uA

Iddp - prąd przy pomiarze ciśnienia. Typowa wartość 720 uA, maks. 1120 uA

Iddsb - prąd w trybie czuwania. Typowa wartość 0,2 uA, maks. 0,5 uA

Iddsl - aktualny w trybie uśpienia. Typowa wartość 0,1 uA, maks. 0,3 uA

Krok 5: Wytyczne dotyczące oprogramowania

Wytyczne dotyczące oprogramowania
Wytyczne dotyczące oprogramowania
Wskazówki dotyczące oprogramowania
Wskazówki dotyczące oprogramowania

Tryb I2C Burst

Arkusz danych BMP280 zawiera wskazówki dotyczące odczytu danych (rozdział 3.9). Mówi „zdecydowanie zaleca się użycie odczytu serii i nie adresowanie każdego rejestru indywidualnie. Zapobiegnie to możliwemu pomieszaniu bajtów należących do różnych pomiarów i zmniejszy ruch na interfejsie”. Nie podano wskazówek dotyczących odczytu parametrów kompensacji/kalibracji. Przypuszczalnie nie stanowią one problemu, ponieważ są statyczne i nie zmieniają się.

Ta biblioteka odczytuje wszystkie ciągłe wartości w jednej operacji odczytu - 24 bajty w przypadku parametrów kompensacji temperatury i ciśnienia, 6 bajtów łącznie dla temperatury i ciśnienia oraz 8 bajtów łącznie dla wilgotności, temperatury i ciśnienia. Gdy sprawdzana jest sama temperatura, odczytywane są tylko 3 bajty.

Korzystanie z makr (#define itp.)

W tej bibliotece nie ma makr innych niż zwykłe makro „include guard”, które zapobiega duplikowaniu.

Wszystkie stałe są definiowane za pomocą słowa kluczowego const, a drukowanie debugowania jest sterowane standardowymi funkcjami języka C.

Było to dla mnie źródłem pewnej niepewności, ale rada, którą otrzymuję czytając wiele postów na ten temat, jest taka, że użycie #define do deklaracji stałych (przynajmniej) i (prawdopodobnie) kontroli drukowania debugowania jest niepotrzebne i niepożądane.

Przypadek użycia const zamiast #define jest dość jasny - const używa tych samych zasobów co #define (tj. nil), a wynikowe wartości są zgodne z regułami określania zakresu, zmniejszając w ten sposób ryzyko błędów.

Sprawa kontroli drukowania debugowania jest nieco mniej jasna, ponieważ sposób, w jaki to zrobiłem, oznacza, że końcowy kod zawiera logikę dla instrukcji drukowania debugowania, nawet jeśli nigdy nie są one wykonywane. Jeśli biblioteka ma być używana w dużym projekcie na mikrokontrolerze z bardzo ograniczoną pamięcią, może to stać się problemem. Ponieważ mój rozwój odbywał się na ESP8266 z dużą pamięcią flash, nie wydawało mi się to problemem.

Krok 6: Wydajność temperaturowa

Planuję dodać to później.

Krok 7: Wydajność ciśnienia

Planuję dodać to później.

Zalecana: