Miernik natężenia mierzy w jednostkach LUX poziom światła. Pomiary wysyła za pomocą I2C do RPi

Miernik ten wykorzystywany jest m. in. w urządzeniach sterujących jasnością wyświetlacza w zależności od światła w otoczeniu.
Dobry manual znajdziecie na stronie:
https://www.raspberry-pi-geek.com/Archive/2017/22/The-BH1750-Digital-Light-Sensor

Przewody I2C

Podłączamy I2C więc 3,3V-VCC, GND-GND, SDA-SDA, SCL -SCL, ostatnia linia ADDR służy do zmiany adresu I2C jeśli jest konflikt z innym urządzeniem. Adres naszego urządzenia to domyślnie 0x23. Po przyłożeniu 3,3V do linii ADDR adres zmienia się na 0x5c.

Podłączamy wszystko, teraz konfiguracja przez

1
sudo i2cdetect -y 1

sprawdzamy, czy mamy połączenie, na pozycji 20 – 3 powinna pojawić się liczba 23.

C++

Kod programu z powyższej strony zadziała.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <wiringPiI2C.h>
#include <stdio.h>
#define BH1750ADDR 0x23

int main (void) {
   int handle = wiringPiI2CSetup(BH1750ADDR) ; //Numer pinu (jeśli podłączymy ADDR do 3,3V trzeba zmienić na 0x5c)
   wiringPiI2CWrite(handle,0x10);
   sleep(1);
   int word=wiringPiI2CReadReg16(handle,0x00); //odczyt
   int lux=((word & 0xff00)>>8) | ((word & 0x00ff)<<8); //notacja odwrotna, zmieniamy bajty
   printf("Natężenie światła w jednostkach LUX:%d \n",lux); //wynik w jednostkach LUX
   return 0;
 }

Porównanie ze zwykłym czujnikiem światła (0/1)

Plusy – progresywny pomiar (jasno, ciemno, mrok, bardzo jasno itp.)
Minusy – brak obsługi za pomocą przerwania. Aby zauważyć „włączenie światła” trzeba ciągle mierzyć LUX, na przerwaniu program o to nie dba, a w momencie np. zgaszenia wywoła się przerwanie w tle.
Inne więc jest zastosowanie.