|

Jak odczytać dane z czujnika natężenia światła BH1750 – krok po kroku

Jak odczytać dane z czujnika natężenia światła BH1750 – krok po kroku

BH1750 to popularny cyfrowy czujnik natężenia światła, który pozwala mierzyć jasność otoczenia w jednostkach luks (lx). Ten niewielki układ ma jedno zadanie, pomiar natężenia otaczającego go światła. Zakres pomiarowy czujnika wynosi od około 1 lx do 65 535 lx, dzięki czemu sprawdzi się zarówno przy bardzo słabym oświetleniu, jak i przy silnym świetle dziennym. BH1750 komunikuje się z mikrokontrolerem za pomocą magistrali I2C, co upraszcza jego podłączenie wykorzystuje zaledwie dwie linie danych. Sensor ten cechuje się również bardzo niskim poborem prądu około 120 µA oraz możliwością zasilania napięciem 3–5 V, dzięki czemu jest kompatybilny zarówno z Arduino 5 V, jak i z układami 3,3 V, takimi jak ESP32.

W niniejszym poradniku krok po kroku podłączymy czujnik BH1750 do płytki ESP32 i odczytamy z niego bieżący poziom oświetlenia. Wyjaśnimy krótko, jak działa ten czujnik co mierzy i w jaki sposób, pokażemy schemat podłączenia oraz sposób konfiguracji Arduino IDE. Następnie przedstawimy przykładowy kod Arduino, który odczytuje dane z BH1750, a na koniec zobaczymy wyniki pomiarów w monitorze portu szeregowego. Zaczynajmy!

Jak działa czujnik BH1750?

BH1750 to czujnik natężenia oświetlenia, wyposażony we wbudowaną fotodiodę oraz przetwornik analogowo-cyfrowy. Fotodioda generuje prąd elektryczny proporcjonalny do padającego na nią światła, a układ BH1750 przelicza ten sygnał na 16-bitową wartość cyfrową odpowiadającą natężeniu światła. Wynik jest podawany w luksach 1 lx odpowiada natężeniu światła, przy którym strumień świetlny 1 lumena oświetla powierzchnię 1 m². Co ważne, charakterystyka spektralna czujnika została dobrana tak, aby jego czułość była zbliżona do czułości ludzkiego oka zakres światła widzialnego. Dzięki temu pomiar luksów z BH1750 dobrze oddaje faktycznie odczuwaną jasność otoczenia.

Czujnik BH1750 przesyła dane za pomocą interfejsu I2C, więc komunikacja z mikrokontrolerem odbywa się przez linię danych SDA oraz linię zegara SCL. Adres I2C czujnika może być konfigurowany poprzez stan logiczny na pinie ADDR modułu. Jeśli pin ADDR jest pozostawiony niepodłączony lub podłączony do masy (stan niski), czujnik odpowiada pod adresem 0x23 (domyślnie). Natomiast podłączenie ADDR do VCC (stan wysoki) ustawia adres 0x5C.

BH1750 oferuje kilka trybów pomiarowych, które różnią się rozdzielczością i czasem pomiaru. Najczęściej wykorzystuje się ciągły tryb wysokiej rozdzielczości, który zapewnia rozdzielczość około 1 lx przy typowym czasie pomiaru ~120 ms. Istnieje też tryb ciągły niskiej rozdzielczości mniej dokładny bo rozdzielczość to ok. 4 lx, ale za to szybszy pomiar trwa tylko ~16 ms. Dla jeszcze większej czułości dostępny jest tryb High Resolution Mode 2, który dzięki dłuższemu czasowi integracji pozwala wykryć zmiany rzędu 0,5 lx. Poza trybami ciągłymi, BH1750 umożliwia także tryby jednorazowego pomiaru One-Time, w których dokonuje pojedynczego pomiaru i przechodzi w stan uśpienia. Jest to przydatne, gdy chcemy oszczędzać energię możemy wybudzać czujnik tylko na czas pomiaru co pewien interwał. Szczegółowy wybór trybu odbywa się poprzez wysłanie odpowiedniej komendy I2C do czujnika, ale na szczęście dostępne biblioteki Arduino upraszczają to, oferując gotowe funkcje konfigurujące tryb pracy.

