Startseite>I<+>2<+>C-Workshop (Teil 27): UV-Sensor-Modul VEML6070
Aus Raspberry Pi Geek 10/2019

I<+>2<+>C-Workshop (Teil 27): UV-Sensor-Modul VEML6070 (Seite 2)

Nach den üblichen Importen kommt zunächst die Funktion riskLevel() zum Einsatz. Sie berechnet aus den rohen Sensordaten die Belastung durch die UV-Strahlung. 0 entspricht keiner Belastung, 1 niedriger Belastung und so weiter. Die Werte für die einzelnen Level stammen aus den Application Notes für einen RSET-Widerstand von 270 Kiloohm und einen IT-Wert von 1. Die Grenzwerte der Level-Übergänge befinden sich im Array mappingTable. Die For-Schleife durchläuft alle Werte dieses Arrays. Überschreitet ein Wert die passende Grenze, bricht die If-Anweisung die Schleife ab, und der aktuelle Wert für den Level wird zurückgegeben.

Die main()-Funktion baut zuerst die Verbindungen zu den zwei I2C-Adressen des Sensors auf. Dann schreibt sie an die Adresse 0x038h eine 0x04h, um das Timing auf 1 zu setzen. Danach wartet sie einen kleinen Moment, damit sich der Sensor auf die geänderten Werte einstellen kann. Jetzt liest das Programm die zwei Adressen aus und speichert die Rückgabewerte in den Variablen lsb und msb. Den eigentlichen Messwert value erzeugt eine kreative Bit-Operation, die msb um 8 Bit nach links schiebt und über ein ODER bitweise mit lsb kombiniert. Die letzten zwei Kommandos geben den rohen Messwert sowie das Level der Belastung aus.

Um das Programm auf der Konsole zu starten, verwenden Sie das Kommando go run uv.go. Nun lässt sich die UV-Strahlung von verschiedenen Lichtquellen ermitteln, wobei die Sonne vermutlich die höchsten Werte erreicht. Zum Testen halten Sie eine Sonnenbrille oder einen UV-Filter für eine Kamera vor den Sensor: Dann sehen Sie, ob die Testobjekte halten, was sie versprechen. Der Filter des Autors blockierte beispielsweise nur die Hälfte der UV-Strahlung.

Listing 2

# uv.go
package main
import (
  "fmt"
  "gobot.io/x/gobot/drivers/i2c"
  "gobot.io/x/gobot/sysfs"
  "time"
)
func riskLevel(value int) int {
  mappingTable:=[4]int{560, 1120, 1494, 2054}
  var level int
  for level=0;level<4;level++  {
    if(value <= mappingTable[level]) {break}
  }
  return level
}
func main() {
  bus,_ := sysfs.NewI2cDevice("/dev/i2c-1")
  device1 := i2c.NewConnection(bus,0x38)
  device2 := i2c.NewConnection(bus,0x39)
  defer func() {device1.Close();device2.Close()}()
  device1.WriteByte(0x04) // Initialisierung mit T=1
  sleep(200ms)
  lsb,_ :=device1.ReadByte()
  msb,_ :=device2.ReadByte()
  value := (int(msb)<<8)|int(lsb)
  fmt.Println(value)
  fmt.Println(riskLevel(value))
}

Fazit

Mit dem VEML6070 erhalten Sie einen Sensor, der Ihnen für wenig Geld eine hervorragende Möglichkeit gibt, den UV-Index zu ermitteln. Allerdings verwirrt das Datenblatt alleine etwas. Nimmt man aber die Application Notes dazu, schlüsseln sich die Zusammenhänge schnell auf. 

Der Autor

Martin Mohr entwickelte schon früh eine Vorliebe für alles, was blinkt. Eine Ausbildung zum Elektroniker verstärkte das noch. Nach einem Informatikstudium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte die alte Liebe zur Elektronik wieder.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland