Die Corona-Krise führt dazu, dass sich gerade jetzt und auf der Nordhalbkugel im Übergang vom Herbst zum Winter sich viele Gedanken machen, wie sie die Jahreszeit auch beim Aufenthalt in Innenräumen mit einem möglichst guten Gefühl in reiner Luft verbringen können. Genau diese Frage habe ich mir vor einiger Zeit gestellt und ich habe mir in der Folge ein CO₂-Messgerät aus Einzelkomponenten zusammengebaut und programmiert. Im heutigen Blogpost beleuchte ich den Software-Teil. Es braucht dazu keine Programmiererfahrung und ich mache den Code, den ich verwende, publik.
Im letzten Blogpost habe ich die notwendigen Komponenten für ein eigenes CO₂-Messgerät und ihren Zusammenbau beschrieben. Heute soll es darum gehen, wie man das Feather Huzzah Board von Adafruit programmiert, so dass es regelmässig die Luftqualitätsdaten vom Sensor bezieht und auf den gewählten zwei Display-Typen anzeigt bzw. visualisiert.
Auch in diesem Teil habe ich mich auf die sehr nützlichen Unterlagen abgestützt, die der Umwelt-Campus Birkenfeld der Hochschule Trier unter co2ampel.org anbietet. Die Inbetriebnahme benötigt softwaretechnisch zwei Schritte:
- das Bespielen des Boards mit Code, der die initiale Kalibration des Sensors vornimmt, und anschliessend
- die «Installation» der eigentlichen Software für den Betrieb des CO₂-Messgeräts.
Aber davor noch kurz zu:
Software für unser Board: Ardublocks und C
Der Umwelt-Campus Birkenfeld stellt die Funktionalität für seine CO₂-Ampel in Form von Ardublocks bereit. Ardublock ist eine grafische Programmierumgebung für Arduino und ähnliche IoT-Boards.

