Digital Light Sensor BH1750 am Raspberry Pi

© Mohd Hairul Fiza Musa, 123RF

Licht oder nicht

,

Workshop-Serie: I<+>2<+>C mit dem Raspberry Pi

Teil 1: I2C-Bus-Grundlagen

RPG 01/2015, S. 68

http://www.raspi-geek.de/33535

Teil 2: Uhrenbaustein PCF8583

RPG 02/2015, S. 66

http://www.raspi-geek.de/33930

Teil 3: Temperatursensor LM75

RPG 03/2015, S. 70

http://www.raspi-geek.de/34330

Teil 4: Helligkeitssensor BH1750

RPG 04/2015, S. 74

http://www.raspi-geek.de/33932

Im vierten Teil unserer Reihe über den I2C-Bus dockt ein Sensor für die Helligkeit, der BH1750, am Raspberry Pi an. Dieser Baustein arbeitet im normalen Betrieb in einem Bereich von 1 bis 65535 Lux bei einer Auflösung von 1 Lux. Der Chip kommt häufig in Mobiltelefonen zum Einsatz, um die Hintergrundbeleuchtung an die Helligkeit in der Umgebung anzupassen: So sparen die Geräte Energie.

Der BH1750 logiert in einem WSOF6I-SMD-Gehäuse, das derart klein ausfällt, dass es sich definitiv nicht mehr dazu eignet, um es mithilfe des heimischen Lötkolbens zu verbauen. Erfreulicherweise gibt es im Handel eine kleine Platine zu kaufen, die bereits mit dem Baustein bestückt ist [1]. Die Anschlüsse auf dem Modul liegen in Form einer bei Bastlern traditionell beliebten Pfostenleiste vor (Abbildung 1).

Abbildung 1: Der kompakte Baustein BH1750 liefert in einer praxistauglichen Auflösung Messwerte für die Stärke des Umgebungslichts. Hier sitzt er bereits fertig montiert auf einer Mini-Platine.

Auf der Platine finden sich bereits alle diskreten Bauelemente, die Sie für den Betrieb benötigen. Am I2C-Bus meldet sich der BH1750 unter den Adressen 0x23h (0 Volt an ADDR) und 0x5Ch (3,3 Volt an ADDR). Der Aufbau für einen ersten Versuch gestaltet sich daher recht einfach: Sie legen die Versorgungsspannung an VCC und GND an. Der Baustein verträgt nicht mehr als 3,6 Volt Spannung, daher schließen Sie ihn an den 3,3V-Ausgang des RasPi an. SCL und SDA verbinden Sie mit den entsprechenden Anschlüssen der GPIO; ADDR legen Sie einfach auf 0 Volt (Abbildung 2).

Abbildung 2: Den ersten Test absolviert der Sensor in diesem sehr einfachen Aufbau.

Inbetriebnahme

Haben Sie alle im Teil 1 dieser Reihe beschriebenen Schritte gemacht, sollte sich der BH1750 ohne Probleme am Bus melden. Das testen Sie mithilfe des Kommandozeilenbefehls I2cdetect in einem Terminal; Listing 1 zeigt das Ergebnis. Über eine Schreiboperation auf die Basisadresse des BH1750 legen Sie den gewünschten Betriebsmodus fest (Tabelle "Betriebsmodi").

Listing 1

 

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Nach einer vom Betriebsmodus abhängigen Wartezeit lässt sich dann mit einer Wortleseoperation das Messergebnis auslesen. Das High Byte und Low Byte des Messergebnisses liegen vertauscht vor, Sie müssen die beiden erst einmal wieder richtig herum drehen. Darauf beschränkt sich dann die Funktionsweise des BH1750 auch schon. Im Datenblatt des Bausteins [2] finden sich noch zusätzliche technische Informationen, die wir aber für unser einfaches Beispielprogramm nicht benötigen.

Betriebsmodi

Steuercode

Anweisung

Kommentar

00000000

Power down

Gerät inaktiv

00000001

Power on

Gerät bereit zur Messung

00000111

Reset

setzt das Datenregister zurück; kein Power-down-Modus

00010000

Continuously H-Resolution Mode

kontinuierliches hochauflösendes Messen (Auflösung 1lx, Dauer 120ms)

00010001

Continuously H-Resolution Mode2

kontinuierliches hochauflösendes Messen (Auflösung 0,5lx, Dauer 120ms)

00010011

Continuously L-Resolution Mode

kontinuierliches niedrigauflösendes Messen (Auflösung 4lx, Dauer 16ms)

00100000

One Time H-Resolution Mode

einmaliges hochauflösendes Messen (Auflösung 1lx, Dauer 120ms)

00100001

One Time H-Resolution Mode2

einmaliges hochauflösendes Messen (Auflösung 0,5lx, Dauer 120ms)

00100011

One Time L-Resolution Mode

einmaliges niedrigauflösendes Messen (Auflösung 4lx, Dauer 16ms)

01000xxx

Change Measurement Time (High Bit)

relative Messdauer (Bits 7, 6, 5)

011xxxxx

Change Measurement Time (Low Bit)

relative Messdauer (Bits 4, 3, 2, 1, 0)

