umweltsensoren

8. UMWELTSENSOREN

 

 

DU LERNST HIER...

 

mit dem Temperatur-, Feuchtigkeit- und Luftdrucksensor die Umweltbedingungen erfassen und einfache Regelungssysteme programmieren. Interessant sind Umweltsensoren insbesondere im Zusammenhang mit den IoT-Anwendungen, wie du im Kapitel Internet of Things sehen kannst.

 

 

HOCHPRÄZISE UMWELTSENSOREN

  Da Lego EV3 das I2C-Protokoll für die Kommunikation mit den Sensoren unterstützt, können nicht nur die Lego-Sensoren, sondern auch andere hochpräzise Sensoren an die EV3-Sensorports angeschlossen werden. Die TigerJython-Robotik-Bibliothek unterstützt
  • SHT31 Temperatur- und Feuchtigkeitssensor
  • BME280 Temperatur-, Feuchtigkeits- und Luftdrucksensor
  • ADXL345 Beschleunigungssensor
Diese Sensoren sind nicht so robust verpackt wie die LEGO-Sensoren, dafür viel günstiger.


 

 

Um die Sensoren am EV3 anzuschliessen, sind einige Lötarbeiten notwendig. Du schneidest ein EV3-Verbindungskabel auf, isolierst die darin enthaltenen Kabel ab und lötest 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) kannst du abschneiden.



 
 
Sensirion SHT31
 
GY-SHT31
 
BME280

Sensoren mit einem angelöteten EV3-kabel können bei der TigerJython Group (TJ Group) bestellt werden. 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.

 

 

MUSTERBEISPIELE

 

Beispiel 1: Temperatur mit SHT31-Sensor

Im ersten einfachen Beispiel wird die Umgebungstemperatur im Terminalfenster angezeigt. Ist der Sensirion SHT31 oder der billigere GY-SHT31- Sensor am EV3-Port 1 angeschlossen, liefert der Befehl temp, hume = sht1.getValues() ein Tupel mit Temperatur (Grad C) und Luftfeuchtigkeit (%). Mit print(temp) wird die aktuelle Temperatur, mit print(humi) die Feuchtigkeit und mit print(temp, humi) werden die beiden Werte im Terminalfenster angezeigt. delay(500) legt die Messperiode von 500 ms fest. Der Sensor reagiert schnell auf die Umgebungsänderungen. Sobald du z. B. den Sensor mit den Fingern berührst, werden höhere Temperatur und Feuchtigkeitswerde angezeigt. Die Programmausführung wird mit Schliessen des Terminalfensters beendet.

 




from grobot import *

repeat:
    temp, humi = sht1.getValues()
    print(temp)
    delay(500)
► In Zwischenablage kopieren

Wenn sich der EV3 nicht in der Nähe deines Computers befindet, oder wenn du das Beispiel mit Online-Editor ausführst, kannst du die Sensorwerte auf seinem LCD-Display anzeigen. Dazu verwendest du anstelle des Befehls print() den Befehl
drawString("Temperature: " + str(temp), 2, 2)
Die Temperatur wird an der Position 2 in der zweiten Zeile des Displays angezeigt.

Beispiel 2: Temperatur und Feuchtigkeit mit formatierter Ausgabe
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. Willst du nur die Temperatur mit einer Dezimalstelle anzeigen, schreibst du:
print("Temperatur: %6.2f" % temp)
.


Im nächsten Programm werden die Sensorwerte formatiert angezeigt und zusätzlich kann das Programm auch mit Drücken der Escape-Taste auf dem EV3 beendet werden.

 

 


from grobot import *

while not button_escape.was_pressed():
    temp, humi = sht1.getValues()    
    print("Temp: %6.2f, Humi: %6.2f" % (temp, humi))
    delay(500)
exit()
► In Zwischenablage kopieren

Um die Werte auf dem EV3-Display anzuzeigen, verwendest du die Befehle
drawString("Temp: %6.2f" % (temp), 1, 1)
drawString("Humi: %6.2f" % (humi), 1, 3)

Dabei wird die Temperatur in der 1. Zeile und die Feuchtigkeit in der 3. Zeile angezeigt.



Beispiel 3: Wetterstation mit BME280 Sensor

Der BME280 von Bosch kannst du Temperatur, Luftfeuchtigkeit und Luftdruck messen. Er eignet sich daher perfekt für eine Wetterstation oder einen Raumsensor. Die Sensorwerte werden mit dem Befehl bme1.getValues() registriert und als Tupel v gespeichert. Bei der Ausgabe verwendest du die Komponenten v[0], v[1] und v[2].

 

 


from grobot import *

while not button_escape.was_pressed():
    v = bme1.getValues()
    print("t: %6.2f, h: %6.2f, p: %6.2f"  % (v[0], v[1], v[2]))
    delay(500)
exit()
► In Zwischenablage kopieren

 

Gleich wie beim Sensirion-Sensor, kannst du auch hier nur die einzelnen Sensorwerte anzeigen.

from grobot import *

repeat:
    temp,humi,p = bme1.getValues()
    print(temp)
    drawString("Temp: " + str(temp), 2, 2)
    delay(500)
► In Zwischenablage kopieren

 

