BME280 – czujnik temperatury, wilgotności oraz ciśnienia (część 1)

Typowe konfiguracje pracy BME280

W dokumentacji układu producent sugeruje kilka konfiguracji dla typowych zastosowań sensora BME280.

Stacje pogodowe

W stacjach pogodowych mierzymy temperaturę, wilgotność, a także ciśnienie atmosferyczne. Najlepiej użyć trybu Forced i mierzyć co minutę lub rzadziej, zależnie od wymagań. W tym przypadku szum danych z sensora ciśnienia nie ma wielkiego znaczenia, bo i tak pomiary są wykonywane dostatecznie dokładnie. Filtr IIR można wyłączyć. Szacowany pobór prądu wynosi 0,16 µA, a szum pomiaru ciśnienia ok. 3 Pa (niepewność pomiaru wysokości ok. 30 cm).

Pomiar wilgotności wykonywany w układach stacji pogodowych lub układach sterowania wentylacją nie wymaga dużej częstotliwości odczytywania danych. Jeżeli ma być to tylko pomiar wilgotności w sterownikach klimatyzacji, to można wyłączyć sensor ciśnienia, ale sensor temperatury musi być włączony, bo informacja o temperaturze jest potrzebna do kompensacji danych z czujnika wilgotności. Zaleca się używanie trybu Forced i wymuszanie pomiaru co ok. 1 sekundę. Nadpróbkowanie można ustawić na x1 dla obu pomiarów: wilgotności i temperatury. Należy wyłączyć filtr IIR. Szacowany pobór prądu wynosi ok. 2,9 µA.

Praca z dużą częstotliwością pomiarów

W układach nawigacji wewnątrz budynków sensor BME280 może być wykorzystany do pomiaru wysokości za pomocą pomiaru ciśnienia. Żeby uzyskać dobrą dokładność i rozdzielczość pomiaru, szum powinien być jak najmniejszy. Można tu wykorzystać tryb pomiaru Normal z t_stby 0,5 ms (rysunek 7). Nadpróbkowanie w kanale pomiaru ciśnienia ustawiamy na x16, temperatury na x2, natomiast wilgotności na x1. Należy włączyć filtr IIR. Pomiar wilgotności można wykorzystać do detekcji zmiany pomieszczenia lub też wyłączyć. Szacowany pobór prądu wzrasta do 633 µA, natomiast szum pomiaru ciśnienia jest na poziomie 0,2 Pa, co daje niepewność pomiaru wysokości na poziomie 1,6…1,7 cm. Widać tu jak włączone nadpróbkowanie wpływa na zwiększenie dokładności pomiaru ciśnienia. Przy wyłączonym nadpróbkowaniu (x1) niepewność jest na poziomie 30 cm. Dane mogą być odczytywane do 25 razy na sekundę.

Przy precyzyjnym pomiarze ciśnienia trzeba pamiętać o wpływie dokładności pomiaru temperatury w zależności od temperatury otoczenia, bo jak pamiętamy jest ona wykorzystywana do kompensacji pomiaru ciśnienia. Na rysunku 13 pokazana jest zależność zmiany szumów pomiaru w funkcji temperatury. Jak widać szum w układzie pomiaru temperatury wyraźnie rośnie dla temperatur ujemnych.

Rysunek 13. Zmiana szumów pomiaru ciśnienia w funkcji temperatury otoczenia

Temperatura otoczenia ma wpływ na zakres pomiaru wilgotności. Pełny zakres pomiaru (0….100%) jest osiągalny jedynie w temperaturze 0….60°C. Poza tym zakresem pomiar wilgotności jest ograniczany – rysunek 14.

Rysunek 14. Zakres pomiaru wilgotności w funkcji temperatury

 

Interfejsy komunikacyjne

Do przesyłania danych pomiędzy hostem a sensorem BME280 można wybrać jednego z dwóch interfejsów: SPI lub I2C. Oba pracują na magistrali jako urządzenia slave z możliwością przesyłania pojedynczych bajtów lub wielu bajtów w jednej transakcji. Aby wybrać interfejs, należy wymusić odpowiedni stan logiczny na wyprowadzeniu CSB:

  • CSB = 0 – interfejs SPI,
  • CSB = 1 – interfejs I2C.

Komunikacja przez interfejs SPI

Interfejs SPI pracuje w trybach 00 (CPOL=CPHA=0) i 11 (CPOL=CPHA=1) i składa się z linii:

  • CSB – Chip Select (aktywny – stan niski),
  • SCK – linia zegarowa,
  • SDI – linia danych wejścia/wyjścia dla interfejsu 3-liniowego i tylko wejścia dla interfejsu 4 liniowego,
  • SDO – linia danych wyjściowych dla interfejsu 4-liniowego (dla interfejsu 3-liniowego jest w stanie wysokiej impedancji).

