Morse-Luxmeter mit I2C-Chip        

von Ralf Beesner, DK5BU                  
Elektronik-Labor   Projekte   AVR 




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



Elektronik-Labor   Projekte   AVR