BME680 – czujnik gazu, ciśnienia, wilgotności oraz temperatury
Moduł z czujnikiem BME680
Na rynku dostępnych jest kilka modułów z czujnikiem BME680. My skorzystamy z płytki CJMCU-BME680 dostępnej m.in. w ofercie sklepu Kamami.pl. Płytka jest względnie tania i oprócz samego sensora zawiera także stabilizator oraz translator poziomów logicznych. Umożliwia to podłączenie modułu do systemów o napięciu 5 V. Wyprowadzenia czujnika dołączono do standardowego złącza o rastrze 2,54 mm, dzięki któremu można go umieścić w płytce stykowej. W zestawie znajduje się także złącze proste goldpin, które można łatwo przylutować do płytki.
Rys. 2. Moduł z czujnikiem BME680
Na złącze wyprowadzono oczywiście pin zasilania i masy, a także wyprowadzenia interfejsów SPI oraz I2C. Płytka umożliwia więc komunikację w obu tych interfejsach (ale nie jednocześnie).
Przykład użycia z płytką ESP32
Zaprezentuję więc teraz prosty przykład wykorzystania czujnika do pomiaru wartości temperatury, ciśnienia, wilgotności oraz rezystancji czujnika gazu. Kod przykładu zaprojektowałem w środowisku Arduino, natomiast jako płytkę bazową zastosowałem ESP32-DEVKITC-32D z modułem ESP32. Dzięki jej niewielkim rozmiarom oraz układzie ESP32 z modułem Wi-Fi przykład można rozwinąć o wyświetlanie danych na stronie w sieci lokalnej lub przesyłanie za danych za pośrednictwem internetu dalej do serwera. Na nim można dokonać dalszej obróbki danych lub wykorzystać jako element sieci czujników.
Rys. 3. Płytka rozwojowa ESP32-DEVKIT-32D
Do komunikacji płytki bazowej z czujnikiem BME680 zastosowałem magistralę I2C. Wykorzystałem więc jedynie cztery przewody do połączenia modułów. Sposób połączenia zaprezentowałem w tabeli 2 oraz na rysunku 4.
Tabela 2. Połączenie modułu z BME680 oraz płytki ESP32-DEVKIT-32D
Pin modułu BME680 | Pin ESP32-DEVKIT-32D |
VCC | 5V |
GND | GND |
SCL | 22 |
SDA | 21 |
Rys. 4. Moduł z czujnikiem BME680 podłączony do płytki ESP32-DEVKIT-32D
Biblioteka do obsługi BME680 w środowisku Arduino jest dostępna na stronie platformy. Jest zgodna z każdą architekturą, co oznacza, że wystarczy w odpowiedni sposób dopasować sposób połączenia, aby móc korzystać z kodu z każdą płytką bazową zgodną z Arduino. Bibliotekę należy zainstalować w środowisku w standardowy sposób – za pomocą menu Szkic – Dołącz bilbiotekę.
Kod przykładu
Przykładowy kod ma za zadanie skomunikować się z czujnikiem, pobrać wartości i wypisać je na port szeregowy. Na poniższym listingu znajdziesz pełny kod przykładu. Kod znajdziesz także poniżej, w sekcji Do pobrania.
Listing 1. Przykład obsługi BME680 na Arduino
#include "Zanshin_BME680.h" #include <Wire.h> BME680_Class BME680; void setup() { Serial.begin(115200); if (!BME680.begin(I2C_STANDARD_MODE)) { Serial.println(F("Nie znaleziono czujnika BME680. Sprawdz polaczenie i zresetuj plytke")); while (1); } // Ustawienie oversamplingu oraz filtra BME680.setOversampling(TemperatureSensor,Oversample16); BME680.setOversampling(HumiditySensor, Oversample16); BME680.setOversampling(PressureSensor, Oversample16); BME680.setIIRFilter(IIR4); BME680.setGas(320,150); } void loop() { static int32_t temp, humidity, pressure, gas; // Pomiar za pomocą BME680 BME680.getSensorData(temp,humidity,pressure,gas); //Wypisanie pobranych danych Serial.print(F("Temperatura = ")); Serial.print(temp/100.00); Serial.println(F(" *C")); Serial.print(F("Ciśnienie = ")); Serial.print(pressure / 100.0); Serial.println(F(" hPa")); Serial.print(F("Wilgotność = ")); Serial.print(humidity/1000.0); Serial.println(F(" %")); Serial.print(F("Rezystancja czujnika gazu = ")); Serial.print(gas/ 100.0); Serial.println(F(" mOhm")); Serial.println(); delay(5000); }
Wyjaśnienie kodu
Poniżej krótkie omówienie kodu: najpierw dodałem niezbędne biblioteki do obsługi czujnika oraz interfejsu I2C.
#include "Zanshin_BME680.h" #include <Wire.h
Następnie należy wywołać obiekt klasy BME680_Class.
BME680_Class BME680;
W funkcji setup najpierw uruchamiam port szeregowy, a następnie obsługę czujnika BME680. Funkcja Begin pozwala na uruchamianie czujnika w kilku trybach – z interfejsem I2C lub SPI i w kilku konfiguracjach interfejsu. Ja wybrałem metodę najprostszą – I2C ze standardową prędkością 100 kbit/s.
void setup() { Serial.begin(115200); if (!BME680.begin(I2C_STANDARD_MODE)) { Serial.println(F("Nie znaleziono czujnika BME680. Sprawdź polaczenie i zresetuj plytke")); while (1); }
Następnie ustawiono parametry pomiarów – oversampling, filtr IIR oraz parametry nagrzewacza czujnika gazów. Oversampling to zwiększenie częstotliwości pomiaru w celu zwiększenia jego dokładności. Dla każdego czujnika dostępny jest oversampling od 1x do 16x lub też całkowite wyłączenie opcji.
Czujnik BME680 zawiera też filtr IIR dla danych temperatury i ciśnienia. Pozwala on uśrednić wyniki pomiarów. Sensor pozwala na dobór rzędu filtra. Ja ustawiłem rząd czwarty.
Ostatnia funkcja setGas pozwala na dobór temperatury i czasu pracy nagrzewacza czujnika gazu. Kod ustawia parametry – 320°C i czas 150 ms, co jest zgodne z ustawieniami domyślnymi.
BME680.setOversampling(TemperatureSensor,Oversample16); BME680.setOversampling(HumiditySensor, Oversample16); BME680.setOversampling(PressureSensor, Oversample16); BME680.setIIRFilter(IIR4); BME680.setGas(320,150);
W funkcji loop pobieramy wartości i wypisujemy je na port szeregowy. Za pobranie wartości odpowiedzialna jest funkcja setSensorData, a jej parametrami są odpowiednie zmienne, do których wpisywane są dane.
static int32_t temp, humidity, pressure, gas; // Pomiar za pomocą BME680 BME680.getSensorData(temp,humidity,pressure,gas);
Następnie wartości wypisywane są na port szeregowy za pomocą metody Serial.print. Metoda obsługuje wypisywanie zmiennej bezpośrednio. W przypadku gazu, czujnik udostępnia rezystancję powierzchni czułej, którą można następnie wykorzystać do detekcji poprawy bądź pogorszenia jakości powietrza. Poniżej zaprezentowałem sposób wypisywania temperatury.
Serial.print(F("Temperatura = ")); Serial.print(temp/100.00); Serial.println(F(" *C"));
Po każdym pomiarze kod poczeka 5 sekund i wykona kolejny pomiar.
Poniżej zobaczysz wynik pracy kodu.
Rys. 5. Wartości zmierzone przez czujnik na porcie szeregowym Arduino
Podsumowanie
Czujnik BME680 to czujnik środowiskowy umożliwiający pomiar temperatury, ciśnienia atmosferycznego, wilgotności powietrza oraz stężenia gazów. Sensor MOX wbudowany w BME680 wykrywa obecność większości lotnych związków organicznych. Z tego powodu może być on użyty do monitorowania jakości powietrza w pomieszczenia, także w innych projektach wymagających pomiaru wartości środowiskowych, zarówno wewnątrz pomieszczenia jak i na otwartej przestrzeni.