
Ein Luxmeter
von Günther Zöppel
Um die Helligkeit verschiedener leuchtender Objekte zu ermitteln, habe
ich ein Luxmeter gebaut. Es verwendet das sehr preiswert erhältliche
Modul GY-30 zur Lichtmessung, welches mit dem Sensor BH1750 bestückt
ist. Zur Anzeige gelangt der ermittelte Lux-Wert per Display SSD1306
(gelb/blau). Display und Sensor sind an einen ESP8266 D1 mini
über den I2C-Bus angeschlossen. Da beide Module mit Pullup-Widerständen
bereits von Haus aus versehen sind, braucht man sich um die
Konfiguration des I2C-Interfaces keine weiteren Gedanken zu machen.
Dazu habe ich einen Sketch geschrieben, der über USB und mittels der
ArduinoIDE 1.8.19 auf den ESP8266 geflasht werden kann. Die Bibliothek
BH1750 ist vorher (neben den anderen im Sketch nötigen, aber bereits
installierten Bibliotheken) mittels Bibliotheksverwalter
einzubinden.
Der Sketch startet nach dem Hochladen sofort und zeigt mir den Lux-Wert
einer auf den Sensor gerichteten Lichtquelle an. Je näher die
Lichtquelle am Sensor ist, umso höher wird der angezeigte Wert. Dies
ist auch eichfähig - und ein Beitrag zum Umweltschutz, um zu
starke und blendende Lichtquellen zu identifizieren. Die spektrale
Empfindlichkeit geht aus dem Datenblatt des BH1750 hervor und hat bei
560 nm ein Maximum, dort wo auch das menschliche Auge am
empfindlichsten ist. Daher kann der Sensor gesundheitsdienliche Daten
liefern. Für Infrarot oder Ultraviolett ist dieser Sensor nicht
empfindlich. Um auch diese Strahlung nachzuweisen, müssten andere
Sensoren eingesetzt werden.
//Luxmeter
//Trotz Farbwahl WHITE setzt Display gelb oder blau harwaredefiniert
#include <Wire.h>
#include <BH1750.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Display-Auflösung
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// SSD1306 I2C-Adresse (meist 0x3C oder 0x3D)
#define OLED_ADDR 0x3C
// Displayobjekt
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// BH1750-Objekt
BH1750 lightMeter;
void setup() {
Serial.begin(115200);
delay(100);
Serial.println();
Serial.println("GY-30 (BH1750) + SSD1306 Test");
// I2C starten (SDA, SCL)
Wire.begin(D2, D1);
// Display initialisieren
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("Fehler: SSD1306 nicht gefunden!"));
while (true);
}
// BH1750 initialisieren
if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) {
Serial.println("BH1750 gestartet.");
} else {
Serial.println("Fehler: Kein BH1750 gefunden!");
while (true);
}
// Startanzeige
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.println(F("BH1750 Lichtsensor"));
display.display();
delay(2000);
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print("Helligkeit: ");
Serial.print(lux);
Serial.println(" lx");
// Anzeige auf dem OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 5);
display.println(F("Lichtstaerke:"));
display.setTextSize(2);
display.setCursor(10, 30);
display.print(lux, 1);
display.println(F(" lx"));
display.display();
delay(1000);
}