Skip to content
Andreas Kugel edited this page Jun 18, 2021 · 47 revisions

English version here

Aufbau

Das Sensor-Setup erfordert 4 Komponenten plus Kabel. Vermutlich werden wir eine kleine Plattform für die Montage der Sensoren bereitstellen. Falls das nicht geht, wird unser Aufbau etwas unordentlicher sein, wie unten zu sehen. Es sollte jedoch gleich funktionieren.

Mikrocontroller

ESP32-basiertes Entwicklungskit [Atom Matrix] (https://m5stack.com/products/atom-matrix-esp32-development-kit)

TVOC-Sensor

TVOC / eCO2-Gassensoreinheit [SGP30] (https://m5stack.com/products/tvoc-eco2-gas-unit-sgp30)

Temperatursensor

Temperatur und Luftdruck [BMP280] (https://m5stack.com/collections/m5-unit/products/barometric-pressure-unitbmp280)

I2C Hub

Um alles miteinander zu verbinden, benötigen wir den [Hub] (https://wiki.seeedstudio.com/Grove-I2C_Hub/).

Kabel

Wir benötigen 3 Kabel, um Sensoren und Controller mit dem Hub zu verbinden. Sie haben unterschiedliche Länge, aber im Wesentlichen die gleiche Funktion.

Wir benötigen auch einen USB-Anschluss, um den Atom an Ihren Computer anzuschließen.

Software

Wir müssen ein Programm schreiben, um dem Mikrocontroller (dem atom, erinnerst du dich?) zu sagen, wie er die Sensorwerte lesen und wie er uns die Ergebnisse anzeigen soll.

Um dies zu erreichen, benötigen wir einige Werkzeuge, wie unten gezeigt:

Von links nach rechts gegen den Uhrzeigersinn:

  • Der Atom und die Sensoren
  • Ihr Computer, der mit einem USB-Kabel an den atom angeschlossen ist
    • Ihr Computer muss ein Programm namens M5Burn ausführen, das einige grundlegende Dinge mit dem Atom über das USB-Kabel erledigt.
    • Ihr Computer muss auf dem M5Stack-Server eine Webseite mit dem Namen UIFlow öffnen, auf der Sie das Programm für das Atom schreiben können. UIFlow stellt auch eine Verbindung zu Ihrem Atom her - nicht über USB, sondern direkt über das Internet. Dies ist der Grund, warum Ihr Atom auch eine Verbindung zum Internet herstellen muss. Sie müssen es also mit Ihren drahtlosen Anmeldeinformationen versehen. Dies geschieht mit M5Burn. Klingt kompliziert? Wir sind da, um zu helfen. Und es gibt eine Alternative mit USB (siehe weiter unten)
  • Der M5Stack-Server bietet Ihnen eine Liste aller Funktionen Ihres Sensorsystems und deren Verwendung. Es kümmert sich auch darum, Ihr Programm in ein für den Mikrocontroller geeignetes Format zu übersetzen: Computer lesen Zahlen, während Menschen Buchstaben und Wörter - oder Bilder - lesen.

Falls Sie noch nie ein Programm geschrieben haben: Haben Sie keine Angst! Wir erklären alles ganz einfach.

Falls Sie bereits mit Arduino oder ähnlichen Dingen vertraut sind: Ja, es gibt auch eine Überholspur: In der UIFlow IDE gibt es die Möglichkeit, den Python-Code umzuschalten. Schauen Sie sich das mit dem Beispielcode aus der Einführung an. Danach können Sie direkt in Python programmieren, nachdem Sie den Abschnitt Downloads erledigt haben.

Software-Downloads

Die Download-Seite von M5Stack bietet einige Programme für alle wichtigen Plattformen (Windows, MacOS und Linux):

Wir benötigen M5Burner. Bitte laden Sie die Version für Ihr Betriebssystem herunter und installieren Sie sie. Möglicherweise benötigen Sie auch den CP2104-Treiber (wahrscheinlich nicht unter Linux). Dies ist alles, was Sie brauchen, wenn Sie dem einfachen Weg folgen.

Die UIFlow-Desktop-IDE entspricht dem M5Stack-Server, sodass Sie die Entwicklungsumgebung direkt auf Ihrem Computer ausführen können. Diese Methode werden wir bevorzugt verwenden, da wir dann nicht unbedingt eine WiFi Verbindung für den Controller benötigen.

Achtung MAC User: Benutzen Sie bitte die beta-Version von UIFlow. Ggf. müssen Sie in den Systemeinstellungen die Installation nicht-signierter Programme gestatten.

Arduino-IDE ist eine völlig andere Art von Werkzeug. Während das Atom in Bezug auf das physikalische Layout kein Arduino ist, ist es weitgehend softwarekompatibel. Die M5Stack-Bibliothek ermöglicht Ihrer Arduino-IDE den Zugriff auf alle Funktionen des Atoms und der Sensoren. Kein Blockly und kein Python - aber darüber haben wir noch nicht gesprochen.

Weitere Infos und Anleitungen finden Sie bei M5Stack (auf Englisch)

Achtung: Diese Infos sind teilweise für einen anderen Controller als den Atom Matrix und nur auf englisch.

Einführung

Alle Controller, die vom ZKM verschickt wurden, sind bereits mit dem Startprogramm ausgerüstet. Es kann aber vorkommen, das beim Programmieren etwas schief geht und wir dann mit M5Burner diese Ausgangskonfiguration wieder herstellen müssen.

Zum Start packen wir alle Komponenten aus und verbinden Kontroller, Sensoren und den I2C Hub über die mitgelieferten Kabel. Diese 4-farbigen Kabel sind zwar unterschiedlich lang, aber sonst gleich. Man muss also nicht aufpassen, welches Kabel in welcher Schachtel war.

Das schwarze USB Kabel wird mit dem Computer verbunden und dann neben das I2C Kabel in den Controller gesteckt. Danach sollten alle LEDs am Controller rot leuchten.

Seitlich am Controller ist ein ausgeklinkter Schalter. Beim Drücken wird der Controller neu gestartet. Das ist der Reset-Knopf.

Die gesamte Fläche mit den LEDs ist ebenfalls ein Drucktaster. Man fühlt und hört den Click beim Drücken.

Click-Video

Der Controller kann in 3 Betriebsarten starten

  • Netzwerk Mode - zur Verbindung mit UIFlow im Internet
  • USB Mode - zur Verbindung mit UIFlow per USB
  • Anwendungsmode - Started die zuletzt programmierte Anwendung

Wie auch im Quickstart (oben) beschreiben.

Wenn wir die Controller normal einschalten - also das USB Kabel stecken, starten sie im Anwendungsmode. Ohne besondere Programmierung der LEDs werden dabei alle LEDs auf rot geschaltet, siehe oben.

Wenn Sie auf den LED Taster drücken (und gedrückt lassen) und dabei kurz auf den Reset Knopf, wechselt der Controller in einen Auswahlmodus, was durch Farbwechsel grün - blau - gelb/violett angezeigt wird.

Select-Video

Der Zeitpunkt, zu dem Sie den LED Taster loslassen, bestimmt dann die weitere Betriebsart. Zur Arbeit mit UIFlow im USB Modus müssen wir bei blau loslassen. Das LED Feld bleibt dann auch blau. Falls nicht, war es zu schnell oder zu langsam - bitte nochmal versuchen.

Wenn die LEDs blau leuchten, können Sie die UIFlow IDE starten. Wählen Sie die richtige "COM" Schnittstelle und den Controller links in der zweiten Reihe, das ist der Atom Matrix.

Aber was ist die "COM" Schnittstelle? Je nach Rechner und Betriebssystem wird die USB Verbindung zum Controller entweder sofort gefunden, oder nicht. Dann muß noch ein zusätzliches Programm installiert werden, der CP2104 Treiber, wie oben angegeben. Wenn das erledigt ist, sollte im AUswahlfeld bei "COM" etwas zu finden sein. Ggf muss man verschiedene Einstellungen testen, auf "Refresh" clicken und schauen, ob "Connected" angezeigt wird (beides links unten im UIFlow Fenster).

Bitte starten Sie die UIFlow IDE neu, nachdem Sie den Treiber für die COM Schnittstelle installiert und den Controller per USB angeschlossen haben. Evtl ist auch ein Neustart Ihres Computers nötig.

Wenn "Connected" angezeigt wird, sind Sie bereit, das erste Programm auf den Controller zu laden. Ein Beispielprogramm findet sich im Repository an dieser Stelle (rechts klicken zum Herunterladen). Es kann sein (vor allem mit einem MAC), dass das Beispiel beim Herunterladen eine andere Dateiendung bekommt und dadurch nicht mehr von UIFlow erkannt wird. Dann entweder wieder umbenennen in example1.m5f oder das ganze Repository als ZIP Datei herunterladen und dann entpacken. Die Datei ist dann im Unterverzeichnis tvoc.

Laden Sie das Programm auf den Rechner und öffnen Sie es mit UIFlow über das Menü oben rechts: Open

Das Programm wird dann auf den Controller geladen, auch über das Menü oben rechts mit Download. Danach sollte es auf dem Controller ausgeführt werden wie hier zu sehen

Wenn das funktioniert, können Sie noch mit weiteren grundlegene Beispielen arbeiten, bevor Sie Ihre ganz eigenen Programme entwickeln:

Achtung: Wenn Sie mit M5Burner die Konfiguration auf den Controller schreiben, wird dabei auch eine WLAN Konfiguration erzeugt. Wenn Sie hier nichts oder nicht die richtige Konfiguration eingeben, wird der Controller möglicherweise nach dem Start sehr lange versuchen, eine Verbindung mit ungültigen Daten aufzubauen. Dabei erfolgt keine LED ANzeige - die Anzeige am Controller bleibt schwarz. Die oben beschriebene Methode zur Auswahl des USB-Modus sollte trotzdem funktionieren, spätestens nachdem Sie das USB Kabel gezogen und wieder gesteckt haben.

Grundlegende Beispiele

Konfiguration des Systems

Beim Erstellen eines neuen Programms in UIFlow müssen nebem dem richtigen Controller Atom Matrix noch die beiden Sensoren konfiguriert werden. Dies erfolgt im linken Panel durch hinzufügen der entsprechenden Units, beim großen + Zeichen.

Markieren Sie die Units BPS und TVOC in der Auswahl.

Danach sind bei den Features im mittleren Panel unter Units die beiden Sensoren sichtbar.

Für jeden der beiden Sensoren werden dann beim Anklicken verschiedene Funktionen zur Auswahl bereitgestellt. Beim BPS Sensor sind das beispielsweise getTemperature und getPressure.

Beim TVOC Sensor werden vergleichbare Funktionen angeboten. Die Ansteuerung für die LEDs finden Sie bei Hardwares/RGB.

Die anderen Features, die in folgenden Beispielen verwendet werden, sind weiter unten in den Kategorien

  • Logic
  • Math
  • Loops
  • Timer
  • Variables

Mit etwas Auspropieren finden Sie sich sicher zurecht.

Beachten Sie bitte, dass alle Funktionen, die Sie zum Programm hinzufügen, einen zusammenhängenden Block bilden müssen, der unterhalb des gelben SETUP Symbols eingefügt wird (das gilt jedenfalls für die einfachen Beispiele hier zu Beginn).

Auslesen des Temparatur Sensors

Der Sensor soll nicht nur einmal ausgelesen werden, sondern dauerhaft. Dazu benötigen Sie eine While-Schleife aus den Loops. Fügen Sie als Bedingung das einfache True Symbol aus der Kategorie Logic ein. Innerhalb der Schleife lesen Sie den Sensor aus und zeigen je nach Temperatur unterschiedliche Farbmuster auf der LED Matrix an. Im Beispiel sind folgende Bereiche vorgesehen:

  • <20°
  • <22°
  • <25°
  • <27°
  • Sonst

Für die Abfrage verwenden Sie den Vergleichs-Operator = aus der Abteilung Logic. Den Operator ändern Sie auf kleiner <, davor fügen Sie eine Abfrage des Sensors get "bps0" temperature ein und danach den Temperaturwert aus der Abteilung Math.

Die Abfragen können nicht mit mehreren einfachen IFs untereinander geschrieben werden, sondern sie müssen geschachtelt werden:

Da die grafische Blockly Programmierung in Python übersetzt wird, kann dies auch mit der einfacheren else-if Syntax geschrieben werden. Das else-if erzeugen Sie über das oberste if (mit dem Zahnradsymbol) in der Abteilung Logic. Mit dem Zahlrad können unter dem ersten if weitere else-if und der abschliessende else Zweig eingestellt werden.

Der Block Wait 1s am Ende dient in diesem Fall nur zum Stromsparen, da Abfrage und Anzeige nicht mit höchster Geschwindigkeit durchgeführt werden müssen.

Durch Verwendung einer Variablen lässt sich noch eine Optimierung erreichen. Die variable wird in der Abteilung Variables mit einem beliebigen Namen definiert, z.B. temperature und kann anschliessend auch hier abgerufen werden. Dann wird zu Beginn der Schleife der Sensor ausgelesen und der Wert in der Variablen gespeichert. Danach wird in den Vergleichsoperationen die Variable benutzt, aber keine Sensorabfrage mehr durchgeführt. Diese Methode verringert die Anzahl der Zugriffe auf den Sensor innerhalb eines Schleifendurchgangs. Zugriffe auf Variablen sind schneller und energieeffizienter.

Laden Sie jetzt das Programm tvoc-loop aus dem Code-Repository auf Ihren Controller. Nach dem Start wird üblicherweise die blaue oder grüne Anzeige aktiv sein. Wenn Sie den BPS Sensor erwärmen, z.B. mit der Hand oder Atemluft, sollte sich die Temperaturanzeige verändern. Beachten Sie bitte, dass der Sensor erwärmt wird, nicht der Controller.

Auslesen des TVOC Sensors

Der TVOC Sensor bietet nicht nur 2, sondern 8 Werte an. Im Moment ist aber nur der eCO2-Wert von Interesse. Die übrigen Werte können aus dem Datenblatt des Sensors beim Hersteller Sensirion abgeleitet werden. Die Beschreibung von M5Stack enthält leider nicht alle Angaben.

Die Benutzung erfolgt analog zum Temperatursensor. Der vom Sensor berechnete eCO2 Wert entspricht ungefähr dem CO2 Gehalt in der Raumluft und wird in ppm (parts per million) angegeben. Vom CO2-Anteil kann auf das Raumklima geschlossen werden. Üblicherweise liegt der CO2-Gehalt bei etwa 400ppm. Weniger als 300ppm deuten auf einen Defekt des Sensors oder falsche Programmierung hin. Der "grüne Bereich" liegt etwa zwischen 400 und 800-1000ppm. Wie schnell es darüber hinaus "schlecht" wird, ist etwas schwierig zu definieren. Wir verweisen z.B. auf den Bericht des Umweltbundesamtes. Zitat:

In Finnland beträgt die maximal zulässige CO2-Konzentration in der Innenraumluft bei üblichen Wetterbedingungen 1200 ppm. Die norwegischen und schwedischen Richtlinien sehen für Wohnräume, Schulen und Büroräume eine maximale CO2-Konzen-tration von 1000 ppm vor.

Als sehr grobe Richtwerte eignen sich die Bereiche:

  • Bis 1000ppm: unbedenklich
  • 1000 - 2000ppm: Lüften notwendig
  • Über 2000ppm: Raum verlassen

Der TVOC Sensor reagiert recht empfinglich auf Anblasen, die Werte gehen dabei teils weit über 5000ppm hinaus.

Zusammenfassung

Sie sind jetzt in der Lage, die grundlegende Werte CO2 und Temperatur aus den beiden Sensoren auszulesen, die Werte bestimmten Bereichen zuzuordnen und eine passende Anzeige auf der LED Matrix zu realisieren.

Fortgeschrittenes Beispiel

Sie benötigen hierfür die Zugangsdaten Ihres WLANs und ein Token aus dem Workshop

Der Atom Matrix Controller hat nicht nur eine LED Anzeige, sondern kann auch über Ihr WLAN eine Internetverbindung herstellen, über die Sie die Sensordaten zu einem Server schicken können.

Wir haben dafür ein öffentliches Dashboard eingerichtet. Wenn Sie im Workshop ein Token und eine Nummer dazu erhalten haben, sehen Sie Ihre Sensordaten dort unter dieser Nummer.

Das Programm liest in einer Schelife die beiden Werte aus und überträgt sie mit einem HTTP POST Request an den OK Lab Server.

Sie müssen nur Ihre WLAN Zugangsdaten und das Token eintragen. Falls Fehler auftreten, können Sie anhand der Farbcodierung heruasfinden, an welcher Stelle das Problem liegt. Wenn alles klappt, sollte die Anzeige zwischen blau-grün (Start der Übertragung) und grün (Übertragung abgeschlossen) pedeln. Die Wartezeit ist auf 15 Minuten voreingestellt. Sie sollten diesen Wert nicht dauerhaft herabsetzen.

Den Code tvoc-net finden Sie im Code-Repository.

Sie können auch die übrigen Sensordaten zum Dashboard übertragen. Bitte verwenden Sie dazu folgende keys

  • pres (Luftdruck vom BPS)
  • h2 (h2 und restliche Werte vom TVOC)
  • eth
  • tvoc
  • baseiaq
  • baseco2
  • basetvoc

Einen neuen key legen Sie über das + unten im Block create map an.

Achtung: Wenn die WLAN-Zugangsdaten nicht korrekt sind, wird der Verbindungsaufbau sehr oft wiederholt. In dieser Zeit findet keine LED Anzeige statt. Falls Sie nach der Programmierung gar keine Anzeige sehen, ist vermutlich das WLAN nicht richtig konfiguriert.

Veröffentlichen auf OpenSenseMap

Sie können Ihren Sensor auch auf OpensenseMap registrieren und die Daten in ähnlicher Weise wie oben veröffentlichen.

OpensenseMap ist eine öffentlich Plattform zur Visualisierung von Sensordaten. Sie bietet verschieden Möglichkeiten, Daten hochzuladen. Wir werden dazu HTTP Post Requests verwenden.

Ein Beispiel ist unser Sensor OK-Box-01

Man findet den Sensor auf der OpenseneMap Seite entweder durch Auswahl auf der Karte, oder über das Suchfeld oben.

Die letzten Daten werden rechts in der Leiste angezeigt. Man kann auch die Daten für eine längere Zeit herunterladen.

und z.B. als Zeitreihe darstellen.

Starten Sie auf OpensenseMap und registrieren Sie sich als neuer Benutzer.

Danach registrieren Sie eine neue Box, d.h. ein Geräte mit Sensoren. Diese Aufteilung in Gerät und Sensor ist typisch bei Opensensemap und auch sonst recht gebräuchlich.

Für dieses Beispiel legen Sie ein neues "custom" Gerät an und fügen anschliessen den Sensor hinzu.

Die Übersicht hier zeigt bereits 2 Boxen, legen legen jetzt über New Sensebox eine neue an.

Für jede Box wird hier die ID angezeigt, diese werden Sie später benötigen, um Daten hochzuladen.

Zunächst müssen Sie den Bedingungen zustimmen.

Beginnen Sie bei der Konfiguration mit den allgemeinen Daten zu Ihrem Gerät.

Dann kommt der Standort, der wahrscheinlich über die Ortserkennung schon eingetragen ist. Überprüfen Sie das.

Jetzt legen wir im Abschhnitt Sensors neuen Sensor vom Typ "Temperatur" an.

Dazu wählen wir das passende Symbol und den Typ Temperatur, als Einheit °C und als Typ BMP280, das ist der Sensorbaustein in unserem Modul.

Wir klicken auf Next und prüfen auf der nächsten Seite die Daten, dann auf Finish

Im Dashboard sehen Sie jetzt die Box, notieren Sie die ID. Dann gehen Sie auf Edit, danach sehen Sie Ihre Box und können eine Beschreibung eingeben.

Im Abschhnitt Sensors sehen die Ihren Sensor, notieren Sie auch hier die ID. (Im Bild sind 2 Sensoren zu sehen)

Nun gehen Sie zu den Sicherheitseinstellungen. Aktivieren Sie "enable authentication" und erzeugen ein neues Token, sofern noch keins da ist. Kopieren Sie das Token (Auge anklicken) in die Datei zu den IDs.

Wir werden nun mit dem Beispiel im Repository die Sensordaten zu OpensenseMap übetragen.

Die Kennung für die Box "BOXID" und für den Sensor "SENSORID", sowie das "Access-Token" benötigen wir, damit OpensenseMap uns erkennt und weiß, für welchen Sensor wir Daten schicken. Weiterhin benötigen Sie den Zugang zu Ihrem WLAN, damit der Atom die Daten zu OpensenseMap übertragen kann (wie beim vorherigen Beispiel). Tragen Sie die Daten für SSID und WIFI-PASSWORD ein.

Danach wird der Atom reglemäßig die Temperatur übertragen, was Sie auf der OpensenseMap Webseite verfolgen können.

Wenn dies funktioniert, können Sie für den CO2-Wert und den Luftdruck entsprechend weitere Sensoren zu Ihrer Box hinzufügen und das Programm erweitern. Bei OpensenseMap erfolgt für jeden einzelnen Wert eine separate Übertragung, d.h. es wird jedesmal ein neuer POST Block mit einem anderen Wert für "SENSORID" benutzt.

Der vereinfachte Python Code (ohne Sensorabfrage und LED Anzeige) ist hier:

from m5stack import *
from m5ui import *
from uiflow import *
import time
import wifiCfg
import urequests

t = 20.1

wifiCfg.doConnect('wifi_ssid', 'wifi_pwd')


# Describe this function...
while True:
  if wifiCfg.wlan_sta.isconnected():
    t = t + .5
    wait(1)
    try:
      req = urequests.request(method='POST', url='https://api.opensensemap.org/boxes/BOXID/SENSORID',\
                              json={'value':t}, headers={'Authorization':TOKEN,'content-type':'application/json; charset=utf-8'})
      print(req.status_code)
      print(req.text)
      if (req.status_code) == 201:
        wait(1)
      else:
        wait(1)
    except:
      wait(1)
  wait(900)

Damit läßt sich das Atom Programm einfach erweitern.