LUX-Sensor BH1750 (GY-302)
Verfasst: Mi 14. Okt 2015, 14:02
Unter der Bezeichnung GY-302 kann man ein preiswertes Luxmeter (unter 2 Euro inkl. Porto) erwerben. Dieses Modul arbeitet auf der Basis des integrierten Bausteins BH1750FVI. Hierbei handelt es sich um mehr als nur einen empfindlichen Lichtsensor; es kann nämlich direkt die Beleuchtungsstärke in der Einheit Lux angeben. Genauer: Der vom Modul ermittelte Wert muss eigentlich noch durch 1,2 geteilt werden, um den Lux-Wert zu erhalten; das verrät das Datenblatt im Rahmen der Beispielrechnungen auf S. 7. Wir verzichten hier auf diesen Schritt.
Der BH1750 erlaubt nur Versorgungsspannungen bis maximal 3,6 V. Trotzdem kann die Platine direkt über unsere Attiny-Platine versorgt werden; auf dem Modul befindet sich nämlich ein entsprechender Spannungswandler, der unsere 5,0 V auf 3,3 V heruntertransformiert.
Die Kommunikation mit dem BH1750 erfolgt über I2C; die Schreibadresse ist &H46. Bei unserer Attiny-Platine müssen die Jumper für die Pull-Up-Widerstände nicht gesetzt werden; auf dem GY302-Modul sind nämlich diese Widerstände schon eingebaut. Verschiedene Betriebsarten und Auflösungen sind möglich. In unserem Beispielprogramm (s. u.) wählen wir den "Continuously H-Resolution Mode" mit einer Auflösung von 1 lx. Der zugehörige Initialisierungscode ist &B00010000. Die Messzeit beträgt in diesem Fall typischerweise 120 ms.
Wir lassen die Beleuchtungsstärke jede 2 Sekunden messen und geben das Ergebnis über ein LCD aus. Weitere Einzelheiten kann man dem folgenden Programm entnehmen.
Ob der BH1750 tatsächlich die Beleuchtungsstärke korrekt ermittelt? Leider habe ich kein geeichtes Gerät zu Vergleichszwecken zur Verfügung. Aber ich habe überprüft, ob sich die gelieferten Messwerte additiv verhalten: Dazu habe ich von zwei verschiedenen Lichtquellen A und B die Beleuchtungsstärke einzeln und im Verband gemessen. Die Lage der Lichtquellen und des Sensors wurden im Rahmen eines solchen Vergleiches nicht geändert. Hier die Ergebnisse von zwei solcher Vergleiche:
Sie zeigen, dass hier die Additivitätsbedingung mit hoher Genauigkeit erfüllt ist.
.
Der BH1750 erlaubt nur Versorgungsspannungen bis maximal 3,6 V. Trotzdem kann die Platine direkt über unsere Attiny-Platine versorgt werden; auf dem Modul befindet sich nämlich ein entsprechender Spannungswandler, der unsere 5,0 V auf 3,3 V heruntertransformiert.
Die Kommunikation mit dem BH1750 erfolgt über I2C; die Schreibadresse ist &H46. Bei unserer Attiny-Platine müssen die Jumper für die Pull-Up-Widerstände nicht gesetzt werden; auf dem GY302-Modul sind nämlich diese Widerstände schon eingebaut. Verschiedene Betriebsarten und Auflösungen sind möglich. In unserem Beispielprogramm (s. u.) wählen wir den "Continuously H-Resolution Mode" mit einer Auflösung von 1 lx. Der zugehörige Initialisierungscode ist &B00010000. Die Messzeit beträgt in diesem Fall typischerweise 120 ms.
Wir lassen die Beleuchtungsstärke jede 2 Sekunden messen und geben das Ergebnis über ein LCD aus. Weitere Einzelheiten kann man dem folgenden Programm entnehmen.
Code: Alles auswählen
' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Lichtsensor GY302 (BH1750) an I2C
' Ausgabe über LCD
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
'**********************************************************
'******************* Deklarationen ************************
Dim Messung1 As Byte
Dim Messung2 As Byte
Dim Lux As Word
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Port B als Ausgangsport
Ddrd = &B01110000 'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111 'Eingänge auf high legen
Config Lcd = 16 * 2 'LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.6
Cursor Off
Config Sda = Portb.5
Config Scl = Portb.7
I2cinit
'**********************************************************
'******************** Hauptprogramm ***********************
Const Bh1750fvi_w = &H46
Const Bh1750fvi_r = &H47
Wait 1
Do
I2cstart
I2cwbyte Bh1750fvi_w
I2cwbyte &B00100000 'Auflösung 1 Lux
I2cstart
I2cwbyte Bh1750fvi_r
I2crbyte Messung1 , Ack
I2crbyte Messung2 , Nack
I2cstop
Lux = Messung1
Lux = Lux * 256
Lux = Lux + Messung2
Cls
Lcd Lux
Wait 2
Loop
End
Sie zeigen, dass hier die Additivitätsbedingung mit hoher Genauigkeit erfüllt ist.
.