Hallo zusammen,
viele von Ihnen haben sich mit Sicherheit schon einmal mit dem Nachbau einer Wetterstation oder DIY-Smart-Home-Geräten beschäftigt. Für diesen Einsatzbereich möchte ich Ihnen heute einen neuen Licht Sensor vorstellen.
Bisher hatten wir nur eine Fotodiode auf einem Breakout-Board sowie die Fotodiode mit LM393 und einstellbarem Schaltkontakt in unserem Portofolio um die Umgebungshelligkeit zu messen, jetzt endlich haben wir einen Licht-Sensor der nicht nur Hell und Dunkel unterscheiden kann sondern auch Werte in Lux ausgibt.
Auf unserem neuen GY-302-Sensor befindet sich ein BH1750 welcher zuverlässig reproduzierbare Werte in Lux ausgibt. Dank dem verwendeten Festspannungsregler ist ein problemloser Betrieb an Raspberrys, ESPs und Arduinos möglich.
Sicher ist dieses Sensor-Modul kein geeichtes Labor-Messgerät, jedoch lässt sich mit diesen Werten einiges mehr Anfangen, als mit den üblichen KY-Sensoren. Bei meinen Tests mit dem Sensor zuhause habe ich festgestellt, dass es mit den ausgegebenen Werten sogar möglich ist, zu unterscheiden welche Lampe in meinem Wohnzimmer leuchtet.
Der Sensor BH1750 ist recht verbreitet und dementsprechend stehen mehrere Librarys zur Verfügung. Sowohl für ESPEasy:
als auch Tasmota:
unterstützen diesen Sensor-Chip.
Da es sich um einen Sensor mit I2C-Schnittstelle handelt sind nur vier Verbindungen erforderlich, für unser heutiges Anwendungsbeispiel nutzen wir einen UNOR3:
Arduino UNO | GY-302 |
GND | GND |
5V | VCC |
A4 | SDA |
A5 | SCL |
Wir haben uns heute gegen die Library aus dem Bibliotheksverwalter der Arduino-IDE entschieden, da Änderungen der Auflösung des Sensors nicht zum gewünschten Ergebniss führten und haben eine praktische Alternative entdeckt:
Hier gehts zur GitHub Bibliothek von Hexenmeister.
Es gibt viele Wege eine Bibliothek aus Git in die IDE zu laden, eine davon haben wir hier gezeigt.
An dieser Library haben uns mehre Dinge sehr gut gefallen, zum einen ist die deutsche Kommentierung der AS_BH1750.h besonders ausführlich und strukturiert, zum anderen liefert der Entwickler ein Beispiel für eine Anwendung mit LCD-Display gleich mit.
Sie können also nach der Installation der Library und dem Funktionstest den Sensors unser LCD-Shield aufstecken und die SCL/SDA Pins wie gewohnt verbinden, fertig ist unser "LightMeter".
Unter Beispiele -> AS_BH1750 -> Light_Meter_LCD finden Sie den Sketch, Änderungen sind nicht erforderlich.
Hier nocheinmal der mitgelieferte Beispielcode:
#include <Wire.h> #include <AS_BH1750.h> #include <LiquidCrystal.h> /* * LightMeter_LCD * * Version 1.2 * Datum: 05.08.2013 * * Das Programm benutzt den BH1750 (Umgebiungslichtsensor) * und zeigt die Werte in Lux auf einem 16x2-Symbol-LCD. * * Verdrahtung (UNO, Nano...) * * BH1750: * Sensor SCL pin an A5 * Sensor SDA pin an A4 * Sensor VDD pin an 5V * Sensor GND pin an GND * Sensor ADDR pin frei * * LCD in 4-Bit-Modus: * LCD RS pin an digital pin 8 * LCD RW pin an digital pin 13 * LCD Enable pin an digital pin 9 * LCD D4 pin an digital pin 4 * LCD D5 pin an digital pin 5 * LCD D6 pin an digital pin 6 * LCD D7 pin an digital pin 7 * * * Copyright (c) 2013 Alexander Schulz. All right reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ AS_BH1750 lightMeter; // Setup LCD-Shield LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { // Display initialisieren lcd.clear(); lcd.begin(16, 2); // 16x2 Zeichen lcd.setCursor(0,0); lcd.print("LightMeter v1.0"); lcd.setCursor(0,1); lcd.print("Initializing..."); delay(1000); lcd.clear(); if(!lightMeter.begin()){ // Prüfen, ob Sensor vorhanden ist lcd.clear(); lcd.setCursor(0,0); lcd.print("BH1750 not found"); lcd.setCursor(0,1); lcd.print("check wiring!"); while (1) { delay(1000); } } } void loop() { char clux[9]; // Werte auslesen und aufbereiten float lux = lightMeter.readLightLevel(); dtostrf(lux, 8, 1, clux); lcd.setCursor(0,0); lcd.print("Light level: "); lcd.setCursor(5,1); lcd.print(clux); lcd.print(" lx"); delay(500); }
Bis zum nächsten Beitrag :)
1 comment
Pohl, Michael
Ich verwende den ESP32. Meine Frage: kann man über die I2C Schnittstelle ohne Probleme die Signale, die etwa 3.3V maximal sein dürfen, allgemein – d. h. auch für andere Sensoren über die I2C Schnittstelle – ohne Gefahr empfangen? Gibt es für den ESP32 entsprechende Libraries?
Mic