Ich hab mal ein bisschen herumprobiert.
Der Standard BH1750 wird verwendet, an einem Nano-kompatiblen Board (alter Bootloader).
Als Bibliothek habe ich die OneTime-BH1750 von JVKran verwendet welche etwas sparsamer ist , sowohl beim Speicher wie auch beim Strom.
Anstelle des readLightLevel wie in der Standard BH1750-Bibliothek, muss getLightIntensity verwendet werden, falls man die Bibliothek nicht ändern möchte.
Der Sensor BH1750 ist weit verbreitet und eignet sich gut als Beispiel. Auch für andere Sensoren gibt es alternative Bibliotheken die ein erweitertes Stromsparen ermöglichen.
Auch das einsparen von Speicherplatz ist spätestens beim Einsatz vieler weiterer Sensoren keine schlechte Idee.
Ein Blick in die Referenz einer Bibliothek gibt einen Überblick auf die möglichen Einstellungen und alle Eigenschaften.
Die Möglichkeiten sind also auch auf viele andere Sensoren anwendbar. Dies ist ein Beispiel wie es mit einem BH1750 lösbar ist.
Da mir das einfache auslesen und anzeigen nicht reichte habe ich das so geändert das der Wert nur gemessen und angezeigt wird wenn ich eine Taste drücke, hier die Taste "Right".
Es kann eine andere Taste genutzt werden wenn diese entsprechend zugewiesen wird im Codebereich buttonState == Tasterrechts.
Dies ist eine Live-Messung mit permanent aktualisiertem Wert. Um etwas Strom zu sparen wird alle 0,2 Sekunden gemessen. Dies lässt sich leicht ändern im Codebereich delay(200).
Es kann auch Sinn machen den Wert höher einzustellen wenn nur eine gelegentliche Messung gewünscht ist und keine Live-Verfolgung zum finden der grössten Helligkeit nötig ist. Dies spart dann erneut etwas Strom.
Eine Aktualisierungsrate von 0,2 Sekunden ist fast wie Live und ermöglicht immer noch z.b. die Richtung zu bestimmen in der die grösste Helligkeit ist.
Zusätzlich wird der zuletzt gemessene Wert in eine Variable geschrieben so das er nach dem loslassen der Taste weiterhin angezeigt wird. So hat man z.b. Zeit um meinetwegen den Wert nacher aufzuschreiben, oder whatever.
So lässt sich das Gerät, (wenn z.b. der Sensor fix verbaut ist) einfach in Richtung einer Lichtquelle halten ohne das man sich den Hals verrenkt um auf das Display zu schauen.
Der Wert kann anschliessend abgelesen werden wenn man das Gerät wieder von der Lichtquelle entfernt.
Bei erneutem drücken der Taste wird der letzte Wert wieder gelöscht und wieder neu gemessen.
Zwischen den Messungen, wenn die Taste nicht gedrückt ist, fällt der BH1750 in den PowerDown-Modus in dem er unter 0,1 Mikroampere Strom benötigt.
Persönliche Anmerkungen:
Da ich ja das Steckboard nicht so sehr mag, hab ich nach einer passenden Unterlage gesucht. Als ich zuerst die Silikon Lötmatte probierte war ich nicht sooo zufrieden.
Gelandet bin ich dann bei einem leichten Frühstücksbrett das einen passenden Aufdruck hat (Dank an meine Schwester die mir das mal schenkte).
Fixiert habe ich das ganze mit ein paar Klümpchen Wachsknetmasse. Die nehme ich sonst auch um feine Teile auf der Messplatte zu drappieren und mit dem Faro-Arm taktil zu messen. Ist total praktisch.
Bissle Bildmaterial
Dieser Code ist aktuell verwendet:
(Github Release Arduino_BH1750 · Cftok-Main/Arduino · GitHub):
// Programm für die OneTime-BH1750 Lib von JVKran https://github.com/JVKran/OneTime-BH1750
// Statt readLightLevel muss getLightIntensity verwendet werden
// Verbraucht weniger Strom und Speicher
// 4618 Byte Programmspeicher
// 282 Byte globale Variablen
#include <Wire.h>
#include <LiquidCrystal.h>
#include <BH1750.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Pins anpassen, falls nötig
BH1750 lightMeter;
int rightPin = A0; // Pin für die RIGHT-Taste
int lastButtonState = 5; // Variable zum Lesen des letzten Tastenzustands
int currentBrightness = 0; // Variable für die aktuelle Helligkeit
// Neue Definitionen für Tasten
#define Tasterrechts 0
#define Tasteroben 1
#define Tasterunten 2
#define Tasterlinks 3
#define Tasterselect 4
#define KeinTaster 5
// Neuer Programmblock zur Überprüfung des Tasterstatus
int Tasterstatus()
{
int Analogwert = analogRead(rightPin); // Auslesen der Taster am Analogen Pin A0.
if (Analogwert > 1000) return KeinTaster;
if (Analogwert < 50) return Tasterrechts;
if (Analogwert < 195) return Tasteroben;
if (Analogwert < 380) return Tasterunten;
if (Analogwert < 555) return Tasterlinks;
if (Analogwert < 790) return Tasterselect;
return KeinTaster; // Ausgabe wenn kein Taster gedrückt wurde.
}
void setup() {
lcd.begin(16, 2); // Initialisiere das LCD
lightMeter.begin();
}
void loop() {
int buttonState = Tasterstatus(); // Lese den Zustand der Tasten
if (buttonState == Tasterrechts) {
// Wenn die RIGHT-Taste gedrückt wird
currentBrightness = lightMeter.getLightIntensity(); // Aktualisiere die aktuelle Helligkeit
delay(200); // Zeitabstand zwischen den Messungen, 200 wirkt fast flüssig, je niedriger umso mehr Strom durch häufigere Messungen
lcd.setCursor(0,0);
lcd.print("Licht: ");
lcd.print(currentBrightness);
lcd.print(" lux"); // Einheit "lx" für Lux
}
if (buttonState != Tasterrechts && lastButtonState == Tasterrechts) {
// Wenn die RIGHT-Taste losgelassen wird und der vorherige Zustand RIGHT war
lcd.clear(); // Lösche den Inhalt des Displays
lcd.setCursor(0,0);
lcd.print("Licht: ");
lcd.print(currentBrightness); // Zeige den zuletzt gemessenen Helligkeitswert an
lcd.print(" lux"); // Einheit "lx" für Lux
}
lastButtonState = buttonState; // Merke dir den aktuellen Zustand der Tasten
}