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.
SCHEMAT
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
// █████████████████████████████████████████████████████