Workshop-Serie: I<+>2<+>C mit dem Raspberry Pi
|
Teil 1: I2C-Bus-Grundlagen |
RPG 01/2015, S. 68 |
|
|
Teil 2: Uhrenbaustein PCF8583 |
RPG 02/2015, S. 66 |
|
|
Teil 3: Temperatursensor LM75 |
RPG 03/2015, S. 70 |
|
|
Teil 4: Helligkeitssensor BH1750 |
RPG 04/2015, S. 74 |
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).
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 |
|---|---|---|
|
|
Power down |
Gerät inaktiv |
|
|
Power on |
Gerät bereit zur Messung |
|
|
Reset |
setzt das Datenregister zurück; kein Power-down-Modus |
|
|
Continuously H-Resolution Mode |
kontinuierliches hochauflösendes Messen (Auflösung 1lx, Dauer 120ms) |
|
|
Continuously H-Resolution Mode2 |
kontinuierliches hochauflösendes Messen (Auflösung 0,5lx, Dauer 120ms) |
|
|
Continuously L-Resolution Mode |
kontinuierliches niedrigauflösendes Messen (Auflösung 4lx, Dauer 16ms) |
|
|
One Time H-Resolution Mode |
einmaliges hochauflösendes Messen (Auflösung 1lx, Dauer 120ms) |
|
|
One Time H-Resolution Mode2 |
einmaliges hochauflösendes Messen (Auflösung 0,5lx, Dauer 120ms) |
|
|
One Time L-Resolution Mode |
einmaliges niedrigauflösendes Messen (Auflösung 4lx, Dauer 16ms) |
|
|
Change Measurement Time (High Bit) |
relative Messdauer (Bits 7, 6, 5) |
|
|
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 |
||
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].
Fazit
Der BH1750 lässt sich problemlos in jedes RasPi-Projekt integrieren und liefert die Ergebnisse quasi im Klartext zurück. Im direkten Vergleich zu einem alternativen Aufbau mit einem Fotowiderstand und einem AD-Wandler bietet er damit eine geradezu kinderleichte Bedienung. Auf der Kostenseite fällt das Modul dennoch mit einem Preis von knapp 3 Euro kaum ins Gewicht, nimmt Ihnen aber viel Arbeit ab. Zu den möglichen Anwendungen – eine Suche im Netz fördert dazu etliche Ideen und Anleitungen zutage – zählen beispielsweise das Ermitteln der realen Sonnenstunden oder das Nachführen von Solarzellen. Alles in allem handelt es sich beim BH1750 um einen sehr zu empfehlenden Sensor zum kleinen Preis.