In der Ardublock-Umgebung kann man visuell programmieren: Blocks repräsentieren Komponenten (z.B. Sensoren), Werte, logische Strukturen und andere Programmbestandteile. Diese Blocks können quasi zusammengesteckt und in ein Programm strukturiert werden. Dazu hat die Ardublock-Umgebung einen setup-Teil, der nur einmal, beim «Starten» des Boards ausgeführt wird, und einen loop-Teil, der immer wieder von neuem durchlaufen wird (im loop-Teil wird sich der Code für das periodische Neu-Auslesen und Anzeigen von Sensormesswerten befinden). Ein mit Ardublock erstelltes Programm kann als abp-Datei abgespeichert werden. Intern wird es in ein C-Programm umgesetzt, das als ino-Datei gespeichert werden kann. Ich habe für meine Arbeiten Ardublock-Programme der Uni Trier als Vorlage genommen, meine Weiterentwicklungen dann aber direkt in C-Code geschrieben.
Vorbereitung
Unter co2ampel.org sind die wichtigsten Ressourcen gesammelt. Ich habe mich bezogen auf: Quickstart für die Konfiguration der Arduino-Umgebung (pdf), Beschreibung von alternativen Messwertanzeigen und den dafür notwendigen Ardublocks (pdf) und Aufstellhinweise und Beschreibung des Vorgehens zur Kalibrierung (pdf). Alle diese Ressourcen sind von dieser Seite aus verlinkt.
Für das Anschliessen des Boards an einen PC und das Bespielen mit Software (Ardublocks bzw. C-Code) sind folgende Schritte notwendig:
1. Installation eines speziellen Treibers: Wir benötigen den Treiber SP210x USB to UART Bridge VCP. Dieser kann unter Beachtung der üblichen Vorsichtsmassnahmen von Silicon Labs heruntergeladen und installiert werden.
2. Finden des COM-Ports: Windows vergibt dem USB-Interface einen virtuellen COM-Port. Wir benötigen für das spätere Bespielen des Boards die Nummer dieses COM-Ports. Um diese zu finden, schliesst man das Board mit einem USB-Kabel an den PC an. Dann öffnet man den Geräte-Manager bzw. den Device Manager (zum Beispiel via Windows-Taste, Eingabe von devmgmt.msc und Enter-Drücken). Unter «Anschlüsse (COM & LPT)» findet sich der neue Port und dessen Nummer (die Zahl hinter «COM»).
3. Herunterladen und Entzippen der IoT-Werkstatt der Uni Trier: Unter Beachtung der üblichen Vorsichtsmassnahmen können die Code-Beispiele der IoT-Werkstatt der Uni Trier heruntergeladen werden. Stand November 2020 sind die Unterlagen unter diesem Link zu beziehen (sollte sich die URL mal ändern, dürfte der Link im Quickstart-Dokument der Uni Trier unter Punkt 1 aktualisiert werden).
4. Starten der Arduino-Umgebung: Im entzippten Ordner findet sich die Datei IoT-Werkstatt.bat. Durch Doppelklicken startet die Arduino-Umgebung.
5. Konfiguration der Arduino-Umgebung: In der Arduino-Umgebung muss unter «Tools» > «Port» der vorher notierte COM-Port ausgewählt werden, damit die Arduino-Umgebung weiss, wohin sie Ardublocks bzw. C-Code transferieren soll.
6. Starten der Ardublock-Umgebung: In der Arduino-Umgebung kann man mit «Tools» > «Ardublock» die Ardublock-Umgebung starten.
Für die weiteren Schritte gibt es einige Vorgehensvarianten:
- Direktes Nutzen der Ardublocks der Uni Trier: Im entzippten Ordner finden sich in Unterordner des Pfads
IoTW\Beispiele
diverse Beispiele-Ardublock-Programme (abp-Dateien). Diese können mittels «Open» in der Ardublocks-Umgebung geladen und anschliessend mittels «Upload to Octopus» an das per USB angeschlossene Board übermittelt werden (Octopus ist ein alternatives Board zum durch uns verbauten Feather Huzzah-Board). - Anpassen der Ardublocks der Uni Trier und Bauen eigener Ardublocks: In der Ardublock-Umgebung geladene Ardublock-Programme können interaktiv angepasst werden. So kann beispielsweise ein Ardublock-Programm der Uni Trier, das nur eine Anzeige vorsieht, auf die Nutzung von zwei Anzeigen erweitert werden. Wenn man mag, kann man auch die in den diversen oben verlinkten Dokumentationen dargestellten Ardublock-Programme mittels Drag-and-Drop in der Ardublock-Umgebung selbst zusammenstellen. Mittels Klicken auf «Upload to Octopus» kann das Ardublock-Programm dann an das per USB angeschlossene Board übermittelt werden.
- Umsetzen von Ardublocks in C-Code und Anpassen: Ein in der Ardublock zusammengestelltes Ardublock-Programm bzw. ein aus den Beispielen der Uni Trier geladenes Programm kann auch mittels Programmierung von Code erweitert werden. Sobald «Upload to Octopus» geklickt wird, wird im Arduino-Fenster (das Fenster, aus dem die Ardublock-Umgebung gestartet wurde) das aktuelle Ardublock-Programm in C-Code übersetzt. Achtung: Bei diesem Schritt muss man sehr gut aufpassen, dass man ein schon vorhandenes und im Arduino-Fenster geladenes C-Programm nicht aus Versehen überschreibt. Der C-Code kann dann gemäss den eigenen Vorstellungen weiterentwickelt werden.
Betrieb mit zwei Anzeigen
Wenn man etwas Programmiererfahrung hat, ist das Weiterentwickeln eines Ardublock-Programms in C dank der Hilfe des Internets nicht allzu kompliziert. Ich habe für die Entwicklung meines CO₂-Messgeräts mit zwei Anzeigen diesen Weg gewählt, obwohl ich noch nie C programmiert habe. Ich habe dazu aus dem Fundus der CO₂-Ampel-Beispiele unter dem Pfad IoTW\Beispiele\CO2_Ampel\CO2_Ampel_Huzzah*.abp
geschöpft.

Sobald der C-Code fertiggestellt ist, kann man durch Klicken auf den «Upload»-Pfeil den Code auf das Board transferieren. Bedingung ist, dass das Board per USB an den PC angeschlossen ist und dass wie oben beschrieben unter «Tools» > «Port» der richtige COM-Port eingestellt ist.

Der C-Code (bzw. der sketch) wird kompiliert und – falls das Kompilieren fehlerfrei durchlief – übermittelt. Sobald die Übermittlung abgeschlossen ist, startet sich das Board neu und der übermittelte C-Code steuert den Betrieb der Hardware.
Ich habe den von mir genutzten C-Code ohne Garantie der Richtigkeit in einem öffentlichen GitHub-Repository abgelegt:

Der Code darf gerne beliebig weiterverwendet werden. Im Code können bzw. sollten verschiedene Parameter angepasst werden: zum Beispiel die Unter- und Obergrenze der Trend-Darstellung und die Höhe über Meer, auf der das Messgerät aufgestellt wird. Die Parameter sind im Code mit Kommentaren nach bestem Wissen erläutert. Über Verbesserungshinweise zum Code oder, womöglich, Meldungen von Fehlern würde ich mich freuen.
Das Resultat
Nach dem erfolgreichen Deployment des angepassten C-Codes auf meine Hardware konnte ich endlich das Resultat bestaunen. Ich habe mein CO₂-Messgerät mit einem Bilderrahmen und etwas schwarzem Filz zudem noch mit einem ansprechenden Äusseren versehen:


