Mein Paket… …ein BH1750FVI Lichtintensitätssensormodul GY-30 – Das Luxmeter

Heute kam mein Paket…

mit einem BH1750FVI Lichtintensitätssensormodul GY-30 an. Dieses Modul hatte ich über einen ebay-Shop bestellt.

(BH1750FVI Lichtintensitätssensormodul für 1,50 € inklusive Versand).

BH1750FVI_I2C_Digital_Light_Sensor_Module

Das Modul macht qualitativ einen sehr guten Eindruck. Es ist fertig aufgebaut und enthält von Rohm einen BH1750FVI Umgebungslichtsensor mit I2C-Schnittstelle. Über die bereits eingelötete 5-pol. Stiftleiste im Rastermaß 2,54mm kann es sehr einfach mit einem Arduino Board verbunden werden. Spannungsregler und Pegelwandler sind auch gleich mit an Board, was das Handling mit den 5V Arduinos nochmals etwas vereinfacht.

Die Technischen Daten

Mit diesem Modul kann laut Datenblatt die Beleuchtungsstärke von 0,1lx bis max. etwa 100.000lx (Lux) erfasst werden. Ohne weitere Klimmzüge beträgt die Obergrenze 65.535lx entsprechend dem unsigned int der Arduino IDE. Drei Modi mit unterschiedlicher Auflösung stehen dafür zur Verfügung.

Meßmethode Wandlungszeit Auflösung
H-Resolution Mode 2 Typ. 120ms 0,5lx
H-Resolution Mode Typ. 120ms 1lx
L-Resolution Mode Typ. 120ms 4lx

Im Datenblatt wird empfohlen einen der beiden H-Resolution Modi zu verwenden, da hier die beste Netzfrequenzstörunterdrückung vorliegt.

Die Spektralempfindlichkeit entspricht der des menschlichen Auges. Die Abhängigkeit der Messwerte von der Lichtquelle sind weitgehend zu vernachlässigen. Es spielt daher nur eine untergeordnete Rolle, ob der Sensor mit den verschiedenen künstlichen Lichtquellen oder mit Sonnenlicht bestrahlt wird.

Nachfolgend einige Beispielwerte für Beleuchtungsstärken, die ich bei verschiedenen Quellen gefunden habe:

Dunkle Nacht 0,001lx bis 0,02lx
Mondnacht 0,02lx bis 0,3lx
Drinnen bewölkt 5lx bis 50lx
Draußen bewölkt 50lx bis 500lx
Drinnen sonnig 100lx bis 1000lx
Bürobeleuchtung 500lx

Über den Modul-Pin ADD kann die I2C-Adresse bei Bedarf umgestellt werden. Ohne externe Beschaltung ist die Adresse 0x23 bzw. binär 0100011, bei HIGH-Pegel 0x5C bzw. binär 1011100.

Der Testsketch

Im Internet kursieren diverse vergleichbare Sketche, die aber alle nicht so wirklich eindeutig und nachvollziehbar funktionieren. Eine Fehlerbereinigte und zum Teil erweiterte Version ist nachfolgend zu finden.

/*****************************************************************************************/
/* Luxmeter with BH1750FVI I2C digital ambient light sensor. Measurement in Lux (lx)
* Sensorchip contains a 16-bit AD-Converter and a I2C control
* Depending on the chosen mode range is from 0.1lx to 65,535lx
* in steps of 0.1lx, 1lx or 4lx
*
* Origin Author: Several
*
* Modified by:   Olaf Meier
*
* Hardware connection: Arduino Uno –  BH1750FVI Module
*                                     GND             –  GND
*                                      –                   –  ADD
*                                     A4 / SDA       –  SDA     -> with Leonardo – use separate pin SDA
*                                    A5 / SCL        –  SCL      -> with Leonardo – use separate pin SCL
*                                    5V                   –  Vcc           (alternative 3.3V)
*
* ToDo:
*
*/
/*****************************************************************************************/
/*
* Example of output:
*
*/
/*****************************************************************************************/
/*****************************************************************************************/
/*** Declaration of global constants and initialization of variables. Add includes. ***/
/*****************************************************************************************/
#include <Wire.h> // I2C/TWI for BH1750FVI light sensor
/*** Software release and date ***/
const char* sketchname =  „Luxmeter“;
const char* revision        =  „R.0.1“;
const char* author          =  „Olaf Meier“;
const char* date             =  „2014/05/18“;
/*****************************************************************************************/
/*** Declare constants and variables for the Luxmeter ***/
const unsigned int BAUDRATE = 9600; // Serial monitor baudrate
/*** I2C/TWI-address is depending on logic level at the sensor address pin marked ADD ***/
const byte BH1750FVI_I2CADDRESS = 0x23;  // I2C address (ADD=L=0100011)
//const int BH1750FVI_I2CADDRESS  = 0x5C; // I2C address (ADD=H=1011100)