Das Ergebnis der Messung liegt nach 2 x Messdauer im Datenregister vor. Die Standard-Messdauer entspricht einem Wert von 01000101. Durch eine längere Messdauer (max.: 11111110 = 3,68 x Standard) lassen sich Auflösungen bis 0,11lx erzielen.

Betrieben in einem der Continuously-Modi verbraucht der BH1750 lediglich 190 Mikroampere. Damit gibt er sich sehr genügsam, wenn man bedenkt, dass eine typische Niedrigstrom-LED ("low current") 3 mA verbraucht – also knapp das Sechzehnfache. Schalten Sie ihn in den Power-down-Modus, sinkt der Stromverbrauch gar auf 1 Mikroampere. Die One-Time-Modi ersparen Ihnen das manuelle Umschalten: Nach jeder Messung in einer dieser Betriebsarten versetzt sich der BH1750 zum Stromsparen automatisch in den Power-down-Modus. Für eine weitere Datenerfassung müssen Sie ihn dann erst wieder mit einem expliziten Power-on wecken.

Testprogramm

Unser einfaches Testprogramm aus Listing 2 sendet dem BH1750 in Zeile 5 den Steuercode für eine kontinuierliche Messung im hochauflösenden Modus mit 1 Lux Genauigkeit zu (0x10h, entspricht 00010000) und liest nach einer kurzen Wartezeit (Zeile 6) das Messergebnis ein (Zeile 7). Anschließend drehen die Bytes wieder richtig herum (Zeile 8) und stellen das Ergebnis dar (Zeile 9). Wie sich aus der Ausgabe des Programms in Listing 3 erahnen lässt, erfolgte der Testlauf des Programms in einem relativ dunklen Kellerraum – bekanntlich arbeiten ja Geeks vorrangig in solchen, bei einer Diät aus Cola und Pizza.

Listing 2

 

#include <wiringPiI2C.h>
#include <stdio.h>
int main (void) {
  int handle = wiringPiI2CSetup(0x23) ;
  wiringPiI2CWrite(handle,0x10);
  sleep(1);
  int word=wiringPiI2CReadReg16(handle,0x00);
  int lux=((word & 0xff00)>>8) | ((word & 0x00ff)<<8);
  printf("Aktuelle Beleuchtungsstärke in Lux:%d \n",lux);
  return 0 ;
}

Listing 3

 

$ cc bh1750.c -lwiringPi
$ ./a.out
Aktuelle Beleuchtungsstärke in Lux: 63

Beim "Verdrehen" der Rückgabe-Bytes handelt es sich übrigens nicht etwa um einen Bug, sondern schlicht um die von vielen populären Prozessorarchitekturen – darunter auch der x86-Familie von Intel – genutzte Arbeitsweise, die im Fachchinesisch auch Little-Endian heißt. Die prominentesten Vertreter der Big-Endian-CPUs, die die Werte in umgekehrter Reihenfolge ablegen, stammen von Motorola. Es gibt einen schönen Wikipedia-Eintrag, der das Verhalten genau erklärt [3].

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

10/2019
Raspberry Pi 4B

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Sonnige Zeiten

    UV-Strahlung ist für das menschliche Auge unsichtbar, was sie umso gefährlicher macht. Die Höhe der tatsächlichen Belastung verrät Ihnen das Selbstbauprojekt UV-Sensor.

  • Gut verpackt

    Für das Ansteuern kleiner Displays gibt es keine Programme von der Stange. Mit Python und einer Pygame-Bibliothek erstellen Sie trotzdem im Handumdrehen Anwendungen.

  • Macro-Mini-Micro-Bit

    Was dem Raspberry Pi für die Computerwelt gelungen ist, versucht der BBC Micro:bit für Mikrocontroller zu wiederholen. Das für Schüler entwickelte Kit hilft beim Einstieg in die hardwarenahe Programmierung.

  • Vorhang auf

    Mit dem modernen Video-Codec HEVC (H.265) erstellte Filme spielen bisherige RasPi-Modelle oft nur ruckelnd ab. Wir testen, ob der neue Raspberry Pi 4B das besser kann.

  • Überraschung!

    Eine optimierte Architektur und mehr RAM beschleunigen den RasPi 4B deutlich. Wir prüfen, wie gut sich der Neuling als Desktop-Rechner schlägt.

  • Durchgestartet

    Ein Stresstest zeigt, wie sich der neue Raspberry Pi 4 Modell B gegenüber den älteren Modellen abhebt.

  • Vierte Generation

    Eine schnellere CPU, USB 3.0 und Gigabit-Ethernet sind nur die Highlights des Raspberry Pi 4B: Das Board bringt viele weitere Neuerungen mit.

  • Tiefenmesser

    Um die Pumpe in einem Brunnenschacht möglichst genau zu positionieren, brauchen Sie dessen Tiefe. Die ermitteln Sie mithilfe eines präzisen Messgeräts aus einem Luftdrucksensor und einem Mikrocontroller.

  • Faktencheck

    Das via DVB-T2 ausgestrahlte Digital-TV liefert Bilder in HD-Qualität. Der dabei eingesetzte H.265-Standard überfordert allerdings kleine Mini-Rechner wie den Raspberry Pi – oder geht es doch?

  • Zugriff von außen

    React Native erlaubt es, Apps mit wenigen Zeilen Code zu programmieren. Mit einem entsprechenden Server sprechen Sie so den RasPi vom Smartphone aus an.