#1 Lichtmessung BH1750 mit Stromsparen und praktischer Anzeige

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
}

Hast Du mal geschaut wieviel der BH1750 strom braucht?
Typisch 120µA, max 190µA.
Da verbraucht ein LED, die pullup-Widerstände, das Display, die Hintergrundbeleuchtung des Displays, der Spannungsteiler der Taster, der FT232 oder derCh340 oder auch der ATmega328 (jedes einzeln) mehr Strom.

Grüße Uwe

1 Like

Es geht um die Nutzung des Powerdownmodus in dieser Bibliothek.
Durch die Aktivierung des Sensors nur bei Tastendruck und die Messung mit delays wird nochmal Strom gespart ohne auf eine nahrzu Live-Anzeige zu verzichten.

Das Stromsparen auch bei Sensoren Sinn macht, wird klar wenn jemand plötzlich 5... 6... xx... Sensoren verbaut.

Zusätzlich geht es um eine sinnvolle Anzeige der Werte. Z.b. wwnn man das Gerät Richtung Lichtquelle hält und das Display dann nicht zu sehen ist, je nachdem in welche Richtung Display und Sensor zeigen (wenn sie nicht beweglich sind).

Würde man das Teil dann von der Lichtquelle wieder wegdrehen um das Display zu lesen, wäre bei normaler permanenter Anzeige ja nicht mehr der Wert der Lichtquelle zu sehen. Sondern der DANN aktuelle Wert.

Aber mit dem zuletz genessenen und gespeicherten Wert lässt sich das elegant lösen.

Das Display ist hier vorerst Nebensächlich, es ging um speziell diesen verbreiteten Sensor und die Datenanzeige.
Wie das mit einem anderen Display lösbar ist um mehr anzuzeigen, kommt dann noch.

Nachtrag,
Das ganze ist natürlich auch auf andere Komponenten anwendbar, z.b. die Anzeige des Wertes, der Delay-Modus um etwas Strom zu sparen, das nurzen von Low-Power Bibliotheken usw.

Dies ist ein Beispiel dafür.

Delay-Modus würde ich Standby Modus nennen.

Gegen Stromsparen ist nichts einzuwenden. Da muß mann aber die Hardware sehr genau ausuchen.

Mal auf Deinen Aufbau:
Arduino NANO: Den Kontroller ATmega328 kann in Schlafmodus versetzt werden, der FT232 (15ma) bzw CH340 (12 bis 30mA) verbraucht weiter Strom , auch die LED ( ca 3mA) Nimm eine Arduino MINI oder PRO MINI.
Das Display in Blau-Weis mit Hintergrund Beleuchtung verbraucht zwischen 40 und 250mA. Besser Du nimmst ein Schwarz-grünes LED Display, das ist auch ohne Hintergrundbeleuchtung bei Umgebungslicht lesbar. Das LCD ohne Hintergrundbeläuchtung braucht 1-2mA
Ein Display eines Nokia 6110 ist sparsamer.

Das LCD Shield hat eine Power-LED (wieder 2-3mA)

Die Taster brauchen Strom nur wenn sie gedrückt werden, also auf die Dauer vernachässigbar. Strom je nach Taster zwischen 0,7 bis 2,5mA

Da sind die 0,12mA des Sensores nicht wichtig.

Wenn Du auf Batteriebetrieb mit extremen langen Batteriebetrieb (mehrere Monate bis Jahre) abzielst dann muß man sparen. Dann sind aber NANO, und das Display die falsche Wahl.

Grüße Uwe

Wie gesagt, es ist ein Beispiel.
Einmal für einen Sensor und einmal für eine Art wie die Anzeige der Werte praktisch nutzbar ist.

Jemand nimmt daraus was für einen Sensor mit. Jemand anderes was aus der Art mit dem speichern der Werte.

Verstehst wie ich mein?

Ich werd ja noch mehr Sachen machen. Das war jetzt Nr.1

Es ist ja ein Delay von einer Messung zur nächsten. Zwischen diesen Messungen ist der Sensor im Powerdown. Die Messung selbst dauert 120ms im Highprecision-Modus.

Der Wert 200 ist ein Kompromiss den ich gesetzt habe um zu darzustellen das sich auch so noch eine quasi Livedarstellung der Werte machen lässt trotz der Unterbrechungen. Bei gleichzeitig hoher Genauigkeit die auch bei dunkleren Verhältnissen noch eine Messung zulässt.

Abhängig davon ob eine Messung in grösseren Abständen reicht lässt sich der Wert erhöhen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.