byte buffer[2];                                                      // Array to store 2 bytes of light value
/*****************************************************************************************/
/*****************************************************************************************/
void setup() {
Wire.begin();
Serial.begin(BAUDRATE);                                 // Initialze serial monitor
while (!Serial) ;                                                   // Wait for the Leonardo serial stream
Serial.println(date);
Serial.print(sketchname);
Serial.print(„\t“);
Serial.println(revision);
Serial.print(author);
Serial.print(„\t“);
Serial.println(date);
Serial.println(date);
/*** Initialize sensor according the chosen resolution mode ***/
BH1750FVIinit(BH1750FVI_I2CADDRESS);
delay(1);                                                             // For safety reason, to settle the mode
} // End of void setup()
/*****************************************************************************************/
/*****************************************************************************************/
void loop() {
unsigned int sensorValue = 0; // Max. sensorValue allowed up to (2^16)-1
if (BH1750read(BH1750FVI_I2CADDRESS) == 2)
{
sensorValue = ((buffer[0] << 8) | buffer[1]);       // Combine 2 bytes
Serial.print(„Beleuchtungsstaerke: „);
Serial.print(sensorValue);
Serial.println(„lx“);
}
delay(500); // 2 measurements per second
} // End of void loop()
/*****************************************************************************************/
/*****************************************************************************************/
/*** Initialize the ambient light sensor BH1750FVI ***/
void BH1750FVIinit(byte I2Caddress)
{
Wire.beginTransmission(I2Caddress);             // I2C address
Wire.write(0x10);                                              // Switch to H-Mode 1Lux resolution 120ms
//Wire.write(0x11);                                            // Switch to H-Mode2 0,5Lux resolution
//Wire.write(0x13);                                            // Switch to L-Mode 4 Lux resolution 16ms
Wire.endTransmission();
}
/*****************************************************************************************/
int BH1750read(int I2Caddress)
{
byte byteNumber = 0;
Wire.beginTransmission(I2Caddress);            // I2C address
Wire.requestFrom(I2Caddress, 2);                  // Request fromm I2Caddress 2 bytes
while(Wire.available())
{
buffer[byteNumber] = Wire.read();                   // Read 2 bytes into array
byteNumber++;
}
Wire.endTransmission();
return byteNumber;
}
/*****************************************************************************************/

Nachfolgend ein Beispiel der Datenausgabe über den seriellen Monitor.

Screenshot 2014-05-18 20.03.01Beim Anschluss des Sensors ist zu beachten, dass die I2C-Anschlüsse SDA und SCL beim Leonardo nicht wie sonst üblich an die Pins A4 und A5 sondern an die separaten Kontakte angeschlossen wird. In der Funktion BH1750FVIinit sind einige Zeilen auskommentiert. Damit kann der gewünschte Mode mit der Auflösung eingestellt werden.

Die technischen Daten in Kurzform
Versorgungsspannung: 5V (oder auch 3,3V funktionierte bei mir)
Controller:                      Rohm BH1750VFI
I2C Takt:                        400kHz
Anschlüsse:                  Stiftleiste 5pol. RM2,54mm
Größe:                           32mm x 15mm

Hier meine Zusammenfassung

Bauteil:                         BH1750VFI Lichtintensitätssensormodul GY-30
Lieferant:                      ebay
Verkäufer:                     accecity-ca
Preis:                           1,50 €
Lieferzeit:                     etwa 4 Wochen
Versandkosten:            inklusive
Sonstiges:                   –
Bewertung:                 bin sehr zufrieden, insbesondere mit dem Preis-/Leistungsverhältnis

Agenda zur Bewertung
*=Ganz Mies **=Mies ***=Akzeptabel ****=Gut *****=Sehr gut
Verkäufer:                             *****
Produkt:                                *****

 
Olaf Meier
Arduino Hannover                http://Arduino-Hannover.de
.                                            http://electronicfreakblog.wordpress.com/

 

 

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.

4 Gedanken zu „Mein Paket… …ein BH1750FVI Lichtintensitätssensormodul GY-30 – Das Luxmeter

  1. Hallo Olaf,

    wenn ich das Datenblatt vom BH1750FVI richtig verstanden habe (vor allem die Beispiele ab S. 7), muss der Rückgabewert vom Sensor noch durch 1,2 geteilt werden, damit das der Beleuchtungsstärke in lx entspricht. Somit wäre die Ausgabe in dem Sketch nicht korrekt.

    Was ich mich allerdings frage ist, wie die bei einer Division durch 1,2 (bei allen Auflösungen) auf eine minimale Auflösung von 0,5 lx und auf einen Maximalwert von 2^16-1 lx = 65535 lx kommen. Nach meiner Rechnung beträgt die minimale, auslesbare Auflösung 1/1,2 [bit/lx] = 0,833 lx und der Maximalwert (2^16-1)/1,2 [bit/lx] = 54612,5 lx.

    Jemand eine Idee?

    Gruß Robert

    • Hallo Robert,
      ist eine gute Frage. Ich habe mich leider schon länger nicht mehr mit dem Sensor beschäftigen können. Ich werde den mal wieder herauskramen. Vielleicht hat in der Zwischenzeit aber doch jemand schon eine Antwort für Dich.

  2. Ja, tatsächlich fehlt die Division durch 1.2 und darüber hinaus eine weitere Division durch 2 wenn der H-Mode2 (0x11) verwendet wird.
    Im übrigen gibt es noch die Möglichkeit die (interne) Messzeit zu verändern was die Genauigkeit weiter beeinflusst aber auch den Maximalwert ändert. Insofern ist der maximal messbare Wert bei der hier benutzten Standardeinstellung (69 laut Datenblatt) tatsächlich 54612,5 lx.
    Darüber hinaus sollte das Ergebnis natürlich float sein, wenn mit größerer Genauigkeit als 1lx gemessen wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.