sobota, 13 stycznia 2024

BME280 - Sensor temperatury, wilgotności i ciśnienia

 

BME280 (ESP32/ESP2866)


BME280 to prosty w użyciu czujnik temperatury, wilgotności oraz ciśnienia atmosferycznego. Zasilany jest napięciem 3.3V, komunikuje się poprzez interfejs I2C oraz SPI, to precyzyjny sensor bazujący na technologi firmy BOSH. Jest dużo dokładniejszy niż DHT11/DHT22, dokonuje pomiary temperatury w zakresie od -40 °C do + 85 °C z dokładnością ± 1 °C. Zakres pomiarowy wilgotności od 10 do 100 % RH z dokładnością ± 3 % RH, mierzy dodatkowo ciśnienie atmosferyczne od 300 do 1100 hPa z precyzją ± 1 hPa. Ponieważ ciśnienie zmienia się wraz z wysokością, można również oszacować wysokość. Istnieje kilka wersji tego modułu czujnika.

Pokażę Ci, jak podłączyć czujnik do ESP32/ESP2866, zainstalować wymagane biblioteki i napisać prosty szkic wyświetlający odczyty czujnika.

Do poprawnej pracy czujnika potrzebne są dwie biblioteki: Adafruit_BME280 oraz Adafruit_Sensor. Biblioteki możemy pobrać klikając w link i ręcznie przenieść do katalogu Library lub za pomocą narzędzia ArduinoIDE.



INSTALOWANIE BIBLIOTEKI ADAFRUIT BME280



Otwórz Arduino IDE, przejdź do Sketch → Dołącz bibliotekę → Zarządzaj bibliotekami, menadżer bibliotek powinien się otworzyć, wyszukaj: „adafruit bme 280” w polu wyszukiwania i zainstaluj.



Analogicznie postępuje by zainstalować bibliotękę Adafruit Unified Sensor. Jest ona niezbędna do prawidłowej pracy czujnika.



INSTALOWANIE BIBLIOTEKI ADAFRUIT UNIFIED SENSOR


Otwórz Arduino IDE, przejdź do Sketch → Dołącz bibliotekę → Zarządzaj bibliotekami, menadżer bibliotek powienien się otworzyć, wyszukaj: „Adafruit Unified Sensor” w polu wyszukiwania i zainstaluj. Wyświetli się zapewne wiele podobnych bibliotek, z listy wyszukujemy dokładnie tą, która potrzebujemy!



Czujnik ten komunikuje się za pomocą protokołu komunikacyjnego I2C, więc okablowanie jest bardzo proste. Możesz użyć domyślnych pinów I2C dla ESP32 i ESP8266 jak w poniższej tabeli (pobrane biblioteki działają także poprawnie dla Arduino UNO, Arduino Nano oraz Arduino MEGA).



Czujnik BMP280

ESP32

ESP8266

WIN (zasilanie)

3.3 V

3.3 V

GND (masa)

GND

GND

SCL

GPIO_22

GPIO_5 (D1)

SDA

GPIO_21

GPIO_4 (D2)





SCHEMAT PODŁĄCZEŃ dla ESP32



Czujnik BME280 podłączamy 4 przewodami z ESP32:


BME280 VCC z zasilaniem 3.3V w ESP32
BME280 GDN z masą w ESP32
BME280 SDI z GPIO21 (SDA) w ESP32
BME280 SCK z GPIO22 (SCL) w ESP32


Oznaczenia na czujniku BME280 mogą być różne, w zależności od producenta układu, SDI to SDA, SCK to SCL.




S
CHEMAT PODŁĄCZEŃ dla ESP2866



Czujnik BME280 podłączamy 4 przewodami z ESP2866:

BME280 VCC z zasilaniem 3.3V w ESP2866
BME280 GDN z masą w ESP2866
BME280 SDI z D2 (GPIO4 SCA) w ESP2866
BME280 SCK z D1 (GPIO5 SCL) w ESP2866


Oznaczenia na czujniku BME280 mogą być różne, w zależnośni od producenta układu, SDI to SDA, SCK to SCL. Poniżej znajduje się szkic programu dla ArduinoIDE, wykorzystujący czujnik do odczytu temperatury, wilgotności, oraz ciśnienia na postawie którego szacowana jest wysokość położenia nad poziomem morza. Nie jest to wartość dokładna, może odbiegać od rzeczywistego położenia.


// █████████████████████████████████████████████████████
//
// ESP32/ESP8266 BlackBook by PowerTGS (2024)
//
// author : Tomasz Majcher 
// e-mail : powerTGS440@gmail.com
// phone  : +48 668 082121
//
// █████████████████████████████████████████████████████
//
// BME280 demo file
//
// source file      : sourcce/sensor/bme280/bme280.ino
// device           : esp32/esp2866/arduino uno/arduino nano/arduono mega
// code platform    : ArduinoIDE
// 
// █████████████████████████████████████████████████████
// M A K R O
// █████████████████████████████████████████████████████
                                    
