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

12/2019
RasPi-Alternativen

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Grußbotschaften

    Mit Sonic Pi zaubern Sie komplexe Sounds, die Sie bei Bedarf sogar noch während des Abspielens modifizieren.

  • Das Runde und das Eckige

    Mit dem MCP4725 ergänzen Sie einen RasPi um einem D/A-Wandler, der bei Bedarf noch weitere Funktionen erfüllt.

  • Alles unter Kontrolle

    Schon ein einfaches Mikrocontrollerboard wie das CY8CKIT-049-42xx bietet erstaunlich viele Möglichkeiten beim Ansteuern von Hardware.

  • Viele Kerne

    Das Spresense Development Board von Sony lässt sich mit der Arduino IDE programmieren und bringt auch ein eigenes Entwickler-SDK mit.

  • Exotische Früchte

    Der aus China stammende Orange Pi positioniert sich mit einem guten Preis und interessanten Features gegen die RasPi-Truppe. Kann er sich auch behaupten?

  • Flexibler Surfer

    Mit dem neuen RasPi 4 setzen Sie einen öffentlichen Webkiosk schnell und kostengünstig auf.

  • Auskunftsfreudig

    Viele Devices, so auch der E.ON-Aura-Controller, verwenden eine Schnittstelle namens REST, um Zustandsdaten zu übermitteln. Mit ein wenig Bastelei lesen Sie diese auch über Ihr Smartphone aus.

  • Doppelt gemessen

    Mit wenig Aufwand und einem Pi Zero realisieren Sie einen mobilen Zweikanal-Spannungsprüfer.

  • Elegant zusammengeführt

    Tizonia streamt Musik von Online-Quellen und lokalen Sammlungen. Die schlanke Architektur macht den Player zur guten Wahl für den Einsatz auf dem RasPi.

  • Kommunikativ

    Nicht jeder traut sich zu, sein eigenes Smartphone zu bauen. Allerdings kann jeder Linux-Nutzer den Raspberry Pi im Handumdrehen zu einem VoIP-Telefon aufrüsten.