Jak odczytać dane z czujnika I2C w praktyce – krok po kroku na przykładzie BME280

Jak odczytać dane z czujnika I2C w praktyce – krok po kroku na przykładzie BME280
W poprzednich wpisach dowiedziałeś się, czym jest magistrala I2C i jak sprawdzić adres podłączonego urządzenia. Teraz czas przejść do sedna – czyli jak odczytać dane z czujnika I2C w praktyce.
W tym poradniku pokażemy Ci, jak za pomocą ESP32 i popularnego czujnika BME280 odczytać temperaturę, wilgotność i ciśnienie atmosferyczne – i to wszystko za pomocą kilku linijek kodu.
🧰 Czego potrzebujesz?
- Arduino IDE
- ESP32
- Czujnik BME280 (I2C)
- Przewody połączeniowe

🔌 Podłączenie czujnika BME280 do ESP32
BME280 | ESP32 |
VCC | 3,3 V |
GND | GND |
SDA | GPIO 21 |
SCL | GPIO 22 |
🔍 Sprawdź adres I2C czujnika BME280
Jeśli nie masz pewności, jaki adres ma Twój czujnik, użyj wcześniej opisanego I2C Scanner – najczęściej będzie to 0x76
lub 0x77
.
📦 Instalacja biblioteki BME280 w Arduino IDE
- Otwórz Arduino IDE.
- Przejdź do: Szkic > Dołącz bibliotekę > Zarządzaj bibliotekami…
- Wpisz w wyszukiwarce: Adafruit BME280
- Zainstaluj bibliotekę Adafruit BME280 Library
- Automatycznie zostanie też zainstalowana biblioteka Adafruit Sensor

🧪 Kod: odczyt danych z BME280
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define BME280_ADDRESS 0x76 // używamy domyślnego adresu 0x76
Adafruit_BME280 bme;
void setup()
{
Serial.begin(115200);
while (!Serial); // czekamy na połączenie
if (!bme.begin(BME280_ADDRESS)) // jeśli masz inny adres, zmień go w górnej deklaracji
{
Serial.println("Nie znaleziono BME280. Sprawdź połączenia lub adres czujnika");
while (1); // zatrzymaj program
}
}
void loop()
{
Serial.print("Temperatura: ");
Serial.print(bme.readTemperature());
Serial.println(" °C");
Serial.print("Wilgotność: ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.print("Ciśnienie: ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.println("-----------------------");
delay(2000); // odświeżanie co 2 sekundy
}
📈 Co zobaczysz w monitorze portu szeregowego?
Odczyty będą aktualizowane co 2 sekundy. To świetna baza do dalszych projektów: stacji pogodowej, loggera danych, systemu nawadniania itp.

🔍 Jak to wygląda „na sygnałach”? – analiza z użyciem analizatora logicznego
Dla bardziej dociekliwych – poniżej przedstawiamy, jak rzeczywiście wygląda komunikacja z czujnikiem BME280 na poziomie magistrali I2C. Dzięki analizatorowi logicznemu możemy podejrzeć przebiegi na liniach SCL (zegara) i SDA (danych) i zobaczyć, jak ESP32 wymienia dane z czujnikiem.

🌡️ Odczyt temperatury
Na powyższym zrzucie widzimy:
- Zapis do adresu
0x76
– czujnik BME280 - Wskazanie rejestru
0xFA
– zawierającego dane temperatury - Odczyt trzech bajtów:
0x80
,0xB9
,0x90
– to surowa (raw) temperatura - Czujnik potwierdza każdy bajt (
ACK
), a na końcu mamyNAK
– sygnał zakończenia transmisji

💧 Odczyt wilgotności (i ponowny odczyt temperatury)
Co ciekawe, zanim czujnik przekaże dane wilgotności z rejestru 0xFD
, najpierw znowu:
- Wykonuje odczyt temperatury (
0xFA
→0x80
,0xB9
,0x90
) - Dopiero potem odczytuje dane wilgotności (
0xFD
→0x6C
,0xF0
)
🔎 Dlaczego tak?
Dzieje się tak dlatego, że wilgotność w BME280 wymaga tzw. kompensacji temperatury – czyli przeliczenia surowych danych z uwzględnieniem aktualnej temperatury. W bibliotece Adafruit funkcja readHumidity()
automatycznie wywołuje readTemperature()
wewnętrznie.

🌬️ Odczyt ciśnienia
Tutaj również:
- Najpierw wykonuje się odczyt temperatury (
0xFA
) - Następnie ESP32 wskazuje rejestr
0xF7
, a czujnik zwraca dane ciśnienia:0x58
,0x48
,0xD0
Tak jak w przypadku wilgotności – kompensacja ciśnienia również wymaga aktualnej temperatury, dlatego czujnik najpierw ją dostarcza.
🧠 Co z tego wynika?
- Temperatura to baza – bez niej nie da się poprawnie przeliczyć wilgotności ani ciśnienia.
- Dzięki analizatorowi logicznemu możemy potwierdzić, że biblioteka działa poprawnie – odczytuje dane zgodnie z dokumentacją BME280.
- To świetny sposób na debugowanie lub edukacyjne pogłębienie tematu I2C.
📌 Masz wątpliwości, czy czujnik działa poprawnie? Analizator logiczny pokaże Ci prawdę czarno na białym – albo raczej: wysoki na niski stan.
⚙️ Czy da się to zoptymalizować?
Jak pewnie zauważyłeś – zarówno przed odczytem wilgotności, jak i ciśnienia, czujnik ponownie odczytuje temperaturę. Technicznie rzecz biorąc, to nie jest konieczne – raz pobrana temperatura mogłaby zostać wykorzystana do kompensacji obu pozostałych pomiarów.
➡️ Dlaczego więc w przykładzie temperatura jest odczytywana trzy razy?
To efekt działania biblioteki w sposób maksymalnie modułowy i niezależny – funkcja readHumidity()
i readPressure()
nie zakładają, że użytkownik wcześniej wywołał readTemperature()
, dlatego robią to same, by zapewnić poprawność wyników.
📌 W praktycznych, zoptymalizowanych projektach – np. w stacjach pogodowych lub loggerach danych – można spokojnie:
- raz odczytać temperaturę,
- użyć jej do obliczeń wilgotności i ciśnienia,
- oszczędzić czas transmisji i energię.
🤓 Ale na potrzeby tego poradnika…
Zależało nam na czystym, łatwym do zrozumienia kodzie, który pokazuje podstawy:
- jak działa komunikacja I2C,
- jak wygląda sekwencja odczytu danych z czujnika,
- i jak można to przeanalizować za pomocą analizatora logicznego.
🛒 Masz ochotę spróbować?
W naszym sklepie znajdziesz wszystko, czego potrzebujesz do testów:
✅ Analizatory logiczne – do debugowania I2C
✅ Czujnik BME280
✅ Zestawy startowe Arduino
✅ Wyświetlacze OLED do I2C
🔄 Co dalej?
W kolejnym wpisie pokażemy, jak połączyć czujnik I2C i wyświetlacz OLED, by dane pojawiały się bez konieczności używania komputera. To idealny krok w stronę mobilnych projektów i samodzielnych urządzeń pomiarowych.


Prezentowaną w artykule elektronikę znajdziesz oczywiście w naszym sklepie 👉 sklep.msalamon.pl 👈Zapraszamy również na nasze social media, gdzie na bieżąco informujemy o nowych produktach oraz o najciekawszych promocjach 😎👇