Ein CO2-Sensor zum Selberbauen

Vernetzte CO2-Sensoren sind in größeren Stückzahlen ab 100€ erhältlich. Wem das zu viel ist, wer sowieso gerne selbst Hand anlegt oder mehr über Technik und Konzepte des Internet-of-Things (IoT) lernen möchte, kann für etwas weniger Geld einen Sensor selbst bauen, der sehr gut mit der Clair-Plattform zusammenarbeitet.

Auch wir selbst haben so angefangen: Noch vor der Clair-Plattform bauten und testeten wir einen eigenen CO2-Sensor um zu verstehen, wie die Messdaten aussehen und wie gut die Funkanbindung mittels LoRaWAN funktioniert. Das Ergebnis ist Clairchen, welches in zweifacher Ausführung seit inzwischen gut zwei Monaten seinen Dienst verrichtet und uns mit Testdaten versorgt.

Clairchen

Im Folgenden zeigen wir euch, wie ihr selbst ein Clairchen bauen und es mit der Clair Plattform verbinden könnt.

Hardware

Eigentlich ist Clairchen ein gefedertes Früchtchen, denn der Kern ist ein Adafruit Feather Board mit eingebautem LoRa-Modul. Dazu kommt ein CO2 Sensormodul, welches zusätzlich noch Temperatur und Luftfeuchtigkeit messen kann:

Hinzu kommen einige Kleinteile:

Für die Stromversorgung:

Alternativ zum USB-Ladegerät könnt ihr Clairchen auch per Akku versorgen. Passend für das AdaFruit Board benötigt ihr eine 3,7V Lithium-Ion Polymer Batterie mit JST-PH Connector. Allerdings ist unsere Software (s.u.) nicht auf geringen Energieverbrauch optimiert, so dass eine Akkuladung von 2000mAh nur für ca. 3 Tage Betrieb ausreicht.

Board-Aufbau

Wie ihr das Board anschließt, ist sehr gut im folgenden AdaFruit Tutorial beschrieben. Dazu müsst ihr die Headers an das Board löten und dann mit einigen Jumper-Kabeln die im Tutorial genannten Pins verbinden.

Für die Antenne könnt ihr wie hier beschrieben ein Stück isolierten Draht verwenden (8,2 cm lang!), oder eine echte Antenne anlöten. Wenn eure Lötfertigkeiten und eure Lötstation es zulassen, könnt ihr natürlich auch eine echte Antenne anbringen. Dann braucht ihr:

Sensor

Der Sensirion SCD30 ist ein optischer CO2-Sensor. Er liefert recht genaue Messwerte, braucht aber auch relativ viel Energie. Nachdem ihr einen Header an seine offenen Pins gelötet habt, könnt ihr ihn ebenfalls in das Breadboard einstecken, wie im Bild oben zu sehen. Das Feather-Board stellt praktischerweise eine reguliert Spannungsversorgung bereit, so dass ihr einfach Vdd und Gnd des SCD30 mit den entsrpechenden Ausgangs-Pins des Feather-Boards verbinden könnt. Das Pinout SCD 30 ist sehr einfach, mit Vdd, Gnd, Tx, RX in einer Reihe.

Da wir den SCD30 seriell per I2C ansprechen, sind nur zwei weitere Verbindungen nötig:

In Draufsicht:

Clairchen Draufsicht

Software

Kern des AdaFruit Boards ist ein ATMEL SAMD21G18 ARM Cortex M0 Prozessor. Dies ist der gleiche Chip wie auf dem Arduiono Zero. Daher können wir Clairchen-Software mit der Arduiono Entwicklungsumgebung schreiben und auf eine große Anzahl von Arduino-Bibliotheken zurückgreifen.

Arduino IDE Setup

Installiere die Arduino IDE auf Deinem Entwicklungsrecher und lade das Board Support Package (BSP) für das Feather Board, wie hier beschrieben. Relevant für uns ist das BSP für Adafruit SAMD Boards. Du kannst eines der mitgelieferten Beispielprogramme ausführen und über eine USB-Verbindung auf das Feather-Board laden und dort ausführen.

LoRaWAN mit der LMIC Bibliothek

Das LoRa-Modul auf dem Feather-Board liefert den Physical Layer (PHY) der LoRa-Spezifikation, sorgt also für die Übertragung von Byte-Paketen. Die Koordination des Kanalzugriffs (Medium Access Control - MAC) muss in Software abgebildet werden. Erst der MAC-Layer macht das Radio zu einem LoRaWAN Gerät. Die Spezifikation der LoRaWAN Alliance ist recht umfangreich. Praktischerweise gibt es die sehr gute MCCI LoRaWAN LMIC Bibliothek, welche einen kompletten spezifikationskonformen MAC-Layer implementiert. Diese musst Du über den Arduino Library Manager installieren.

Um ein Gefühl für LoRaWAN und das LoRaWAN Community-Netz The Things Network zu erhalten, kannst Du mit den mitgelieferten Beispielen etwas spielen, wie hier oder hier beschrieben. Grundlegende Konzepte der LoRaWAN Technologie sind hier und hier erklärt. Beachte, dass Du die Konfigurationsdatei für das LoRa Frequenzband anpassen musst. Die Konfigurationsdatei liegt im Verzeichnis der LMIC Library unter <arduino_dir>/libraries/MCCI_LoRaWAN_LMIC_library/project_config.

Kommunikation mit dem Sensirion SCD30

