Jython

15. Umweltsensoren


Erfassung der Umweltbedingungen wie Temperatur, Luftfeuchtigkeit und Luftdruck gehört zu wichtigen Aufgaben der Sensorik. Da Lego EV3 das I2C-Protokoll für die Kommunikation mit den Sensoren unterstützt, können nicht nur die Lego-Sensoren, sondern auch weitere Sensoren an die EV3-Sensorports angeschlossen werden. Interessant sind Umweltsensoren insbesondere im Zusammenhang mit den IoT-Anwendungen, bei welchen die gemessene Daten via WLan übertragen und auf einem Smartphone oder auf einem entfernten Computer angezeigt werden, wie man im Kapitel Internet of Things sehen kann.


In diesem Kapitel werden folgende hochpräzise Sensoren verwendet:

  • SHT31 Temperatur- und Feuchtigkeitssensor
  • BME280 Temperatur-, Feuchtigkeit- und Luftdrucksensor
  • ADXL Beschleunigungssensor

Um die Sensoren am EV3 anzuschliessen, sind einige Lötarbeiten notwendig.

 

Man schneidet ein EV3-Verbindungskabel auf, isoliert die darin enthaltenen dünnen Kabel ab und lötet das rote Kabel bei GND, das grüne bei VCC, das gelbe bei SCL und das blaue bei SDA an. Die übrigen zwei Kabel (weiss und schwarz) kann man abschneiden.

 
 
Sensirion SHT31
 
GY-SHT31
 
BME 280

Einsatzbereite Sensoren mit einem angelöteten EV3-kabel können bei der TigerJython Group (TJ Group) bestellt werden. Sensirion Sensirion SHT31 für Fr. 19.- , GY-SHT31 für Fr. 14.-, BME280 für Fr. 14.- (inkl Versandkosten). Die Lötarbeiten werden durch die Mitglieder der TJGroup vorgenommen. Die Bestellung erfolgt online mit folgendem Bestellformular:

Bestellung SHT31/BME280 mit Anschlusskabel für EV3

Bei Fragen senden Sie ein Email an admin@tjgroup.ch.

 

Beispiel 1: SHT31 Temperatur und Feuchtigkeitssensor.

Der Sensirion SHT31 ist ein vielseitig einsetzbarer digitaler Temperatur- und Feuchtigkeitssensor hoher Präzision mit einer I2C-Schnittstelle. Für die nachfolgenden Aufgaben kann auch der billigere GY-SHT31-Sensor verwendet werden.

Der Sensor gibt mit dem Befehle sht.getValues() ein Tupel mit zwei Messwerten temp und humi zurück. Im ersten Beispiel werden nur die Temperaturwerte mit der Messperiode von 1000 ms auf dem EV3 Display und im Terminalfenster (im direkten Modus im Ausgabefenster des TigerJython-Editors) angezeigt.

 
# Ro15a.py

from ev3robot import *

robot = LegoRobot()
sht = SHTSensor(SensorPort.S1)
robot.addPart(sht)
while not robot.isEscapeHit():
    temp, humi = sht.getValues()
    print(temp)
    robot.drawString("Temp: " + str(temp), 0, 2)
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren Ctri+V einfügen)

Erklärungen zum Programmcode:

SHTSensor(SensorPort.S1): Erzeugt ein Sensorobjekt am Sensorport 1
sht.getValues(): Gibt die Sensorwerte zurück als Tupel mit zwei Werten
print(temp): Gibt die Sensorwerte im Terminalfenster aus
robot.drawString(): Gibt die Sensorwerte auf dem EV3-Display aus

 

Beispiel 2: Formatierte Ausgabe der Sensorwerte

Die Sensorwerte sind Dezimalzahlen (float) mit mehreren nachkommastellen. Es ist deshalb vorteilhaft, eine formatierte Ausgabe zu verwenden. Der Formatstring enthält Platzhalter, welche für die Ausgabewerte die gesamte Anzahl Zeichen und die Anzahl Dezimalstellen angeben. Werte mit mehreren Dezimalstellen werden automatisch gerundet.  

# Ro15b.py

from ev3robot import *

robot = LegoRobot()
sht = SHTSensor(SensorPort.S1)
robot.addPart(sht)
while not robot.isEscapeHit():
    temp, humi = sht.getValues()
    print("Temp: %6.2f, Humi: %6.2f" % (temp, humi))
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren Ctrl+V einfügen)

Erklärungen zum Programmcode:

print("Temp: %6.2f, Humi: %6.2f" % (temp, humi)): Gibt die Sensorwerte im Terminalfenster formatiert mit zwei Dezimalstellen aus. Im direkten Modus werden die Werte im TigerJython-Fenster angezeigt.

 

Beispiel 3: BME280 Temperatur-, Feuchtigkeit- und Luftdrucksensor

Der Sensor BME280 von Bosch gibt die Temperatur in °C, Luftfeuchtigkeit in % und den Luftdruck in hPa (Hektopascal) zurück. Er eignet sich daher perfekt für eine Wetterstation oder einen Raumsensor.

v = bme.getValues() liefert die Sensorwerte als ein Tupel mit den Elementen v[0], v[1], v[2], die der Reihe nach Temp, Humi und Luftdruck bedeuten und im Terminalfenster oder auf dem EV3-Display angezeigt werden können.

Falls man nur die einzelnen Werte, z.B. die Temperatur anzeigen will, schreibt man
temp, humi, p = bme.getValues()
print(temp)

 
# Ro15c.py, BME280
from ev3robot import *

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

