Es ward Licht … Lichtsensor TSL2561

Der TSL2561 ist ein Lichtsensor für den I2C-Bus. In diesem Beitrag erkläre ich Euch wie man ihn an einem Raspberry Pi einrichtet und mittels eines Python Testprogrammes die ersten Daten generiert.

Disclaimer:

Trotz größter Sorgfalt kann für die 100 % tige Funktionalität der Bauanleitungen, Software und Schaltpläne nicht garantiert werden. Sie sollen nur eine Anregung zum Bau darstellen.
Daher gilt:
  • Jeder ist für den richtigen Aufbau, Programmierung etc. selbst verantwortlich.
  • Ich übernehme keine Haftung für Schäden aller Art.

Kurzbeschreibung des Sensors

Der TSL2561 Sensor hat etwas mehr Zeit als die anderen Sensoren in Anspruch genommen. Leider ist das Datenblatt nicht so gut und logisch aufgebaut wie die der vorherigen Sensoren.
Außerdem zeigt mir auch der nachbestellte „Ersatzsensor“ immer noch komische Werte an. Laut Handy sollte eine Helligkeit von 200 Lux vorhanden sein, der Sensor zeigt hier jedoch nur 28 Lux.

Aber mal ganz von vorne. Der TSL2561 misst einerseits das gesamte Spektrum des eingefangenen Lichts. Zusätzlich misst er noch den IR-Anteil des eingefangenen Lichts.
Durch Abzug des IR-Anteils kann man sich die sichtbare Lichtstärke anzeigen lassen.

Adressierung

Von diesem Sensor können leider nur maximal drei Geräte an einem Bus angeschlossen werden. Die Adressierung erfolgt hierbei über den Anschluss „Addr.“.
Folgende Beschaltung ergibt die entsprechende Adressierung:

GND = 0x29
VDD = 0x49
Unbeschaltet = 0x39

Für die Experimente nutze ich die Adresse 0x39.

Interrupt

Zusätzlich bietet dieses Bauteil auch noch die Möglichkeit über einen „Interrupt“-Ausgang dem Raspberry mitzuteilen, dass ein eingestellter Schwellwert überschritten wurde. Dies ist recht interessant, wenn man eine höhere CPU und Buslast durch ständiges Pollen des Sensors vermeiden möchte.

Register

Der Punkt der mich bei diesem Datenblatt etwas länger aufgehalten hat, war zu verstehen, wie sich die Register zusammensetzen.
Bei den Registern ist zu beachten, dass die oberen 4 Bit (4-7) durch das „Command-Register“ belegt werden. Der Bereich der unteren 4 Bit ist für die Adresse vorgesehen.
Für jede lesende oder schreibende Operation ist mindestens das Bit 7 auf „1“ zu setzen. Daraus ergibt sich das der Registeradresse mindestens ein 8h vorgestellt werden muss. Möchte man beispielsweise das Register mit der Adresse 3h abfragen, so ist der entsprechende Registerbefehl hierfür die 0x83.

Befehle

Der Sensor kann über folgende Befehle ein- bzw. ausgeschaltet werden:

Ausschalten:

i2cset -y 1 0x39 0x80 0x00

 

Einschalten:

i2cset -y 1 0x39 0x80 0x03

 

Die Abtastrate des Sensors kann im Register „Timing“ (1h) geändert werden.
Default-Einstellung ist hierbei die geringste Rate mit der höchsten Genauigkeit. Mit folgenden Befehlen kann man die unterschiedlichen Abtastraten einstellen:

13,7ms und schlechteste Auflösung:

i2cset -y 1 0x39 0x81 0x00

 

101ms und mittlere Auflösung:
i2cset -y 1 0x39 0x81 0x01

 

402ms und beste Auflösung:

i2cset -y 1 0x39 0x81 0x02

 

Zusätzlich gibt es noch die Möglichkeit von automatischer Abtastung auf eine manuelle Abtastung umzuschalten.

Einschalten der manuellen Abtastrate:

i2cset -y 1 0x39 0x81 0x03
Start des Messvorganges:

i2cset -y 1 0x39 0x81 0x07
Stop des Messvorganges:

i2cset -y 1 0x39 0x81 0x03

Testprogramm in Python

Um den Lichtsensor zu testen habe ich mir ein kleines Programm geschrieben, welches den Lux-Wert und einige Zwischenwerte ausgibt.

import smbus
from time import sleep

#Definieren der Variablen und Konstanten
Busnummer = 1
Adresse_TSL2561 = 0x49
Start = 0x51
Ambiente_High_Byte = 0
Ambiente_Low_Byte = 0
IR_High_Byte = 0
IR_Low_Byte = 0
Ambiente = 0
IR = 0
Ratio = 0
Lux = 0

#Instanzieren eines I2C Objektes
i2cBus = smbus.SMBus(Busnummer)

#Starten des 400ms Messvorganges
i2cBus.write_byte_data(Adresse_TSL2561, 0x80, 0x03)
while True:
    print "Auslesen"
    Ambiente_Low_Byte = i2cBus.read_byte_data(Adresse_TSL2561, 0x8c)
    Ambiente_High_Byte = i2cBus.read_byte_data(Adresse_TSL2561, 0x8d)
    Ambiente = (Ambiente_High_Byte*256)+Ambiente_Low_Byte
    print "Ambiente %d"  % Ambiente
    IR_Low_Byte = i2cBus.read_byte_data(Adresse_TSL2561, 0x8e)
    IR_High_Byte = i2cBus.read_byte_data(Adresse_TSL2561, 0x8f)
    IR = (IR_High_Byte*256)+IR_Low_Byte
    print "IR %d" % IR
    #Berechnen des Faktors IR/Ambiente
    Ratio = IR / float (Ambiente)
    print "Ratio %f" % Ratio
    #Berechnung lt. Datenblatt TSL2561T
    if 0 < Ratio <= 0.50:
        Lux = 0.0304*Ambiente-0.062*Ambiente*(Ratio**1.4)
    elif 0.50 < Ratio <= 0.61:
        Lux = 0.0224*Ambiente-0.031*IR
    elif 0.61 < Ratio <= 0.80:
        Lux = 0.0128*Ambiente-0.0153*IR
    elif 0.80 < Ratio <= 1.3:
        Lux = 0.00146*Ambiente-0.00112*IR
    else:
        Lux = 0
    print "Lux = %f" % Lux
    print "Ende und Sleep 0,5s"
    sleep (0.5)