Die Kommunikation mit dem SCD 30 erfolgt über das serielle I2C-Protokoll. Das Sensormodul kennt verschiedene Modie und erlaubt eine detaillierte Konfiguration. Anstatt aber einzelne Bits zu setzen oder zu lesen, nutzen wir auch hier eine Bibliothek: Mit der SCD30-Arduino-Library von SparkFun sehen wir CO2-Werte statt Bits, und das Auslesen des Sensors erfolgt in nur zwei Zeilen Code.

Der Clairchen Software Stack

Die größte Herausforderung ist es, die Anforderungen unser Anwendung zu erfüllen nach

Kritisch sind hier zwei Faktoren: Zum einen, dass bei schlechtem Empfang der LoRaWAN MAC automatisch die Datenrate reduziert. Bei einem sehr schlechten Funkkanal kann eine Nachricht somit gut 1,5s lange dauern. Das wiederum ist ein Problem in Bezug auf die Fair Access Policy des TTN. Unser Ziel war und ist es, Messdaten (zumindest zu relevanten Tageszeiten) mit ausreichend hoher Auflösung und möglichest geringer Latenz zur Verfügung zu stellen. Um z. B. die Entwicklung der CO2-Konzentration in einem Klassenraum während einer Schulstunde nachvollziehen zu können, reicht es nicht, drei Messwerte pro Stunde zu übertragen. Und um im richtigen Moment darauf hinzuweisen das Fenster zu öffnen, dürfen die Messdaten nicht mit einer halben Stunde Verzögerung an der Clair Plattform ankommen.

Die Fair Access Policy des TTN schreibt vor, dass jedes Gerät max. 30 s Airtime pro 24 Stunden im Uplink belegen sollte. Die Herausforderung besteht nun darin, dass ein Gerät, das relativ weit von einem Gateway entfernt ist, eine hohen Spreading Factor verwenden muss, damit seine Nachrichten vom Gateway empfangen werden. Solcherart kodierte Nachrichten können aber leider über eine Sekunde lang werden, so dass das tägliche Airtime-Kontingent schnell verbraucht ist. Deshalb haben wir für unsere Clairchen-Software die Mess- und die Übertragungsfrequenz vom jeweils aktuellen Modulation and Coding Scheme abhängig gemacht. Die Details unseres so entworfenen Übertragungsschemas sind in einem Design-Dokument beschrieben.

Die komplette Clairchen-Software mit der oben beschriebenen Optimierung liegt in einem Github Repository bereit. Ihr könnt sie direkt aufspielen und benutzen, oder sie verbessern und euren Bedürfnissen anpassen.

Konfiguration und Anbindung an die Clair Plattform

Unsere Clairchen-Software nutz das Things Network als LoRaWAN Backend. Der eigentliche LoRa Funkkanal endet am nächsten TTN Gateway. Diese werden von Mitgliedern der TTN Community auf freiwilliger Basis betrieben. Ein TTN Gateway leitet die empfangene Nachricht an den TTN Network Server weiter, der sie einer TTN Application zuordnet und für diese in einer MQTT Queue bereithält. Details zur Architektur findet ihr hier.

Die eigentliche TTN Anwendung ist Teil der Clair Plattform. Hier nehmen wir die Sensordaten entgegen. Je nach Sensormodell können die Messdaten unterschiedlich kodiert sein. Für Clairchen haben wir uns ein sehr effizientes Codierungsschema ausgedacht, das hier und hier beschrieben ist. Andere Sensormodelle nutzen jeweils eigene Formate, so dass wir für jedes Sensor-Modell die Messdaten in der Clair-Plattform leicht unterschiedlich handhaben müssen.

Um ein Clairchen das erste mal mit der Plattform zu verbinden, nutzen wir Over-The-Air-Activation (OTAA). Um die JOIN-Nachrichten zu verschlüsseln und an die richtige TTN-Anwendung zu schicken, muss das Clairchen den JOIN Key (auch Application Key genannt) unserer TTN Application kennen. Diesen müsst ihr im Code hinterlegen, ebenso wie die DeviceEUI, welche fix im LoRa Funkmodul eingebrannt ist. Im Beispielcode für unser “Clairchen Rot” sind hier Test-Keys eingetragen. Ihr könnt zuerst eine eigene TTN-Anwendung anlegen zum testen. Entsprechend müsst ihr dann die Schlüssel dieser Anwendung in einer eigenen Datei euis_<my_node> eintragen. Wollt ihr euer selbstgebautes Clären mit der Clair Plattform verbinden, übermitteln wir euch auf Anfrage gerne die geheimen Schlüssel.

Erweiterungs- und Verbesserungsmöglichkeiten

Unser Clairchen hat kein Gehäuse und kein Ampel-Display. Die Software kann bislang nicht mit Fehlerfällen umgehen. Vor allem aber läuft das Sensor-Modul, das LoRa Radio und der Prozessor die ganze Zeit durch. Deswegen ist die Batterie nach spätestens drei Tagen leer. Im Vergleich dazu: Kommerziell erhältliche Sensoren halten ein bis vier Jahre ohne Batteriewechsel. Es gibt also noch genügend Verbesserungspotenzial für interessierte IoT-Zauberer. Natürlich freuen wir uns, wenn ihr eure Verbesserungen als Pull-Request bereitstellt, damit auch andere davon profitieren.

Andere Bausätze und Bauanleitungen

Neue Bauanleitungen für CO2-Ampeln werden derzeit gefühlt jeden Tag veröffentlicht. Das Grundprinzip ist einfach und kann teilweise ganz ohne Software umgesetzt werden. Sensoren mit Netzwerkverbindung, egal ob per Kabel oder drahtlos, sind nicht viel aufwändiger in Sachen Hardware, aber ohne Software geht hier nichts.