Morse-Luxmeter mit I2C-Chip
Das Auge regelt Helligkeitsunterschiede fantastisch gut aus (während
physikalische und chemische Vorgänge, z.B. Solarstrom-Erzeugung oder
Pflanzenwachstum, wohl eher linear von der Helligkeit abhängen). Weil
man sich daher schwer tut, Beleuchtungsstärken mit dem Auge
abzuschätzen, wollte ich schon immer mal mit einem Luxmeter
herumspielen. Bei Watterott fand ich ein interessantes und recht
preiswertes Breakout-Board mit einem Helligkeitssensor, der die
Beleuchtungsstärke direkt in Lux umrechnet und per I2C-Bus ausgibt.
Link: http://www.watterott.com/de/TSL45315-Breakout
Zunächst schrieb ich ein Programm für die serielle Schnittstelle der
LP-Mikrocontroller-Hardware, um die I2C-Kommunikation zu testen, und
strickte dann das ganze für die Ausgabe per Morse um. Da Watterott zur
Zeit noch einige hundert der Breakout-Boards auf Lager hat und sie
daher wohl noch eine Weile erhältlich sein werden, hier ein kleiner
Beitrag über die Verwendung.
Hardware
Das IC TSL45315 wird wie fast alle modernen ICs
nur in "Fliegendreck-Größe" gefertigt und ist für 2,5V bzw. 3,3V
Betriebsspannung ausgelegt. Um seine Verwendung an 5V-Systemen wie z.B.
der Arduino-Hardware zu vereinfachen, befindet sich auf dem
Breakout-Board ein Spannungswandler und ein Levelshifter für den
I2C-Bus.
Es kann daher direkt mit der LP-Mikrocontroller-Hardware verbunden
werden - eigentlich lohnt sich ein Schaltbild kaum, denn man muss
lediglich SCL mit PB3, SDA mit PB4 verbinden und Masse sowie
Betriebsspannung anschließen. Hier der Versuchsaufbau an meinem
LP-Mikrocontroller-Clone:
Für eine dauerhafte Lösung hier trotzdem ein Schaltungsvorschlag und das Layout auf Streifenraster-Platine:
Die Beschaltung der seriellen Schnittstelle entspricht der
LP-Mikrocontroller-Hardware, jedoch fehlt die
ISP-Programmiermöglichkeit (der Reset-Eingang des ATtiny ist fest auf
High gelegt, der DTR-Anschluss ist nicht mit PB0 verbunden und die
Brücke zwischen den Pins 8 und 2 der DSUB-Buchse fehlt).
Der Stiftabstand von DSUB-9-Steckverbindern liegt leider nicht
im 2,54mm-Raster. Es gibt jedoch zwei Bauformen der Buchsen für
Platinenmontage. Wenn man statt der geschlossenen die offene Bauform
verwendet, kann man die Stifte so zurechtbiegen, dass sie ins
2,54mm-Raster passen und die beiden Stiftreihen 5,08 mm Abstand
zueinander haben, so dass man die Leiterbahnen zwischen der vorderen
und der hinteren Reihe mit einem 3mm-Bohrer unterbrechen kann.
Auf der Platinenunterseite ist eine isolierte Drahtbrücke
erforderlich, die als dünne braune Linie dargestellt ist (von Pin 7 der
DSUB-Buchse an die Diode D2). Man kann auch einfach die Diode auf die
Unterseite der Platine verlegen.
Die Morse-Variante ist noch einfacher: der Buzzer liegt an PB0,
ein Reset-Taster startet die (einmalige) Morseausgabe, die
Betriebsspannung für das Breakout-Board wird über den Pin PB2
geschaltet, nach der Morseausgabe geht der Mikrocontroller in
Powerdown. Die Schaltung kann so ständig mit der Batterie verbunden
bleiben. Da der TSL 45315 intern mit 2,5V betrieben wird und der
Spannungsregler auf dem Breakout-Board ab 2,6V arbeitet, ist die
Schaltung ideal für eine Lithium-Knopfzelle. Ich habe zwar eine
Monsterzelle CR 2450 verwendet, die bei Reichelt ein sehr gutes
Preis-Leistungsverhältnis hat (nur 78 Cent für immerhin 560 mAh), aber
es würde auch eine kleinere reichen, denn der Stromverbrauch beträgt
unter 1 mA während der Messung und Morseausgabe und unter 1 µA im
Standby.
Software
Die I2C-Adresse ist im Datenblatt wie üblich in 7-Bit-Länge
angegeben und muss für Bascom in 8 Bit umgerechnet werden. In den
beigefügten Programmen sind die resultierende 8-Bit-Lese- bzw.
-Schreibadresse direkt eingetragen.
Mit dem Kommandoregister des IC musste ich etwas herumfummeln,
weil ich das Datenblatt nicht verstanden hatte. Erst anhand des
Watterott-Arduino-Sketches habe ich begriffen, dass es ein Command-Bit
gibt, das faktisch die Kommandoregister-Adresse des ICs um hex 80
erhöht. In den Programmen ist die resultierende Adresse direkt
eingetragen.
Die Beleuchtungsstärke wird als 16-Bit-Wert ausgeliefert.
Damit wäre bei 65535 Lux Schluss. Das IC ist jedoch in der Lage, auch
direktes Sonnenlicht zu messen - man kann daher die Empfindlichkeit um
den Faktor 2 oder 4 herabsetzen und so den Messbereich (bei
verringerter Auflösung) auf 220000 Lux ausweiten.
Für eine softwaremäßige Umschaltung wurde es im Flash des
ATtiny 13 schon etwas eng. Beigefügt sind daher zwei Programme für den
seriellen Modus (TSL-TTY-hi.bas und TSL-TTY-lo.bas). Die Morsevariante
nutzt nur den empfindlichsten Bereich, da mir der interessanter schien.
Download: Morse-Luxmeter-soft.zip
Quellcode (Terminal-Variante):
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 8
$framesize = 8
Config Scl = Portb.3 'Ports fuer IIC-Bus
Config Sda = Portb.4
Config I2cdelay = 20
Const Slaveid = &H52 ' 8-bit-Adresse (umgewandelte 7-bit-Adr. &H29)
Const Slave_read = &H53
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Dim Lux As Word
Dim Lob As Byte
Dim Hib As Byte
I2cinit
I2cstart
I2cwbyte Slaveid
I2cwbyte &H80 ' &H00 AND &H80 -> Command register
I2cwbyte &H03 ' normal operation
I2cstop
Waitms 100
I2cstart
I2cwbyte Slaveid
I2cwbyte &H81 ' H01 AND &H80 -> Control register
I2cwbyte &H02 ' M = 4, T = 100ms (Multiplikator und Messzeit)
' I2cwbyte & H00 ' M = 1, T = 400 ms -> Lux-Maximum 65535
I2cstop
Do
I2cstart
I2cwbyte Slaveid
I2cwbyte &H84 ' &H04 AND &H80 -> Data Lowbyte
I2cstart
I2cwbyte Slave_read
I2crbyte Lob , Ack
I2crbyte Hib , Ack ' Register wird beim Lesen inkrementiert -> Data Highbyte
I2cstop
Lux = Makeint(lob , Hib)
If Lux > 12500 Then ' ab 50000 Lux wird in 100er- Schritten angezeigt
Lux = Lux / 25
Print #1 , "Helligkeit: " ; Lux ; "00 Lux"
Else
Shift Lux , Left , 2 ' entspricht * 4
Print #1 , "Helligkeit: " ; Lux ; " Lux"
End If
Waitms 100
Loop
End