I2C Lichtsensor GY-30 / BH1750FVI

Hardware

Beschreibung

Das GY-30 Modul ist ein Lichtsensor ausgelegt für Umgebungslicht mit Analog/Digital-Converter, den man via I2C auslesen kann. Verbaut wurde auf dem Modul der Chip BH1750FVI (Datenblatt)

Die Steckbrücke wird separat beigelegt und muss bei Bedarf selbst aufgelötet werden.

Der Sensor liegt ungünstig direkt mitten auf der Leiterplatte, damit wird ein Einbau in Schachteln/Dosen etwas schwierig.

Trotzdem ist er besser als binäre Breakout-Module. Er kann Lichtstärken zwischen 0,1-100.000 Lux messen. Während das STM32-Breakout-Modul eigentlich nur zwischen ganz hell und weniger hell (=aus) unterscheiden kann, reagierte das GY-30-Modul auf eine 4 Meter entfernter Nachttischlampe beim Messen. Gerade um nachts zu prüfen, ob jemand vergessen hat eine Lampe auszuschalten ist das die bessere Wahl.

Ich fand Preise zwischen 1,66 Euro bei Ebay (aus China/Hongkong mit entsprechender Lieferzeit ohne Versand) und 9,05 + Versand in Deutschland lagernd. Für 1,66 Euro kann man nichts verkehrt machen.

Programmierung

Adressierung

Es werden nur 2 I2C - Adressen unterstützt. Damit kann man leider nur 2 dieser Module pro I2C - Bus verwenden.

Allgemein

Der Chip unterstützt 3 Genauigkeiten, wie weit der A/D Wandler auflöst.

Diese können in verschiedenen Modi verwendet werden.

OP-Codes

Code Binär Hex Beschreibung
Power Down 0000_0000 0x00 No active state.
Power On 0000_0001 0x01 Waiting for measurement command.
Reset 0000_0111 0x07 Reset Data register value. Reset command is not acceptable in Power Down mode.
Continuously H-Resolution Mode 0001_0000 0x11 Start measurement at 1lx resolution.Measurement Time is typically 120ms.
Continuously H-Resolution Mode2 0001_0001 0x10 Start measurement at 0.5lx resolution. Measurement Time is typically 120ms.
Continuously L-Resolution Mode 0001_0011 0x13 Start measurement at 4lx resolution.Measurement Time is typically 16ms.
One Time H-Resolution Mode 0010_0000 0x20 Start measurement at 1lx resolution. Measurement Time is typically 120ms. It is automatically set to Power Down mode after measurement.
One Time H-Resolution Mode2 0010_0001 0x21 Start measurement at 0.5lx resolution.Measurement Time is typically 120ms.It is automatically set to Power Down mode after measurement.
One Time L-Resolution Mode 0010_0011 0x23 Start measurement at 4lx resolution. Measurement Time is typically 16ms. It is automatically set to Power Down mode after measurement.
Change Measurement time ( High bit )01000_MT[7,6,5]Change measurement time. ※ Please refer "adjust measurement result for influence of optical window."
Change Masurement time ( Low bit )011_MT[4,3,2,1,0]Change measurement time.※ Please refer "adjust measurement result for influence of optical window."

Testen mit I2C Tools

Bei mir habe ich es auf dem Banana-Pi getestet. Die I2C Pin-Belegung ist identisch mit den Raspberry Pi. Also SDA (Banana-Pi Pin3) und SCL (Banana-Pi Pin5) jeweils an den SDA und SCL vom Sensor. Noch die 5 V Stromversorgung und Massen vom Banana-Pi an den Sensor anschließen. Das wars. Teststellung fertig.

Siehe da, 0x23... erst da
Nun setze ich ihn auf eine Genauigkeit von 1 Lux (H-Resolution Mode) in den Continuously Modus. Sprich danach kann ich dauerhaft die Werte lesen. In der Kommandozeile sind Pausen, die der Chip zum Messen bräuchte nicht zu berücksichtigen. So schnell kann keiner tippen ;-) .

und schon kann das auslesen losgehen...

Script in Perl

Perl ist die Wunschsprache um später ein Fhem-Modul bauen zu können. Glücklicherweise unterstützt der Sensor das SMBus Protokoll und ist damit einfach unter Perl umzusetzen. Das Modul Device::SMBus wird bereits mit ausgeliefert und muss nicht nachinstalliert werden (zumindest bei mir).

#!/usr/local/bin/perl -w

package main;

use strict;
use warnings;
use Time::HiRes qw(usleep);

use Device::SMBus;

my $dev = Device::SMBus->new(
  I2CBusDevicePath => '/dev/i2c-2',
  I2CDeviceAddress => 0x23,
);

$dev->writeByte(0x11);
usleep(200000);

my $i = 0;
while($i < 100000000) 
{
	
	my $r =  $dev->readWordData(0x11);
	my $low_byte = $r & 0xff;
	my $high_byte = ($r & 0xff00) >> 8;
	
	my $wertlux = ($high_byte + $low_byte * 256) /2;
	print " Lux $wertlux\n";
	
	$i += 2;
	usleep(200000);

}

Hinweise

Lichtstärke

Laut Wikipedia https://de.wikipedia.org/wiki/Lux_(Einheit)
(hier nur für die für mich relevanten )

Heller Sonnentag100.000 lx
Bedeckter Sommertag20.000 lx
Im Schatten im Sommer10.000 lx
Bedeckter Wintertag3.500 lx
Büro-/Zimmerbeleuchtung500 lx
Flurbeleuchtung100 lx
Wohnzimmer[6]50 lx
Straßenbeleuchtung10 lx
Kerze ca. 1 Meter entfernt1 lx
Vollmondnacht0,25 lx
Sternklarer Nachthimmel (Neumond)0,001 lx
Bewölkter Nachthimmel ohne Mond und Fremdlichter0,00013 lx

Die Werte passen auch in etwa zu meinen gemessenen. Bei fast Dunkelheit (entfernte Straßenlampe draußen) bekomme ich 0,1 Lux in der hintersten Zimmerecke angezeigt. Bei bei eingeschalteter Nachttischlampe ca. 1 Lux . Damit kann ich den Sensor so schalten, dass auch einen vergessene Nachttischlampe im Haus bemerkt.

Artikel von Karsten Grüttner, letzte Änderung 6.10.2015