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)