Podsumowując, BH1750 mierzy natężenie oświetlenia za pomocą fotodiody i wewnętrznego przetwornika, a następnie udostępnia wynik przez magistralę I2C. Dzięki różnym trybom pomiarowym możemy dobrać kompromis między dokładnością a szybkością pomiaru, a niski pobór mocy czujnika umożliwia jego wykorzystanie w projektach zasilanych bateryjnie. Skoro wiemy już, co potrafi ten układ, przejdźmy do części praktycznej jego podłączenia i użycia z mikrokontrolerem ESP32.

Czego potrzebujesz?

Aby wykonać opisany przykład, przygotuj następujące elementy:

  • Płytka ESP32 – np. ESP32 DevKit WROOM-32 lub inna kompatybilna.
  • Czujnik natężenia oświetlenia BH1750 – najlepiej w formie modułu z układem BH1750.
  • Przewody połączeniowe – do podłączenia czujnika z ESP32.
  • Arduino IDE – środowisko programistyczne do wgrania kodu na ESP32.
  • Płytka stykowa – ułatwi połączenie, jeśli nie chcemy lutować przewodów bezpośrednio.

Podłączenie czujnika BH1750 do ESP32

Fizyczne podłączenie BH1750 do ESP32 jest bardzo proste, ponieważ wykorzystuje on interfejs I2C. Poniżej zestawiono odpowiednie wyprowadzenia modułu BH1750 oraz piny ESP32:

BH1750ESP32
VCC3,3 V
GNDGND (masa)
SDAGPIO 21
SCLGPIO 22


Jak widać, zasilamy moduł BH1750 napięciem 3,3 V, łączymy piny GND do masy, a linie SDA i SCL podłączamy do domyślnych pinów I2C w ESP32 odpowiednio GPIO 21 oraz GPIO 22. Większość modułów BH1750 posiada już wbudowane rezystory podciągające na liniach SDA i SCL, więc nie musimy dodawać ich osobno wystarczy bezpośrednie połączenie przewodami.

Jeśli Twój moduł BH1750 posiada wyprowadzenie ADDR, zostaw je niepodłączone adres czujnika pozostanie wówczas domyślny 0x23 lub opcjonalnie podłącz do 3,3 V, jeśli chcesz ustawić adres 0x5C. Schemat połączeń ilustruje, jak należy wszystko podłączyć w praktyce czujnik BH1750 do pinów ESP32.

Sprawdź adres I2C czujnika BH1750

Standardowo, większość modułów BH1750 działa pod adresem 0x23, jednak warto mieć na uwadze możliwość innego adresu 0x5C przy podłączeniu ADDR do VCC. Jeśli nie jesteś pewien adresu lub czujnik nie reaguje na adres 0x23, możesz skorzystać z prostego skanera I2C, aby sprawdzić, pod jakim adresem urządzenie jest widoczne na magistrali. Taki skaner to krótki program, który przeszukuje wszystkie adresy I2C i wypisuje znalezione urządzenia. Najczęściej jednak BH1750 będzie odpowiadał pod 0x23, zgodnie z opisem powyżej. Gdyby okazało się, że Twój egzemplarz wykorzystuje adres 0x5C pamiętaj, że większość bibliotek umożliwia zmianę adresu w kodzie np. przekazując wartość adresu do funkcji begin czujnika. W naszym przykładzie będziemy zakładać domyślny adres 0x23.

Instalacja biblioteki BH1750 w Arduino IDE

Aby ułatwić obsługę czujnika w kodzie, skorzystamy z gotowej biblioteki Arduino obsługującej BH1750. Najpopularniejsza jest biblioteka BH1750 autorstwa Christophera Lawsa wspiera ona platformy Arduino, ESP32, ESP8266 itp. Poniżej instrukcja instalacji tej biblioteki w Arduino IDE:

  1. Otwórz Arduino IDE na swoim komputerze. Upewnij się, że masz zainstalowane wsparcie dla ESP32 (pakiet płytek ESP32 w Menedżerze Płytek).
  2. Przejdź do menu Szkic > Dołącz bibliotekę > Zarządzaj bibliotekami… – otworzy się Menedżer Bibliotek.
  3. W polu wyszukiwania (prawy górny róg) wpisz “BH1750” i poczekaj na wyświetlenie wyników.
  4. Na liście wyników znajdź bibliotekę o nazwie “BH1750” powinna być dobrze widoczna. Kliknij “Install”, aby ją zainstalować.
  5. Po chwili biblioteka zostanie pobrana i zainstalowana. (Jeśli pojawi się pytanie o doinstalowanie zależnych bibliotek potwierdź instalację.)

