LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

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

Więcej informacji na temat zestawu ESP32-DEVKIT-32D przeczytasz w artykule: ESP32-DEVKITC-32D – płytka rozwojowa z modułem Wi-Fi i Bluetooth ESP32

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.

Czujnik BME680, a także moduł z sensorem są dostępne w ofercie Kamami.pl

Do pobrania