Włączenie interfejsu 3-liniowego programuje się przez wpisanie 1 do spi3w_en w rejestrze o adresie 0xF5 config. Na rysunku 15 pokazano przebiegi czasowe 4-liniowego protokołu SPI w trybie 11.

Rysunek 15. Przebiegi czasowe 4-liniowego interfejsu SPI w trybie 11

Sekwencja zapisywania danych przez SPI zaczyna się od wymuszenia stanu niskiego na wejściu CSB, a także wysłaniu bajtu kontrolnego zawierającego 7 bitów adresu rejestru. Najstarszy, ósmy bit b7 (RW) określa kierunek przesyłania danych i dla sekwencji zapisywania powinno się go wyzerować. Sekwencja zapisu danych do rejestru pod wskazany adres została pokazana na rysunku 16. Przesłanie kolejnych bajtów musi być za każdym razem poprzedzone wysłaniem adresu (nie ma auto inkrementacji).

Rysunek 16. Sekwencja zapisywania danych do rejestru przez magistralę SPI

Odczytywanie danych z rejestru o zadanym adresie wymaga, aby po wymuszeniu stanu niskiego na CSB wysłano bajt kontrolny adresu rejestru z ustawionym bitem b7 (RW=1). Po odebraniu tego bajtu sensor przesyła 8-bitową zawartość zaadresowanego rejestru – rysunek 17. Przy odczytywaniu działa mechanizm auto inkrementacji adresu – kolejne cykle odczytu przesyłają dane z adresów adr+1.

Rysunek 17. Sekwencja odczytywania danych z rejestru przez magistralę SPI

Komunikacja przez interfejs I2C

Po wymuszeniu stanu wysokiego na wejściu CSB aktywny jest interfejs I2C slave. I2C jest kompatybilny ze standardem Philips i może pracować w trybach standard fast i high speed.

Sześć starszych bitów adresu slave magistrali są stałe i mają wartość 111011, a wartość najmłodszego bitu ustala stan logiczny na wyprowadzeniu SDO. Kiedy SDO jest w stanie niskim, to adres ma wartość 0x76, a kiedy SDO jest w stanie wysokim, adres slave ma wartość 0x77.

Przesyłanie danych przez I2C składa się z wysłania sekwencji:

  • START,
  • Adresu slave z bitem RW=0,
  • Bajtu kontrolnego z adresem rejestru,
  • Bajtu danych zapisanych pod adres rejestru.

Podobnie jak w przypadku SPI nie ma auto inkrementacji adresu i zapis danych pod kolejny adres musi być poprzedzony wysłaniem adresu rejestru. Sekwencja zapisywania kończy się wysłaniem sekwencji STOP – rysunek 18.

Rysunek 18. Sekwencja zapisywania danych do rejestrów BME280 przez magistralę I2C

Sekwencja odczytywania jest standardowa i składa się z dwóch faz. Pierwsza faza to zapisanie do układu Slave adresu rejestru, który ma być odczytywany. Po wysłaniu sekwencji START układ Master wysyła na magistralę:

  • Adres slave z bitem RW=0,
  • Bajt kontrolny zawierający adres odczytywanego rejestru.

Po wysłaniu adresu rejestru, Master wysyła powtórną sekwencję START (Repeat START) zamiast sekwencji STOP kończącej transmisję. Po powtórnym wysłaniu START wysyłany jest adres Slave z bitem RW=1 oznaczającym, że układ Slave ma wysyłać dane na magistralę. Master może teraz kolejno odczytywać dane z rejestrów sensora począwszy od adresu wpisanego w pierwszej fazie. Podobnie jak w przypadku SPI, sekwencja automatycznie zwiększa adres rejestru po każdym odczytaniu danych (autoinkrementacja adresu).

Sekwencję odczytywania danych przez I2C pokazano na rysunku 19.

Rysunek 19. Sekwencja odczytywania danych przez magistralę SPI

 

Czujnik BME280 można znaleźć w sklepie Kamami.pl. Oferta obejmuje również moduły z zamontowanym sensorem.
Zachęcamy do przeczytania drugiej części artykułu dostępnej na portalu: https://mikrokontroler.pl/2020/01/22/bme280-czujnik-temperatury-wilgotnosci-oraz-cisnienia-czesc-2/

O autorze

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC.
Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.