Kod: odczyt danych z BH1750 na ESP32

Gdy mamy już zainstalowaną bibliotekę, możemy napisać prosty program odczytujący wartości oświetlenia z czujnika BH1750 podłączonego do ESP32. Program korzysta z obiektu udostępnianego przez bibliotekę (klasa BH1750) do komunikacji z czujnikiem. Pełny kod programu znajdziesz do pobrania poniżej: 👇


Kilka słów wyjaśnienia do powyższego kodu: na początku dołączamy biblioteki Wire.h obsługa I2C oraz BH1750.h. Tworzymy obiekt lightMeter klasy BH1750, reprezentujący nasz czujnik. W funkcji setup() inicjujemy komunikację szeregową Serial z prędkością 115200 bodów oraz magistralę I2C za pomocą Wire.begin(21, 22). Ta funkcja ustawia numery pinów, gdzie podłączone są linie SDA i SCL tutaj używamy domyślnych pinów ESP32: GPIO21 i GPIO22. Następnie wywołujemy lightMeter.begin(...), przekazując parametr BH1750::CONTINUOUS_HIGH_RES_MODE, co ustawia czujnik w ciągły tryb wysokiej rozdzielczości. Funkcja begin() zwraca wartość logiczną true/false – w razie niepowodzenia np. czujnik nie został wykryty pod domyślnym adresem wypisujemy komunikat błędu i zatrzymujemy program. Jeśli inicjalizacja przebiegła pomyślnie, wchodzimy do pętli loop(), gdzie w każdej iteracji odczytujemy aktualny poziom oświetlenia za pomocą lightMeter.readLightLevel(). Wynik zmienna lux typu float to natężenie światła w luksach. Wypisujemy go na port szeregowy, formatując komunikat: “Natężenie światła: X lx”, po czym czekamy 1 sekundę przed kolejnym pomiarem opóźnienie delay(1000). Dzięki temu otrzymujemy aktualizację odczytu co około jedną sekundę.

Co zobaczysz w monitorze portu szeregowego?

Po wgraniu powyższego programu na ESP32 nie zapomnij wybrać właściwej płytki i portu COM w Arduino IDE możemy podejrzeć rezultaty działania czujnika w Monitorze portu szeregowego. Ustaw prędkość portu na 115200 taką samą, jak w Serial.begin(), a następnie obserwuj wypisywane komunikaty. Powinieneś zobaczyć ciąg aktualizowanych co sekundę wartości natężenia światła. Przykładowy fragment takich odczytów prezentuje zrzut ekranu:

Przykładowe wyniki pomiaru natężenia światła wyświetlone w Monitorze portu szeregowego. Widzimy tu komunikaty zawierające zmierzoną wartość w luksach (oznaczoną jako “lx”). W tym przypadku czujnik rejestrował zmiany oświetlenia w otoczeniu 44.17 lx, 82.50 lx etc. Takie różnice mogły wynikać z zasłaniania czujnika ręką, oświetlania go latarką lub innych zmian w warunkach oświetleniowych. Odczyty są odświeżane co sekundę, ale oczywiście częstotliwość tę można dostosować w kodzie zmieniając wartość w funkcji delay(). Jeśli wszystko zostało podłączone i skonfigurowane poprawnie, dane z BH1750 będą płynnie spływać do monitora portu szeregowego, a Ty możesz eksperymentować ze zmianą oświetlenia i obserwować reakcję czujnika.

Podsumowanie

Mamy nadzieję, że ten krok-po-kroku przewodnik pomógł Ci zrozumieć, jak odczytać dane z czujnika BH1750 i zainspirował do własnych eksperymentów. 😊 Dzięki prostocie obsługi I2C i gotowym bibliotekom, BH1750 to doskonały czujnik dla początkujących, a jednocześnie na tyle precyzyjny i uniwersalny, że znajdzie zastosowanie w zaawansowanych projektach. Powodzenia w realizacji własnych pomysłów! Jeśli masz pytania lub napotkasz trudności nie wahaj się szukać pomocy na forach lub w dokumentacji. Przy odpowiednim podłączeniu i kodzie, odczyt natężenia światła stanie się tak prosty jak odczyt temperatury czy innych podstawowych wielkości. Miłej zabawy z elektroniką!

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 *