Jython

15. Hochpräzise Sensoren

Da Lego EV3 das I2C-Protokoll für die Kommunikation mit den Sensoren unterstützt, können auch einige weitere Sensoren an den EV3-Sensorports angeschlossen werden.

In diesem Kapitel werden drei preisgünstige Präzisionssensoren beschrieben:

  • ADXL Beschlunigunssensor
  • Sensirion SHT31 Temperatur- und Feuchtigkeitssensor
  • BME280 Temperatur-, Feuchtigkeit- und Luftdrucksensor

Bezugsquelle: www.mouser.ch

Für den Anschluss am EV3 sind kleine Lötarbeiten erforderlicht.

 

Beispiel 1: ADXL345 Digitaler 3-Achsen-Beschleunigungssensor

Der kleine und energieeffizienter Beschleunigungssensor eignet sich gut für die Anwendungen in den mobilen Geräten. Der Sensor misst die Beschleunigung (inkl. Erdbeschleunigung) in x-, y, und z-Richtung. Seine hohe Genauigkeit ermöglicht eine Messung von Neigungsänderungen von weniger als 1,0°.

 

Um den Sensor am EV3-Sensorport anzuschliessen, schneidet den EV3-Verbindungskabel auf, abisoliert die 4 Kabel, und lötet das rote Kabel bei GND, das grüne bei VCC, das blaue bei SDA und das gelbe bei SCL an.

Im Programm gibt die Funktion getValues() ein Tupel mit x-, y, und z-Komponenten der Bescheunigung zurück. Diese werden mit drawString("%.2f,%.2f,%.2f" %v, 0, 1) formatiert mit 2 Dezimalstellen in der Zeile 0 an der Position 1 auf dem EV3-Display angezeigt. Mit dem Befehl print("%.2f,%.2f,%.2f" %v) werden die drei Beschleinigungskomponenten formatiert im Terminalfenster angezeigt.

 


# Ro15a.py ADXL345

from ev3robot import *

robot = LegoRobot()
adxl = ADXLSensor(SensorPort.S1)
robot.addPart(adxl)
while not robot.isEscapeHit():
    v = adxl.getValues()
    robot.clearDisplay()
    robot.drawString("(%.2f,%.2f,%.2f)" %v, 0, 1)
    print("%.2f,%.2f,%.2f" %v) 
    Tools.delay(100)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

ADXLSensor(SensorPort.S1): erzeugt ein Sensorobjekt am Sensorport 1
print(v): liefert die x-, y- und z-Komponente der Beschleingung als Tupel mit 3 Zahlen mit 10 Dezimalstellen
print("%.2f,%.2f,%.2f" %v): formatierte Ausgabe. Die x-, y- und z-Komponenten werden mit 2 Dezimalstellen angezeigt
clearDisplay(): löscht die Anzeige auf dem EV3-Display

 

Beispiel 2: Sensirion SHT31 Temperatur und Feuchtigkeitssensor.

Der Sensirion SHT31 ist ein billiger und vielseitig einsetzbarer digitaler Temperatur- und Feuchtigkeitssensor hoher Präzision mit einer I2C-Schnittstelle. Interessant sind solche Messungen insbesondere zusammen mit Datenübertragung, wenn der EV3 die Temperatur und Luftfeuchtigkeit misst und diese Daten über das Internet an einen Computer oder Smartphone liefert. Die abisolierten Kabel Kabel müssen ähnlih wie im Beispiel 1 angelötet werden.

# Ro15b.py, Sensirion

from ev3robot import *

robot = LegoRobot()
sht = SHTSensor(SensorPort.S1)
robot.addPart(sht)
while not robot.isEscapeHit():
    values = sht.getValues()
    robot.clearDisplay()
    robot.drawString("Temp: " + str(values[0]), 0, 2)
    robot.drawString("Humi: " + str(values[1]), 0, 3)
    print("Temp: " + str(values[0]),"Humi: " + str(values[1]))
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

SHTSensor(SensorPort.S1): Erzeugt ein Sensirionsensorobjekt am Sensorport 1
sht.getValues(): Gibt die Sensorwerte zurück als Liste mit zwei Werten

 

Beispiel 3: BME280 Temperatur-, Feuchtigkeit- und Luftdrucksensor
Mit einem Logger kann die Temperatur über eine längere Zeit gemessen werden. Der Temperaturverlauf wird im Koordinatensystem dargestellt.

# Ro15c.py, BME280
from ev3robot import *

robot = LegoRobot()
bme = BMESensor(SensorPort.S1)
robot.addPart(bme)
while not robot.isEscapeHit():
    v = bme.getValues()
    robot.clearDisplay()
    robot.drawString("t: %.2f degC" %v[0], 0, 0)                      
    robot.drawString("h: %.2f %%" %v[1], 0, 1)                      
    robot.drawString("p: %.2f hPa" %v[2], 0, 2)                      
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

BMESensor(Sensorport.S1): Erzeugt ein Sensorobjekt
bme.getValues(): Gibt die Sensorwerte als Liste mit drei Werten zurück