|

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

BME280ESP32
VCC3,3 V
GNDGND
SDAGPIO 21
SCLGPIO 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 mamy NAK – 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 (0xFA0x80, 0xB9, 0x90)
  • Dopiero potem odczytuje dane wilgotności (0xFD0x6C, 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 😎👇


Podobne wpisy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *