BH1750. Umgebungslichtsensor mit I2C-Bus.

BH1750. Umgebungslichtsensor mit I2C-Bus.

BH1750. Umgebungslichtsensor mit I2C-Bus.

Der BH1750 ist ein Umgebungslichtsensor mit relativ hoher Auflösung und Empfindlichkeit. Es verhält sich gegenüber sichtbarem Licht vergleichbar mit dem menschlichen Auge und wird weder durch Infrarotstrahlung beeinflusst noch ist es von der Farbtemperatur der Art der Beleuchtung abhängig, d. h. es funktioniert gut mit natürlichem Licht und mit verschiedene Arten von künstlicher Beleuchtung. Es kommuniziert digital mit dem Mikrocontroller, mit dem I2C-BusDaher ist es störsicher, wenn es in einem bestimmten Abstand von der Schaltung, die es liest, platziert wird. Die Reaktionszeit ist recht gering und beträgt unter ungünstigsten Umständen weniger als 200 ms.

Inhaltsverzeichnis

    BH1750 Umgebungslichtsensor

    Aus elektronischer Sicht ist die Umsetzung sehr einfach. Schließen Sie einfach die Stromversorgung (zwischen 2,4 V und 3,6 V) an I2C-Bus. Optional kann die Busadresse geändert werden, um zwei Geräte zu verbinden (bei ADDR auf niedrigem Pegel ist sie 0B0100011 oder 0x23 und bei ADDR auf hohem Pegel ist sie 0B1011100 oder 0x5C) und die VDI-Leitung kann für die Reset-Funktion mit verwendet werden Mikrocontroller.

    Zum Anschluss des BH1750 an ArduinoZusätzlich zur Stromversorgung über den 3,3-V-Ausgang ist es am besten, zusätzlich einen Pegelwandler zu verwenden Pull-up-Widerstände für I2C-Bus. Allerdings unterstützt die Komponente eine direkte Verbindung zum Bus I2C-Bus Es ist nicht ratsam, einen Schaltkreis zu dimensionieren, ohne eine Pegelumwandlung in Betracht zu ziehen.

    Umgebungslichtsensor BH1750. Anwendungsschaltung

    Aufgrund seiner Beliebtheit, die im Verhältnis zur Präzision sehr günstig ist, gibt es mehrere Module, wie zum Beispiel das bekannte GY-30, das auf dem Foto zu Beginn zu sehen ist. Um sie beim Prototyping mit einem Mikrocontroller bequemer verbinden zu können, enthalten sie in der Regel Pegelwandler für den I2C-Bus und Spannungsregler, um sie mit einer höheren Spannung (bis zu 5 V) anstelle des 3,3-V-Ausgangs von zu versorgen Arduino.

    Der BH1750 verfügt über zwei Lesemodi, kontinuierlich und individuell, die zwei Zuständen entsprechen: aktiv und niedriger Stromverbrauch oder Ruhezustand. Während bei Verwendung des kontinuierlichen Lesemodus der BH1750 nach der Probenahme aktiv bleibt, wechselt er nach Durchführung einer Einzelmessung automatisch in den Schlaf- und Energiesparmodus. Die erste Auslesung im Dauerbetrieb dauert maximal 180 ms, die weiteren je nach Auflösung zwischen 16 ms und 120 ms.

    Der Sensor ist in der Lage, in Intervallen (Auflösung) von 4 Lux, 1 Lux und 0,5 Lux zu messen. Der BH1750 empfiehlt in seinem Datenblatt, die Auflösung von 1 Lux zu verwenden, was die Unterscheidung von Beleuchtungen unter 10 Lux (was der Dämmerung entspricht) ermöglicht und immun gegen Rauschen ist, das die Messung beeinträchtigen könnte.

    Die Auflösungen 1 Lux und 4 Lux nutzen die 16 Datenbits zur Darstellung des ganzzahligen Teils, sodass eine maximale Messung von 65535 Lux erreicht werden kann (sonniger Tag ohne direktes Licht). Der 0,5-Lux-Modus verwendet das niedrigstwertige Bit für den Dezimalteil (misst von 0,5 Lux bis 0,5 Lux), sodass mit den verbleibenden 15 Bits ein Maximalwert von 32767 Lux (Außenbereich ohne direktes Licht) dargestellt werden kann.

    Theoretische Solarbeleuchtung im Vergleich zur durchschnittlichen Kapazität des BH1750
    Theoretische Sonnenbeleuchtung des Ortes und Tages, an dem der Artikel geschrieben wurde (gesetzliche Zeit, nicht solar) im Vergleich zur durchschnittlichen Kapazität des BH1750 bei 1 Lux

    Normalerweise entspricht das optische Fenster, nach dem Umgebungslicht gemessen wird, dem gesamten sichtbaren Spektrum und das Ziel besteht darin, eine mit dem Menschen vergleichbare Empfindlichkeitsverteilung zu erreichen. Wenn das optische Fenster verkleinert wird (Licht wird in einem niedrigeren Wellenlängenbereich gemessen), kann die Empfindlichkeit des BH1750 erhöht werden (bis zu 0,11 Lux), indem die Anpassung des Einflusses des optischen Fensters durch Erhöhen der Zeitanzeige aufgehoben wird im Verhältnis. Da in diesem speziellen (überdimensionierten) Modus separate Messwerte erfasst werden, muss der Kontext dies zulassen, ohne die Messbedingungen besonders zu verändern (z. B. muss der Sensor sehr stabil bleiben, er darf sich nicht in einen Bereich mit unterschiedlichen Lichtverhältnissen bewegen).

    BH1750-Betriebscodes

    Zustand
    5>

    • 0B00000000 (0x00) Niedriger Stromverbrauch oder Leerlaufmodus.

    • 0B00000001 (0x01) Eingeschaltet.

    • 0B00000111 (0x07) Zurücksetzen. Löscht die BH1750-Datenprotokolle.

    Auflösung
    5>

    • 0B00010011 (0x13) Kontinuierliche Messung mit 4 Lux Auflösung (zwischen 16 ms und Lesezeit)

    • 0B00010000 (0x10) Kontinuierliche Messung mit 1 Lux Auflösung (120 ms Lesezeit)

    • 0B00010001 (0x11) Kontinuierliche Messung mit 0,5 Lux Auflösung (120 ms Lesezeit)

    • 0B00100011 (0x23) Eine Messung mit 4 Lux Auflösung (16 ms Lesezeit)

    • 0B00100000 (0x20) Eine Messung mit 1 Lux Auflösung (120 ms Lesezeit)

    • 0B00100001 (0x21) Eine Messung mit 0,5 Lux Auflösung (120 ms Lesezeit)

    Anpassung zur Änderung des optischen Fensters
    5>

    • 0B011MT [0,1,2,3,4] Low-Bit des MTREG-Registers (Measurement Time REGister).

    • 0B01000MT [5,6,7] High-Bit des MTREG-Registers.

    Lesen Sie den BH1750 von Arduino

    Zur Messung der Umgebungsbeleuchtung mit dem BH1750 von Arduino Die Bibliothek wird genutzt Schweißdraht das die Kommunikation mit dem verwaltet I2C-Bus. Der Vorgang ist der bei dieser Art von Kommunikation übliche, zunächst werden sie (einmal im Programm) mit aktiviert Wire.begin(), beginnt die Kommunikation mit dem BH1750 mit Wire.beginTransmission() und Ihre Adresse I2C (0x5C oder 0x23, je nachdem, ob ADDR hoch bzw. niedrig ist), wird durch Senden des entsprechenden Codes konfiguriert Wire.write() und der Bus wird mit freigegeben Wire.endTransmission()

    Wenn einer der kontinuierlichen Lesemodi verwendet wird, wird Wire.beginTransmission() verwendet, um die Daten mit der Adresse abzurufen I2C Um auf den BH1750 zuzugreifen, werden Sie zur Eingabe von zwei Bytes (Auflösung 16 Bit) aufgefordert Wire.requestFrom() die gelesen werden, mit Wire.read()und werden in eine vorzeichenlose Ganzzahl geladen, wobei das erste Byte um 8 Bit rotiert wird. Anschließend wird der Bus mit freigegeben Wire.endTransmission(). Das Endergebnis erhält man, indem man den zurückgegebenen Wert durch den Präzisionsfaktor dividiert (1,2, wenn das optische Fenster nicht geändert wird).

    Wird der Einzellesemodus verwendet, wechselt der BH1750 in den Schlafmodus. Um in den aktiven Modus zurückzukehren, kann eine Konfiguration (derselbe Lesemodus oder ein neuer) oder der Einschaltcode (0x01) gesendet werden. Mit dem Shutdown-Code (1750x0) kann der BH00 in den Schlafmodus versetzt werden.

    Es ist wichtig, die Lesezeit des Sensors zu beachten, die von der Auflösung abhängt. Wenn die Wartezeit nicht kritisch ist, kann sie für alle Fälle auf einen Wert vereinheitlicht werden, der etwas größer als das erwartete Maximum sein kann, um sicherzustellen, dass der Lesevorgang abgeschlossen wird.

    Um das Schreiben von Code für den BH1750 komfortabler zu gestalten ArduinoDie wichtigsten Operationscodes finden Sie im folgenden Header-Dokument.

    Der folgende Beispielcode zeigt den gebräuchlichsten Lesemodus im Lichtsensor I2C BH1750. Die Auflösung beträgt 1 Lux und der Lesemodus ist kontinuierlich. Das Beispiel zeigt die Verwendung der seriellen Konsole Arduino, jedes Ergebnis aus dem Messwert erhalten.

    Wie oben erwähnt, verwenden sowohl der 1-Lux- als auch der 4-Lux-Auflösungsmodus die 16 Datenbits, um die Messung als Ganzzahl auszudrücken. Im 0,5-Lux-Modus hingegen stellt das letzte Bit einen Dezimalteil dar, d. h. der Wert, der zur Gesamtmessung beiträgt, wird um eine Zweierpotenz nach rechts verschoben. Im 1-Lux- oder 4-Lux-Modus ist das letzte Bit (LSB) ist 2 wert0, der vorletzte 21, die nächsten 22…im 0,5-Lux-Modus das letzte Bit (LSB) ist 2 wert-1, der vorletzte 20, die nächsten 21...

    Gemäß dieser Datenstruktur und unter Berücksichtigung der Tatsache, dass zwei Lesungen durchgeführt werden müssen I2C eines Bytes, um den 16-Bit-Wert zu erhalten, müssen Sie die höchstwertigen Bits des Bytes, die ersten, die gelesen werden, laden und sie im 8-Lux-Auflösungsmodus und im 1-Lux-Auflösungsmodus um 4 Bit nach links drehen nur 7 Bit im 0,5 Lux. Um die Leseart im 0,5-Lux-Modus zu vereinheitlichen, können Sie das höchstwertige Byte in eine vorzeichenlose Ganzzahl laden, 8 Bits nach links drehen, das niedrigstwertige Byte laden und die gesamte vorzeichenlose Ganzzahl um 1 Bit nach links drehen. rechts, erhalten der Wert des Dezimalteils, der angibt LSB (niederwertiges Bit) um es später anzuwenden.

    Logischerweise ist es für den 1-Lux- oder 4-Lux-Modus notwendig, vorzeichenlose Ganzzahlen zu verwenden (unsigned int) wozu Arduino Reservieren Sie das nicht MSB (höchstwertiges Bit) für das Vorzeichen und können direkt mit dem wahren Wert der Messung operieren, nicht mit einer negativen Zahl. In Arduino Due nicht notwendig, da Ganzzahlen 32 Bit verwenden, aber das gleiche Programm funktioniert auch, wenn es ebenfalls verwendet wird unsigned int.

    Der folgende Code zeigt, wie der 0,5-Lux-Modus verwendet wird

    Laden Sie die Dokumente für Beispiele zur Messung des Umgebungslichts mit dem BH1750-Sensor und Arduino herunter.

    Geben Sie Anmerkung

    Sie können vermisst haben