Auf dem verbauten LED-Display zeigt das Messgerät den CO₂-Gehalt [ppm], die Temperatur [°C] und die relative Feuchtigkeit [%] der Luft an (oben in der folgenden Abbildung). Auf dem LCD-Array zeigt das Gerät den Verlauf der CO₂-Konzentration über die Zeit mit einem vertikalen Balkendiagramm (unten).

Diese Darstellung finde ich als grobe Warn-Anzeige, die auch aus einiger Distanz interpretiert werden kann, sehr nützlich. Sie ist bei mir auf den Wertebereich von 500 ppm bis 1200 ppm skaliert. Mein Code stellt sicher, dass auch bei CO₂-Konzentrationen unterhalb von 500 ppm eine LCD leuchtet. So ist das Display nie ganz dunkel (was nicht unterscheidbar wäre von einem Ausfall dieser Komponente oder des ganzen Geräts). Die Leuchtkraft der LCD skaliere ich im Wertebereich von 500 ppm bis 1200 ppm kubisch in 256 Helligkeitsstufen. Damit leuchtet der Balken umso heller und drängender, je grösser er (bzw. die CO₂-Konzentration) wird.
So misst die CO₂-Ampel nun kontinuierlich und hoffentlich zuverlässig die Luftqualität. Es würde mich freuen, von Ihnen zu hören, wenn Sie eine eigene Lösung für die CO₂-Messung umgesetzt haben oder planen.


Vor dem Einsatz des CO₂-Messgeräts ist die Kalibration des Sensors empfohlen. Dieser Schritt sollte zumindest initial einmal durchlaufen werden. Er ist im nächsten Abschnitt beschrieben. Beim Aufstellen des Messgeräts die Aufstellhinweise der Uni Trier beachten! An der frischen Luft sollte der Sensor nach einigen Minuten circa 400 ppm CO₂ anzeigen.
Kalibration des Sensors
Die Genaugkeit des CO₂-Sensors kann durch etwas unpflegliche Behandlung leiden (siehe den ersten Teil dieser Blogserie) und driftet über die Zeit auch etwas. Deshalb: Wenn man ganz genau sein möchte, ist zumindest die einmalige Kalibration des Sensors vor dem Einsatz zu empfehlen. Das sollte man möglichst nahe am künftigen Einsatzort (also nach möglichen Transporten des Messgeräts) tun. Das Vorgehen ist gut beschrieben in einer Dokumentation der Uni Trier: Aufstellhinweise und Beschreibung des Vorgehens zur Kalibrierung (pdf).
Die Kalibration funktioniert durch Eichung des Nullpunkts der CO₂-Messung (sie korrigiert also Offsets in gemessenen Werten anhand einer Frischluftmessung). In der frischen Umgebungsluft beträgt der CO₂-Anteil circa 400 ppm. Zur Kalibration wird der Sensor einige Minuten in der frischen Luft aufgestellt, an den PC angeschlossen und es wird ein Ardublock-Kalibrationsprogramm auf das Board geladen. Dieses findet sich unter dem Pfad IoTW\Beispiele\CO2_Ampel\CO2_Ampel_KalibrierungSeriell.abp
.
Mit diesem Kalibrationsprogramm wird der an der Frischluft gemessene CO₂-Messwert solange beobachtet, bis er um eine Zahl herum relativ stabile Werte anzeigt (d.h. sich einschwingt). Sobald das Einschwingen abgeschlossen ist, kann der Sensor über einen Befehl im Serial Monitor kalibriert werden. Dadurch wird der ermittelte Kalibrationswert auf dem Sensor selbst persistiert. Dieser bleibt bis zur nächsten Kalibration erhalten, auch wenn wir im Anschluss unser eigentliches Mess-Programm (siehe oben) auf das Board übertragen.
Ideen für Weiterentwicklungen
Ich habe noch diverse weitere Ideen (noch?) nicht umsetzen können, fände diese aber spannend – vielleicht gar in Austausch mit Ihnen? Zwei besonders interessante Ausbaumöglichkeiten:
- Das Feather Huzzah-Board ist WLAN-fähig und kann bespielsweise über REST oder MQTT Messwerte ins Internet z.B. auf IoT-Plattformen übermitteln. Es kann aber auch selbst als WLAN-Hub fungieren, auf dem ein Webserver (vielleicht mit einem interaktiven Dashboard?) laufen könnte.
- Ich vermute, die hier geschilderte und in C bereitgestellte Implementation könnte mit dem gewählten Board auch mit MicroPython (in C geschriebene, Mikrocontroller-kompatible Python-Version) funktionieren. Das wäre für mich persönlich etwas zugänglicher als die C-Programmierung, insbesondere auch für die IoT-Vernetzung.
Ein Gedanke zu „CO₂-Messgerät im Eigenbau: Software und Inbetriebnahme“
Kommentare sind geschlossen.