Beispiel 4: Temperatur-Regelung
Wie funktioniert ein Regelungssysteme? Ein Temperatursensor misst die aktuelle Temperatur (Istwert) und liefert ihn an den Regler. Dieser vergleicht ihn mit dem gewünschten Wert (Sollwert). Ist der aktuelle Wert kleiner als Sollwert, wird die Wärmequelle eingeschaltet, ist er höher als der Sollwert, wird sie ausgeschaltet. In der Regel wird als Sollwert nicht ein einziger Wert, sondern ein Werte-Bereich festgelegt.

In deinem Beispiel programmierst du eine Temperatur-Regelung. Der EV3 ist mit einem Temperatursensor ausgerüstet. Ausserdem brauchst du eine Wärmequelle (Lampe, Föhn, Heizung...), oder kannst du den Sensor vorsichtig mit deinen Fingern berühren. So lange die aktuelle Temperatur tiefer als der Sollwert ist, werden die roten LEDs eingeschaltet. Liegt der Temperaturwert beim Sollwert (zwischen 29 und 31°), sind die orangen LEDs eingeschaltet. Ist die Temperatur höher als der Sollwert, werden die LEDs ausgeschaltet.

from grobot import *

ts = 30 #sollWert

repeat:
    temp, humi = sht1.getValues()
    print(temp)
    if temp < ts - 1: 
        setLED(1)
    elif temp > ts - 1 and temp < ts + 1:
        setLED(3)    
    elif temp > ts + 1:
        setLED(0)   
    delay(300)
► In Zwischenablage kopieren

Auf dem gleichen Prinzip werden viele Regelsysteme aufgebaut. Anstelle der LEDs kann z.B. eine Heizung ein- und ausgeschaltet werden.

 

 

MERKE DIR...

 

Ist der SHT31 Sensor am Port 1 angeschlossen, liefert der Befehl sht1.getValues() ein Tupel mit zwei Werten (Temperatur in ° C und Luftfeuchtigkeit in %). Der BME280 Sensor liefert mit bme1.getValues() Temperatur, Feuchtigkeit und Luftdruck. Die Sensorwerte können mit dem Befehl print() im Terminalfenster oder mit dem Befehl drawString() auf dem EV3 Display angezeigt werden. Für die Anzeige wird oft eine formatierte Ausgabe verwendet.

 

 

ZUM SELBST LÖSEN

 

 


1.


Schliesse an den EV3 einen SHT31 oder einen BME280 Sensor an. Schreibe ein Programm, welches alle 500 ms die aktuelle die Luftfeuchtigkeit im Terminalfenster anzeigt.

 
 
2.

Der Temperatursensor misst mit der Messperiode von 500 ms die Temperatur. Ein neuer Messwert soll nur dann angezeigt werden, wenn er sich um mehr als ein 0.5 Grad vom vorhergehenden unterscheidet.

3.

Der Temperatursensor misst zu Beginn die Umgebungstemperatur und setzt diesen Messwert als Default-Wert. Danach wird alle 1000 ms die Temperatur gemessen. Wenn die Messerte um 2 Grad höher sind als der Default-Wert, wird ein Alarm ausgelöst und die roten LEDs eingeschaltet. Wenn die Temperatur wieder auf den Default-Wert gesunken ist, wird der Alarm und die roten LEDs ausgeschaltet.

4.

Ein EV3 mit einem Temperatur-Sensor soll seine Distanz zu einer Wärmequelle regeln, so dass die Temperatur in einem vorgegebenen Bereich liegt. Ist die aktuelle Temperatur niedriger als der Sollwert, beweg sich der Roboter rückwärts zur Wärmequelle, ist die Temperatur im Sollbereich, bleibt er stehen, Ist die Temperatur höher als der Sollwert, bewegt sich der Roboter vorwärts, weg von der Wärmequelle.

 

 

 

ZUSATZSTOFF

 

 


Grafische Darstellung der Sensorwerte

Die objektorientierte Bibliothek ev3robot ermöglicht es, die Programme im remote-Modus auszuführen, d.h. das Programm läuft auf dem Computer und die Sensorwerte werden laufend zurückgemeldet und können in einem Grafikfenster dargestellt werden.

Die nebenstehende Grafik stellt die Temperaturwerte des Sensirion - Sensors, der am Sensorport 3 angeschlossen ist, dar.

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 Grafik-Fenster wird mit makeGPanel (-5, 53, -3, 52) erzeugt. Es wird in der Regel etwas grösser gewählt, damit die Beschriftung der Koordinaten-Achsen sichtbar ist. pos(x, y) setzt den Grafikcursor an die gegebene Koordinate, draw(x, y) verbindet den aktuellen Punkt mit dem Punkt(x, y). Die x-Koordinate wird nach jedem gezeichneten Wert umd 1 vergrössert. Wenn sie das Ende des Fensters erreicht hat (x = 50), beginnt die Aufzeichnung wieder am linken Rand (x = 0). Weitere Erklärungen zu den Bibliotheken ev3robot und gpanel findest du unter www.jython.ch/ev3

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.S3)
robot.addPart(sht)
x = 0
while not robot.isEscapeHit():
    v = sht.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()
► In Zwischenablage kopieren

Du startest das Programm mit dem grünen Run-Pfeil. Danach erscheint eine Dialogbox, in der du die IP-Adresse deines Roboters eingeben musst. Die Temperaturwerte werden danach in einem Grafikfenster angezeigt.