Erklärungen zum Programmcode:

BMESensor(Sensorport.S1): Erzeugt ein Sensorobjekt
v = bme.getValues(): Gibt die Sensorwerte als Tupel mit drei Werten zurück
v[0], v[1], v[2]: Sensorwerte Temperatur, Luftfeuchtigkeit, Luftdruck
drawString("t: %.2f %v[0], 0, 1): Zeigt den Temperaturwert mit 2 Dezimalstellen an der Position 1 in der zweiten Zeile auf dem EV3 Display an

 

Beispiel 4: Sensorwerte im Koordinatensystem darstellen (nur direkter Modus)

Im direkten Modus wird das Programm auf dem Computer ausgeführt. Die Sensordaten können daher laufend in einem Grafikfenster dargestellt werden. In der Bibliothek GPanel stehen die notwendigen Funktionen zur Verfügung.

Mit drawGrid(0, 50, 0, 50) wird ein Koordinatensystem gezeichnet, das den Bereich 0 bis 50 auf der x-Achse und 0 bis 50 auf der y-Achse darstellt. Das GPanel-Fenster wählt man in der Regel etwas grösser, damit die Beschriftung der Koordinaten-Achsen sichtbar ist.

Für die Temperaturmessung verwendet man den SHT31- oder den BME280-Sensor. In einer while-Schleife werden die Sensorwerte mit der Funktion draw(x, y) alle 1000 ms in die Grafik eingetragen. Damit die Temperaturkurve im richtigen Punkt beginnt, wird für x = 0 der Grafikcursor mit pos(x, temp) an den aktuellen Wert gesetzt (sonst ist er bei (0, 0)). Nach 50 Messwerten beginnt die Aufzeichnung wieder am linken Rand.

Da das Programm im Remote-Modus ausgeführt wird, muss er mit dem grünen Run-Pfeil gestartet werden.

 



#Ro 15d.py

from ev3robot import *
from gpanel import *

makeGPanel(-5, 53, -3, 52)
drawGrid(0, 50, 0, 50, "gray")
setColor("blue")
lineWidth(2)
robot = LegoRobot()
sht = SHTSensor(SensorPort.S1)
robot.addPart(sht)
#bme = BMESensor(SensorPort.S1)
#robot.addPart(bme)
x = 0
while not robot.isEscapeHit():
    v = sht.getValues()
    #v = bme.getValues()
    temp = v[0]
    if x == 0:
        pos(x, temp)
    else:
        draw(x, temp)    
    print(temp)
    x = x + 1 
    if x == 50:
        x = 0  
        clear()
        drawGrid(0, 50, 0, 50, "gray")              
    Tools.delay(1000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren Ctrl+V einfügen)

Erklärungen zum Programmcode:

from gpanel import *: Importiert die Grafikbibliothek GPanel
drawGrid(): Zeichnet das Koordinatensystem
pos(x, tem): Setzt den Grafikcursor an die Koordinate (x, temp)
draw(x, tem): Verbindet den aktuellen Punkt mit dem Punkt mit den Koordinaten (x, tem)
clear(): Löscht das Grafikfenster

Mehr zur grafischen Darstellung von Daten finden Sie im Lernprogramm Koordinatengrafik.


Beispiel 5
: ADXL345 Digitaler 3-Achsen-Beschleunigungssensor

Der kleine und energieeffiziente 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, lötet man wie beim SHT31 die im EV3-Verbindungskabel enthaltene Kabel an GND (rot), VCC grün), SDA (blau) und SCL(gelb).

Im Programm gibt die Funktion getValues() ein Tupel mit x-, y, und z-Komponenten der Beschleunigung 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 Beschleunigungskomponenten formatiert im Terminalfenster angezeigt.

 


# Ro15e.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 Beschleunigung 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

 


Aufgaben: Serie 15

1)

Schreibe ein Programm, welches mit einem SHT31- oder BME280-Sensor alle 500 ms die aktuelle Luftfeuchtigkeit misst und im Terminalfenster anzeigt. Ist die Feuchtigkeit höher als 60% werden die roten LEDs eingeschaltet, ist sie wieder tiefer, werden sie ausgeschaltet. Um die Luftfeuchtigkeit zu erhöhen, genügt es, eine kurze Zeit den Sensor mit den Fingern zu berühren.

 

 

 

2)
Der Roboter misst mit einem SHT- oder BME-Sensor alle 500 ms die Temperatur. Ein neuer Wert wird im Terminalfenster aber nur dann angezeigt, wenn er sich um mindestens 0.5° vom vorhergehenden unterscheidet. Die Anzeige erfolgt formatiert mit 2 Dezimalstellen.

 

 
3)
Nach dem Programmstart werden die Umgebungstemperatur und Luftfeuchtigkeit registriert und als "Default-Wert" gespeichert. Danach werden in regelmässigen Abständen von 1000 ms die aktuellen Temperatur- und Feuchtigkeitswerte gemessen. Wenn die aktuelle Temperatur um mehr als 2 Grad oder die Feuchtigkeit um mehr als 10% höher sind als die Default-Werte, wird ein Alarm ausgelöst. Wenn die Werte in den erlaubten Bereich gesungen sind, wird der Alarm ausgeschaltet.

 

 
4)
Wähle das passende Koordinatensystem und stelle die Messwerte eines Feuchtigkeitssensor in einem Grafik-Fenster dar.