Jython
Deutsch   English 

10. Internet of Things (IoT)


Durch den Einbau von WLAN-fähigen Mikrocontrollern können Geräte und Systeme (kurz "Dinge") über ein Netzwerk Daten und Informationen untereinander auszutauschen und mit übergeordneten Systemen kommunizieren. Das IoT ist ein zentraler Bereich der aktuellen Digitalisierung von Gesellschaft und Wirtschaft.

 


Es handelt sich um eine zukunftsgerichtete Technologie mit rasantem Entwicklungspotential. Im Zusammenhang mit IoT spricht man häufig von Web 3.0, einem Internet, in dem Systeme  mit Aktoren und Sensoren automatisch eine grosse Menge von Daten erfassen, auf Cloud-Servern speichern und durch weit entfernte Kommandozentralen gesteuert werden.

In diesem Tutorial wird anhand einfacher Beispiele nur ein grundlegendes Verständnis dieser Technologie vermittelt. Da der micro:bit keine Anbindung an des Internet ermöglicht, wird ein zusätzlicher leistungsfähiger Mikrocontroller als Coprozessor dazu geschaltet, der diese  Funktion übernimmt. Es handelt sich um den bekannten ESP32 von Espressif.   

 

Auf dem ESP32 wird eine (in MicroPython geschriebene) Firmware installiert, die für den Anwender des micro:bit vollständig transparent ist. Der ESP32 sieht vom Anwender des micro:bit wie ein gewöhnlicher Sensor aus, dem man über I2C  Befehle zusendet und der Antwortdaten (analog zu Messdaten) zurück sendet.

 

Anschluss des ESP32-Coprozessors (LinkUp)
Es gibt mehrere Möglichkeiten, den ESP am micro:bit anzuschliessen:

1. Als LinkUp-Modul auf dem Maqueen-Chassis (siehe Kapitel LinkUp einbauen)
2.

Über einen I2C-Hub mit Grove-Buchsen. Dazu lötet man am WEMOS ESP32 MiniKit-Modul ein Grove-kompatibles Kabel gemäss folgendem Bild an: Die Kabelentlastung kann durch Fixieren mit Heissleim erfolgen.

Der Anschluss am micro:bit erfolgt über einen Grove-kompatiblen Hub. Daran können auch weitere Sensoren angeschlossen werden. Beispiele:

Auf Breadboard, mit pinbit und Grove-Buchse Mit Didel mbHub (in Vorbereitung)

Download der Firmware: siehe Kapitel LinkUp einbauen.

Beispiel 1: Messwerte des Distanz-Sensors mit einem Smartphone oder PC abfragen
Webserver können dazu verwendet werden, Messwerte, wie z. B. Sensordaten, an eine Überwachungsstation zu übermitteln. Dazu wird eine HTML-Webseite dynamisch mit den Messwerten ergänzt. Mit irgendeinem Browser auf einem Smartphone oder PC können die Daten dargestellt und dem Webserver über einfach GET-Requests Information zugesendet werdenEs ist also keine spezielle Smartphone- oder PC-App nötig.

Mit SaveHTMLIot1.py wird der HTML-Code auf den ESP32 hochgeladen. Er enthält einen Format-Parameter %s,, der duch den Messwert ersetzt wird.

# SaveHTMLIot1.py
from linkup import *

html = """<!DOCTYPE html>
<html>
  <head> 
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="refresh" content="5">
  </head>
  <body> 
     <h2>Welcome to the mbRobot</h2>
     Current distance: %s<br>
  </body>
</html>
"""

print("Saving HTML...")
saveHTML(html)
print("Done")
► In Zwischenablage kopieren
 

 

Macht der Browser eine Abfrage der Webseite, so sendet er einen HTTP-GET Request an den Server. Dieser wird als ein Event aufgefasst, der auf dem micro:bit die Callbackfunktion onRequest() aufruft. Der Rückgabewert dieser Funktion ist ein Tupel oder eine Liste mit den Daten, die in der Webseite an Stelle der Formatparameter eingesetzt werden.

# WebIot1.py (GetDistance)
from linkup import *
from mbrobot import *

def onRequest(clientIP, filename, params):
   d = getDistance()
   return [d]


ipAddress = connectAP(ssid = "mySsid", password = "myPassword")
display.scroll(ipAddress, wait = False)
startHTTPServer(onRequest)
► In Zwischenablage kopieren
 

 

Erklärungen zum Programmcode:

connectAP() : Der ESP32 loggt sich auf dem bestehenden Accesspoint mit ssid und passwort ein und gibt die erhaltene IP-Adresse zurück. Diese wird auf dem Display angezeigt, da der Browser diese als URL verwenden muss
meta http-equiv="refresh" content="5": Mit diesem HTML-Tag wird die Webseite alle 5 Sekunden aktualisiert
d = getDistance(): Messwert des Ultraschallsensors
startHTTPServer(onRequest): Startet einen HTTP-Servers, der die GET-Requests mit der gegebenen Callbackfunktion behandelt. Der Aufruf ist blockierend.

 

Beispiel 2: Wasserstand online überwachen

Im Kapitel Physical Computing wurde der Wasserstand einer Pflanze mit dem micro:bit überwacht. Wenn man die Anlage mit einem ESP32 ergänzt, kann die Überwachung über das WLAN z.B. mit einem Smartphone vorgenommen werden.

Die micro:bit-Pins sind auch auf dem mbRobot zugänglich, so dass man sehr einfach mit Krokodilklammern einen Stromkreis aufbauen kann. Das eine Kabel verbindet man mit Pin1, das andere mit 3V  Bei niedrigem Wasserstand sind die Messwerte, die man mit dem Befehl pin1.read_analog() erhält, wesentlich kleiner als beim hohen Wasserstand, wenn die beiden Kontakte im Wasser sind. Im Browser des Smartphones oder PCs werden die Werte angezeigt.

 

Bemerkung: Pin0 wird auf dem mbRobot für den Lautsprecher verwendet. (Man kann die Verbindung aber mit einem Schalter unterbrechen.) Pin1 und Pin2 werden für den Ultrasonic-Sensor verwendet. Wenn man diesen entfernt, so sind die beiden Pins für eigene Anwendungen frei verwendbar.

Mit SaveHTMLIot2.py wird der HTML-Code hochgeladen. Er enthält einen Formatparameter %s, wo der Messwert erscheinen soll.

# SaveHTMLIot2.py
from linkup import *

html = """<!DOCTYPE html>
<html>
  <head> 
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="refresh" content="5">
  </head>
  <body> 
     <h2>Remote services</h2>
     Current humidity: %s<br>
  </body>
</html>
"""

print("Saving HTML...")
saveHTML(html)
print("Done")
► In Zwischenablage kopieren
 

 

Wenn durch einen ankommenden HTTP GET-Request die Callbackfunktion onRequest() getriggert wird, führt das Programm die Spannungsmessung mit read_analog() durch und liefert den Wert in einer Liste zurück. Dieser wird automatisch in der HTML-Seite an der Stelle des %s Parameters eingesetzt und diese dem Client zurück gesendet.

# WebIot2.py
from linkup import *
from mbrobot import *
from microbit import *

def onRequest(clientIP, filename, params):
   v = pin1.read_analog()
   return [v]

ipAddress = connectAP(ssid = "mySSID", password = "myPassword")
display.scroll(ipAddress, wait = False)
startHTTPServer(onRequest)    
► In Zwischenablage kopieren
 

 

Erklärungen zum Programmcode:

v = pin1.read_analog(): Misst die Spannung am Pin 1