Lichtsensor TSL2561 am Raspberry

Der TSL2561 Sensor hat etwas mehr Zeit als die anderen Sensoren an Zeit in Anspruch genommen. Leider ist das Datenblatt nicht so schön und eindeutig 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. Ich denke ich werde hier noch einige Tests im Freien machen.

Aber mal ganz von vorne. Der TSL2561 ist ein Lichtsensor, der einerseits das gesamte Spektrum misst und zusätzlich noch den IR-Anteil eben dieses Spektrums. Durch Abzug des IR-Anteils kann man sich die sichtbare Lichtstärke anzeigen lassen.

Adressierung:

Von diesem Sensor können leider 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 eine 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 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)
    
Dieser Beitrag wurde unter Raspberry Pi, Sensoren abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.