Czujnik BME280: Tutorial pomiaru wilgotności i temperatury z Arduino
- Szczegóły
W czwartym odcinku kursu wykorzystamy nowoczesny czujnik BME280, który mierzy trzy ważne wielkości: ciśnienie, wilgotność i temperaturę. Czujnik ten ma interfejs I2C (I2C), który jest w pełni kompatybilny z TWI (Two Wire Interface) oraz SMBus. Procesor ATmega328P, a więc i Arduino Uno, ma wbudowany sprzętowy interfejs TWI (I2C).
Tytułem wyjaśnienia warto dodać, że oprócz „potrójnego” czujnika BME280, dostępne są też pokrewne „podwójne”, oznaczone BMP, które nie mierzą wilgotności, a tylko ciśnienie i temperaturę. Wersja BMP280 jest zdecydowanie bardziej dokładna niż wcześniejsza dość popularna BMP180. I jeszcze jeden ważny szczegół: same czujniki BMP i BME, w tym BME280, nie mogą być zasilane napięciem wyższym niż 3,6V.
Interfejs I2C i biblioteki Arduino
W każdym przypadku aby w Arduino wykorzystać interfejs TWI (I2C), potrzebna jest też biblioteka, np. Nie musimy szukać takiej biblioteki „na piechotę”. Ja na początek zainstalowałem wskazaną czerwonymi strzałkami bibliotekę Tylera Glenna, ponieważ realizuje ona dodatkowo interesujące mnie obliczenia „środowiskowe” (m.in. punktu rosy i wilgotności bezwzględnej).
Od tej chwili w pakiecie Arduino dostępna jest nie tylko sama biblioteka, ale też gotowe przykładowe szkice - programy. Znajdziemy je wybierając Plik - Przykłady (File - Examples) i po przewinięciu listy, na samym dole: BME280, gdzie mamy szereg przykładów. Wróć do przykładów z rysunku 10 i otwórz gotowy program - szkic Environment_Calculations.ino.
Wyliczenia punktu rosy wyrażone w stopniach Celsjusza są miarodajne i absolutne (w sumie jest to parametr bardziej wartościowy i przydatny w praktyce, niż podawana w procentach wartość wilgotności względnej: % RH). Natomiast obliczenia wysokości i przeliczonego ciśnienia są przykładowe i należałoby je dostosować do konkretnych warunków, zmieniając w programie pewne parametry.
Przeczytaj także: Poradnik: walka z wilgocią w mieszkaniu
W każdym razie rysunek 15 udowadnia, że informacje z czujnika BME280 można wykorzystać w różny sposób, także do budowy wysokościomierza (altimetru), co może być przydatne nie tylko w modelarstwie lotniczym, ale też na przykład… w grach. Z uwagi na ogromną rozdzielczość pomiaru ciśnienia, można wykrywać zmiany wysokości nawet rzędu centymetrów! Wtedy trzeba zastosować uśrednianie i filtrowanie pomiarów.
Zachęcam Cię do przeanalizowania kodu w tych dwóch wykorzystanych gotowych plikach .ino. Zasadniczo nie jest on trudny do analizy, ale zastosowano specyficzny sposób wyprowadzania danych przez łącze szeregowe do konsoli komputera. Kwestiami tymi będziemy zajmować się później. W programach występują też inne zagadkowe szczegóły (choćby obecność w zmiennych float „wartości” NAN, nie reprezentujących wartości liczbowych), które mogą namącić w głowie.
Podłączenie czujnika BME280 do Arduino
Złóż układ według rysunku 16. Do zestawu z poprzedniego odcinka z wyświetlaczem znakowym LCD dodajemy czujnik BME280 (usuwając diodę, która była wcześniej czujnikiem temperatury).
Na początku masz dyrektywy dla kompilatora, dołączające biblioteki: BME280I2C (czujnik BME280 z komunikacja przez I2C), Wire oraz LiquidCrystal. Następnie tworzymy i od razu konfigurujemy dwa obiekty. Jeden (lcd) to stary znajomy wyświetlacz LCD, podłączony dokładnie tak, jak w poprzednim odcinku. Drugi obiekt to reprezentacja w programie naszego modułu pomiarowego.
BME280I2C to nazwa biblioteki (klasy) i na podstawie tej biblioteki zostanie stworzona „programowa reprezentacja” modułu BME280, którą w naszym programie - szkicu nazwałem swojsko: czujnik. Celowo w wielu miejscach będę stosował polskie nazwy (ale bez „polskich” liter), by odróżnić to, co wynika z wymagań programu, a co jest naszym wyborem.
Przeczytaj także: Wakacje w Bodrum
W jednorazowo wykonywanej funkcji setup() musimy zainicjalizować urządzenia. Standardowo realizujemy to dla wyświetlacza LCD (lcd.begin(16, 2);) i łącza I2C (Wire.begin();). Inicjalizacja naszego czujnika jest bardziej złożona. Jeśli wszystko jest w porządku, zwraca ona wartość true (1). Jeśli czujnik reaguje, program wykonuje funkcję - metodę czujnik.chipModel(), która odczytuje informacje o modelu układu scalonego.
Program rozróżnia kostki BME280 i BMP280 i wyświetla stosowny napis. Dwa ostatnie są jasne. Wyjaśnienia wymaga pierwszy: odczyt wartości z czujnika. Można to zrobić na kilka sposobów, co widać w programie, gdzie mamy szereg zakomentowanych linii z rozmaitymi sposobami odczytu. Na pierwszy rzut oka wygląda to dość groźnie. Aby zrozumieć istotę sprawy, trzeba wrócić do czujnika BME280.
Jak pokazuje rysunek 17 zawiera trzy czujniki i układy współpracujące z zasilaczem i stabilizatorem, multiplekser, przetwornik ADC oraz bloki logiki i interfejsu. Układ ma dwie oddzielne końcówki zasilania VDD i VDDIO. Układ logiki jest dość rozbudowany. Nie trzeba wgłębiać się w te szczegóły dzięki gotowej bibliotece Arduino. Ale trzeba wiedzieć, że z układem BME280 jest nieco inaczej, niż z innymi prostszymi czujnikami.
Mianowicie w wielu czujnikach wystarczy po prostu odczytać odpowiednie wartości z rejestrów i tak uzyskane liczby są finalnymi wartościami mierzonych wielkości. Tu sytuacja jest znacznie bardziej skomplikowana. Owszem, trzeba odczytać wartości z rejestrów, gdzie zawarte są aktualne dane z przetwornika ADC. Ale liczby te należy w dość skomplikowany sposób przetworzyć, wykorzystując współczynniki kalibracyjne, też odczytane z danego egzemplarza czujnika.
Biblioteka Arduino podczas pracy po pierwsze odczytuje dane z rejestrów czujnika, i po drugie wykonuje dość skomplikowane obliczenia. W efekcie uzyskiwane są wyniki o zaskakująco dużej rozdzielczości i dość dużej dokładności bezwzględnej.
Przeczytaj także: Poradnik pomiaru wilgotności
która hurtowo odczytuje co trzeba, oblicza co trzeba i wpisuje do trzech zmiennych typu float wartości ciśnienia, temperatury i wilgotności względnej. Wilgotność względna wyrażana jest w procentach i tu nie ma wątpliwości. Do określenia jednostek można wykorzystać pewne zdefiniowane stałe, np. widoczne w szkicu TempUnit_Celsius czy PresUnit_hPa. Ale można też „pójść na skróty”: otóż takim stałym przyporządkowane są kolejno liczby.
to zostaną zastosowane wartości domyślne (0, 0), czyli ciśnienie będzie podane w paskalach, a temperatura w stopniach Celsjusza. Po skompilowaniu i wgraniu programu mój model podczas pracy wyglądał jak na fotografii 19.
Czujniki DHT11 i DHT22
DHT11 i DHT22 to czujniki wilgotności i temperatury, w których mierzone wartości są konwertowane do postaci cyfrowej, a komunikacja z systemem mikroprocesorowym odbywa się z wykorzystaniem interfejsu szeregowego. Oba czujniki są stosunkowo wolne i niezbyt dokładne, ale ich parametry są zwykle wystarczające w typowych hobbystycznych zastosowaniach.
Na fotografii 1 pokazano czujnik DHT11, natomiast na fotografii 2 znajduje się sensor zgodny z DHT22 o oznaczeniu AM2302. Podstawowe parametry tych czujników zebrano w tabeli 1.
Oba czujniki znajdują się w 4-wyprowadzeniowych obudowach i do pracy wymagają, oprócz dołączenia napięcia zasilania, podciągnięcia linii sygnałowej do plusa zasilania przez rezystor o wartości 4,7…10 kΩ, co pokazano na rysunku 3. Przykład dołączenia sensora do płytki Arduino Uno z wykorzystaniem płytki stykowej, rezystora 4,7 kΩ.
Dane z sensorów są odczytywane szeregowo, opis transmisji jest dostępny w kartach katalogowych. W Internecie można znaleźć wiele bibliotek umożliwiających korzystanie z tych czujników. W najlepszej sytuacji są jednak użytkownicy Arduino - dla tego środowiska powstały najlepiej dopracowane biblioteki, np. DHTLib czy DHT-sensor-library.
W przypadku Arduino Uno jest wykorzystywany zamontowany na płytce konwerter UART-USB widziany w komputerze osobistym jako wirtualny port szeregowy. Wynik działania programu pokazano na rysunku 5.
Przykładowy kod dla DHT11
Program odczytujący zmierzone dane przez sensor DHT22 i wysyłający wyniki pomiarów przez port szeregowy do komputera pokazano na listingu 1.
Program działa następująco. Importujemy bibliotekę DHT.h i tworzymy instancję dla czujnika o nazwie czujnik i konfigurujemy go dla DHT11 podłączonego do pinu 10. Definiujemy zmienne do odbioru danych jako float (liczba zmiennoprzecinkowa) Następnie w pętli startowej uruchamiamy UART do obioru danych oraz sam czujnik.
Teraz w pętli głównej programu przypisujemy zmiennym kolejno: odczyt wilgotności, temperatury oraz indeksu temperatury. Jak widać, zamiast wartości zostaje zwracane nan. NaN, a dokładniej Not-a-Number, czyli zwrócona wartość nie jest liczbą. Możemy ją głównie spotkać przy zmiennych typu int,float,double itp. gdzie zwracaną wartością są same liczby.
Aby uniknąć błędu w takiej postaci możemy go ładnie zastąpić komunikatem. W tym celu wystarczy sprawdzić, czy dla tych zmiennych zwróconą wartością jest NaN. Można to wykonać np. if (isnan(wilgotnosc) & isnan(temperatura) & isnan(indeksTemperatury)) { Serial.println("Błąd oczytu z czujnika.
DHT22 to czujnik wilgotności i temperatury w jednym. Jego podstawową zaletą jest to, że jest bardzo łatwy w użytku. Jego jedyną wadą jest to, że pomiar jest wykonywany co 2 sekundy. Podłączenie do Arduino sprowadza się do podłączenia zasilania, masy i linii danych.
Cały czujnik zbudowany jest z dwóch części: pojemnościowego czujnika wilgotności i termistora. Pomiar wilgotności w zakresie 0 - 100%. Pomiar temperatury w zakresie -40 - 125°C. 4 piny. Zanim zabierzemy się do podłączania, pamiętajmy, że między pinem zasilania, a pinem danych należy wstawić rezystor podciągający 10k lub zbliżony (4.7 - 10k).
Razem z biblioteką dostarczany jest przykładowy program DHTtester.ino, za jego pomocą możemy w prosty sposób sprawdzić wilogotność powietrza i temperaturę otoczenia. Wystarczy pin 1 podłączyć do zasilania, pin 2 podłączyć do pinu 2 w Arduino, a pin 4 do masy. Pin 3 zostawiamy niepodłączony. Po wgraniu programu uruchamiamy serial monitor.
Czujnik DHT22 jest prosty i tani w użyciu. Dzięki niemu możecie zbudować prostą stację meteorologiczną lub monitorującą parametry w domu. W ofercie są również inne czujniki z serii DHT. Np. inny popularny czujnik z serii DHT, model DHT11 potrafi zmierzyć temperaturę w zakresie 0-50°C oraz wilgotność w zakresie 20-90%RH.
Dla przypomnienia nasz DHT22 ma większy zakres temperatur (-40°C do 80°C) oraz wilgotności (od 0 do 99,9%RH). Jednak nic nie stoi na przeszkodzie, aby wykorzystać DHT11 w projekcie. Pytanie jak duży zakres pomiarowy będzie potrzebowali.
BME280 - czujnik wilgotności, ciśnienia i temperatury
Czujnik BOSCH BME280 to kompaktowy moduł 3w1. Dzięki niemu możemy z powodzeniem zbudować całkiem rozbudowaną i dokładną stację pogody, albo dokonywać pomiarów otoczenia na potrzeby kompensacji warunków pogodowych dla innych naszych projektów.
Moduł ten potrzebuje zasilania 3.3V lub 5V i komunikuje się za pomocą magistrali I2C oraz SPI w zależności od wersji. Na płytce mogą znaleźć się również pola lutownicze dające możliwość zmiany adresacji modułu, tak by można było wykorzystać ich więcej niż jeden w tym samym urządzeniu. BME280 to czujnik, który jest już skalibrowany i bardzo prosty w użyciu.
Parametry pomiarów BME280
Z karty katalogowej można wyczytać, że pobór prądu jest na bardzo niskim poziomie i wynosi 3.6uA przy odczycie wszystkich parametrów raz na 1 sekundę. Parametry możemy odczytać z następującą dokładnością:
- wilgotność z dokładnością +/- 3% RH
- rozdzielczość pomiaru wilgotności to 0.008 %RH
- zakres pomiaru ciśnienia od 300 do 1100hPa
- rozdzielczość pomiaru ciśnienia 0.18Pa
- ciśnienie odczytamy z dokładnością +/- 1hPa
- zakres pomiaru temperatury od -40°C do +80°C
- rozdzielczość pomiaru temperatury 0.01°C
- temperatura z dokładnością średnią w zakresie 0 do 60°C to +/- 1°C
Budowa modułu BME280
Jak widać na powyższym obrazku najważniejszymi elementami na płytce są bardzo malutki czujnik, regulatory napięcia zasilania oraz poziomów logicznych dzięki czemu możemy podpiąć moduł zarówno pod 3.3V jaki Arduino dające 5V bez obawy o uszkodzenie.
Zmiana adresu I2C w BME280
Jak widać na powyższym obrazku moduł posiada pady do zmiany adresacji magistrali I2C. Domyślnie moduł ma połączone pady środkowy z lewym, aby zmienić adres należy nożykiem przeciąć ścieżkę i zlutować połączenie z padem po przeciwnej stronie. Dzięki temu możemy zmienić adres z 0x76HEX na 0x77HEX.
Jak podłączyć BME280 do Arduino?
Wszystko zależy, do którego Arduino ; ) zasada jest taka, że zwracamy uwagę na piny. Poniżej prezentujemy jak podłączyć czujnik do Arduino UNO jeśli korzystacie z innego mikrokontrolera należy sprawdzić pinout płytki i połączyć odpowiednio piny SDA z SDA i SCL z SCL i to cała filozofia.
Podpinając BME280 do Arduino UNO należy połączyć:
- Arduino 5V <-> VIN BME280
- Arduino GND <-> GND BME280
- Arduino A4 <-> SDA BME280
- Arduino A5 <-> SCL BME280
pozostałe piny jeżeli występują w innych wersjach płytki niż omawiana: SCB i SDO są do podpięcia magistralą SPI i zostawiamy je w spokoju, my użyjemy komunikacji I2C.
Instalacja bibliotek i kod w ArduinoIDE
Po tym jak podłączymy prawidłowo nasz czujnik, przychodzi czas na uruchomienie ArduinoIDE i doinstalowanie biblioteki od Adafruit, która w znacznym stopniu uprości sprawę odczytu wszystkich danych z naszego BME280.
W celu instalacji biblioteki przechodzimy do Szkic -> Dołącz Bibliotekę -> Zarządzaj Bibliotekami Kolejno wpisujemy w wyszukaj BME i instalujemy bibliotekę od Adafruit w najnowszej wersji. Jeśli wyskoczy nam komunikat, że wymagane są inne biblioteki do poprawnego działania zgadzamy się i pozwalamy doinstalować niezbędne składniki.
Dzięki bibliotece Adafruit odczytanie wartości z czujnika jest banalne, posługujemy się funkcjami:
- bme.readTemperature() - funkcja podaje temperaturę w stopniach Celcjusza
- bme.readHumidity() - funkcja podaję wilgotność bezwzględną
- bme.readPressure() - funkcja podaje odczyt ciśnienia w hektopascalach co równa się milibarom
- bme.readAltitude(SEALEVELPRESSURE_HPA) - funkcja podaje przybliżoną wysokość nad poziomem morza
Wypisujemy odczyty w naszym serial monitorze. Odczyty wykonywane są co 1 sekundę.
Tabela 1. Podstawowe parametry czujników DHT11 i DHT22
| Parametr | DHT11 | DHT22 (AM2302) |
|---|---|---|
| Zakres pomiaru temperatury | 0-50°C | -40-125°C |
| Zakres pomiaru wilgotności | 20-90%RH | 0-100%RH |
| Dokładność pomiaru temperatury | ±2°C | ±0.5°C |
| Dokładność pomiaru wilgotności | ±5%RH | ±2%RH |
tags: #wilgotnosc #i #temperatura #arduino #tutorial

