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.
Es werden nur 2 I2C - Adressen unterstützt. Damit kann man leider nur 2 dieser Module pro I2C - Bus verwenden.
Der Chip unterstützt 3 Genauigkeiten, wie weit der A/D Wandler auflöst.
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 | 0x10 | Start measurement at 1lx resolution.Measurement Time is typically 120ms. |
Continuously H-Resolution Mode2 | 0001_0001 | 0x11 | 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." |
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 ist 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...
-
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);
}
Laut Wikipedia https://de.wikipedia.org/wiki/Lux_(Einheit)
(hier nur für die für mich relevanten )
Heller Sonnentag | 100.000 lx |
Bedeckter Sommertag | 20.000 lx |
Im Schatten im Sommer | 10.000 lx |
Bedeckter Wintertag | 3.500 lx |
Büro-/Zimmerbeleuchtung | 500 lx |
Flurbeleuchtung | 100 lx |
Wohnzimmer[6] | 50 lx |
Straßenbeleuchtung | 10 lx |
Kerze ca. 1 Meter entfernt | 1 lx |
Vollmondnacht | 0,25 lx |
Sternklarer Nachthimmel (Neumond) | 0,001 lx |
Bewölkter Nachthimmel ohne Mond und Fremdlichter | 0,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.