Jython

17. Internet of Things (IoT)


Das IoT ist eines der aktuellsten Themen der heutigen Informatik. Durch Einbau von kleinen, billigen aber WLAN-fähigen Microcontrollern können Geräte und Systeme (kurz Dinge) über ein Netzwerk Daten und Informationen untereinander und mit übergeordneten Systemen kommunizieren. Im Zusammenhang mit IoT spricht man häufig von Web 3.0, einem Internet, in dem Systeme mit Sensoren automatisch eine grosse Menge von Daten erfassen, auf Cloud-Servern speichern und durch weit entfernte Kommandozentralen gesteuert werden.

Auch mit dem EV3 kann man einfache IoT-Anwendungen programmieren.

 

Beispiel 1: Messwerte des Ultraschallsensors per WLAN zur Verfügung stellen


Man übernimmt das Konzept aus dem vorhergehenden Kapitel. Mit dem Programm wird eine einfache Webseite auf den Roboter hochgeladen. Diese dient aber nicht zur Steuerung des Roboters, sondern zum Anzeigen der Sensorwerte.

 

Der Roboter misst die Distanz zum Hindernis und stellt diese Werte auf der Webseite zur Verfügung. Diese kann mit einem Webbrowser auf einem Smartphone oder PC angezeigt werden.

Die Webseite besteht nur aus einer Überschrift und einer zweiten Zeile, in der die Distanz angezeigt wird. %s ist ein Platzhalter für den Messwert, welchen der Ultraschallsensor zurückgibt. Der zweite Meta-Tag im HTML-Code bewirkt, dass die Webseite alle 3 Sekunden automatisch aktualisiert wird.

Wenn ein Benutzer im Webbrowser die IP-Adresse des Roboters + :81 (z.B. 192.168.0.22:81) wählt, wird die Webseite mit der aktuell gemessenen Distanz angezeigt. Die Kommunikation erfolgt wieder über den Port 81, da der Port 80 für den Programmdownload reserviert ist.

#Ro17a.py

from ev3robot import *

html = """<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="refresh" content="3">
  </head>
  <body> 
    <h2>WebRobot</H2> 
    Current distance: %s
  </body>
</html>
"""

def onRequest(clientIP, state, params):
   d = us.getDistance()
   return html %(d)   

robot = LegoRobot()
us = UltrasonicSensor(SensorPort.S1)
robot.addPart(us)
server = HTTPServer(requestHandler = onRequest, port = 81)

while not robot.isEscapeHit():
    Tools.delay(100) 
server.terminate()
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

<meta http-equiv="refresh" content="3">: die Anzeige der Webseite wird automatisch alle 3 Sekunden aktualisiert
return html %(d) : der aktuelle Messwert wird im HTML-Code eingefügt

 

Beispiel 2: Temperatur- und Luftfeuchtigkeit mit dem Sensirion-Sensor messen

Der Sensirion SHT31 ist ein billiger und vielseitig einsetzbarer digitaler Temperatur- und Feuchtigkeitssensor hoher Präzision. Interessant sind solche Messungen insbesondere zusammen mit Datenübertragung, wenn der EV3 die Temperatur und Luftfeuchtigkeit misst und diese Daten über das WLAN an einen Computer oder Smartphone liefert.

Für den Anschluss am EV3 sind kleine Lötarbeiten erforderlicht, dafür ist dieser Sensor viel günstiger als die Lego-Sensoren. Die genaue Beschreibung findet man im Kapitel Hochpräzise Sensoren.

 

Auf der werden die Aktuelle Temperatur und die aktuelle Luftfeuchtigkeit angezeigt. Der Sensor liefert die beiden Messwerte als Liste [temp, humi], wobei %s, %s die Platzhalter für diese Werte sind. Die Webseite wird alle 3 Sekunden automatisch aktualisiert.

Die Kommunikation erfolgt, wie in den vorhergehenden Beispielen über den Port 81, da der Port 80 für den Programmdownload reserviert ist.

 

#Ro17b.py

from ev3robot import *

html = """<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="refresh" content="3">
  </head>
  <body> 
    <h2>Sensirion Sensor</H2> 
    Current temperature: %s <br><br>Current humidity: %s
  </body>
</html>
"""

def onRequest(clientIP, state, params):
   temp, humi = sht.getValues()
   return html %(temp, humi)


robot = LegoRobot()
sht = SHTSensor(SensorPort.S1)
robot.addPart(sht)
server = HTTPServer(requestHandler = onRequest, port = 81)

while not robot.isEscapeHit():
    Tools.delay(100) 
server.terminate()
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

sht = SHTSensor(SensorPort.S1): erzeugt ein Sensirion-Sensor Objekt am Port 1
temp, humi = sht.getValues() : der Sensor gibt zwei Werte zurück
return html %(temp, humi) : beim HTTP-Request, d.h. wenn der Client die IP-Adresse des EV3 wählt werden die Werte temp und humi im HTML-Code angezeigt

 


Aufgaben: Serie 17

1)

Programmiere eine IoT-Anwendung, bei der der EV3 die Werte des Lichtsensors auf einer Webseite zur Verfügung stellt, so dass du diese mit deinem Smartphone anzeigen kannst.

 

 



2) Programmiere eine Alarmanlage. Ein Roboter mit einem Ultraschallsensor überwacht einen Raum. Du kannst jeder Zeit mit deinem Smartphone überprüfen, ob er ein Objekt oder eine Person in der Nähe detektiert. Der Roboter schaltet ausserdem ein Alarm ein (spielt einen Pipton ab).