#define SEALEVELPRESSURE_HPA  (1013.25)
#define SERIAL        true                         // SERIAL włączony
#define SERIAL_SPEED  115200                       // prędkość SERIAL
#define LOOP_DELAY    10000                        // opóźnienie pętli LOOP 

// █████████████████████████████████████████████████████
// B I B L I O T E K I
// █████████████████████████████████████████████████████                                                                                                                                                                                                                                          

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// █████████████████████████████████████████████████████
// O B I E K T   K L A S Y   B M E 2 8 0
// █████████████████████████████████████████████████████

Adafruit_BME280 bme; 

// █████████████████████████████████████████████████████
// Z M I E N N E   G L O B A L N E
// █████████████████████████████████████████████████████

float   temperatura = 0;
float   cisnienie = 0;
float   wilgotnosc = 0;
float   wysokosc = 0;

// █████████████████████████████████████████████████████
// D E K L A R A C J E   F U N K C J I
// █████████████████████████████████████████████████████

void Read_BME_280_Sensor (float &temp, float &hum, float &humi, float &alti);
void Show_BME_280_Sensor (float &temp, float &pres, float &humi, float &alti);

// █████████████████████████████████████████████████████
// S E T U P
// █████████████████████████████████████████████████████

void setup() 
{
  #if SERIAL
      Serial.begin(115200);
      Serial.println();Serial.println();
  #endif
  
  bool status = bme.begin(0x76);      // inicjalizacja czujnika BME230, jeśli podłączenie
                                      // jest poprawne zwróci wartość TRUE, w przeciwnym
                                      // wartość FALSE
  
  if (!status) 
  {     
      #if SERIAL
          Serial.println(F("Nie można odnaleźć czujnika BME280"));
          Serial.println(F("Sprawdź podłączenia do urządzenia!"));
      #endif
      
      while (1);
  }
  else
  {
      #if SERIAL
          Serial.println(F("Pomyślnie zainicjalizowano czujnik BME280"));          
      #endif
  }  
}

// █████████████████████████████████████████████████████
// L O O P
// █████████████████████████████████████████████████████

void loop() 
    Read_BME_280_Sensor(temperatura, cisnienie, wilgotnosc, wysokosc);
    Show_BME_280_Sensor(temperatura, cisnienie, wilgotnosc, wysokosc);
  
    delay(LOOP_DELAY);
}

// █████████████████████████████████████████████████████
// R E A D   B M E   2 8 0   S E N S O R
// █████████████████████████████████████████████████████
// funkcja odczytuje wartości z czujnika BME_280
// zwraca wartości temperatury, cisnienia, wilgotnosci, wysokosci
// na wejsciu otrzymuje adresy zmiennych globalnych
// █████████████████████████████████████████████████████

void Read_BME_280_Sensor (float &temp, float &pres, float &humi, float &alti)
{
    #if SERIAL
        Serial.println(F("[BME280_Sensor] Odczytuje wartosci z czujnika "));
    #endif
    
    temp = bme.readTemperature();
    pres = bme.readPressure() / 100.0F;
    humi = bme.readHumidity();
    alti = bme.readAltitude(SEALEVELPRESSURE_HPA);    
}

// █████████████████████████████████████████████████████
// S H O W   B M E   2 8 0   S E N S O R
// █████████████████████████████████████████████████████
// Funkcja wypisuje wartości z czujnika BME_280, na wejsciu otrzymuje adresy zmiennych 
// globalnych. 
// wartości są wyświetlane jeśli makro SERIAL jest true, w przypadku ustawienia false
// cała zawartość pomiędzy #if SERIAL ... #endif jest pomijana przy kompilacji szkicu
// i nie istnieje w pliku binarnym. To jeden ze sposobów na optymalizację kodu oraz
// oszczędność pamięci RAM I PROGMEM
// █████████████████████████████████████████████████████

void Show_BME_280_Sensor (float &temp, float &pres, float &humi, float &alti)
{
    #if SERIAL
        Serial.print(F("[BME280_Sensor] Temperatura = "));
        Serial.print(temp);
        Serial.println(F(" *C"));  
        Serial.print(F("[BME280_Sensor] Cisnienie = "));
        Serial.print(pres);
        Serial.println(F(" hPa"));
        Serial.print(F("[BME280_Sensor] Średnia wysokość = "));
        Serial.print(alti);
        Serial.println(F(" m"));
        Serial.print(F("[BME280_Sensor] Wilgotność = "));
        Serial.print(humi);
        Serial.println(F(" %"));
        Serial.println();    
    #endif
}

// █████████████████████████████████████████████████████
// END OF FILE : src/sensor/bme280.ino
// █████████████████████████████████████████████████████

BME280 - Sensor temperatury, wilgotności i ciśnienia

  BME280 (ESP32/ESP2866) BME280 to prosty w użyciu czujnik temperatury, wilgotności oraz ciśnienia atmosferycznego. Zasilany jest napię...