CO2-Ampel mit Display und SCD30

CO2-Ampel mit Display und SCD30

Arduino, Display, Einstieg, Sensoren
3 Dezember 2021

  1. DIY CO2-Ampel mit dem MH-Z19C
  2. CO2-Ampel mit Display und SCD30

In diesem Guide lernst du ganz einfach eine CO2-Ampel mit Display und einem genauen Sensor umzusetzen.

Im heutigen Beitrag möchte ich das Thema DIY CO2-Ampel vom Autor Maik Rygiel aufgreifen. In diesem Beitrag wurde mit dem MH-Z19C Infrarot CO2 Sensor eine kostengünstige CO2-Ampel gebaut. Ampel trifft es in diesem Kontext sehr gut, da durch eine mehrfarbige LED die aktuelle CO2-Konzentrationgefahr visuell dargestellt wird.

In diesem Beitrag wird der Sensor ausgetauscht, um die echte CO2-Konzentration zu messen. Gleichzeitig soll ein TFT-Display noch mehr Informationen über die Umgebung liefern, Temperatur und Luftfeuchtigkeit.

Bevor es aber zum Aufbau und dem Code kommt, wird kurz erklärt, wie die CO2-Sensoren messen und wieso die CO2-Konzentration etwas über die Ausbreitung von Krankheitserregern aussagt.

Die Hardware für die CO2-Ampel mit Display

Für das Update der CO2-Ampel benötigen Sie die folgenden Bauteile:

WARENKORB

Alle für dieses Projekt notwendigen Artikel landen mit einem Klick auf den Button direkt in deinem Warenkorb, sofern sie in unserem Shop verfügbar sind. Kontrolliere daher deinen Warenkorb genau!

Die Software

Damit du den D1 Mini programmieren und die gewünschte Funktion der CO2-Ampel erhälst, benötigst du die folgende Software und Bibliotheken:

  • Arduino IDE , hier am besten die aktuelle Version herunterladen
  • Boardbibliothek für den D1 Mini http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Die folgenden Bibliotheken mit allen Abhängigkeiten
    • Adafruit SCD30
    • Adafruit ST7735 and ST7789 Library
    • Adafruit Zero DMA
    • Adafruit SPIFlash
    • SdFat – Adafruit Fork
    • Adafruit_BME280_Library

Zusammenhang CO2, VOC, und Aerosole und CO2-Messung

Wie bereits in der Einleitung erwähnt, wird kurz erläutert, was die CO2-Konzentration mit VOC, volatile organic compounds, zu Deutsch flüchtige organische Verbindungen, und Aerosole zu tun hat.

In unserer Umgebungsluft beträgt die CO2-Konzentration üblicherweise 400ppm, also 0,04vol%, mit einer VOC-Konzentration von ~0,5ppm. ppm ist die Einheit Parts per million, also Teilchen pro Millionen.

Bei der Luft die wir ausatmen verändert sich diese CO2-Konzentration auf 40.000ppm und auch die VOC-Konzentration steigt leicht an.

Mit der ausgeatmeten Luft werden gleichzeitig sogenannte Aerosole, kleine Tröpfchen die auch Krankheitserreger beinhalten können, ausgeatmet. Daher kann mit steigender CO2-Konzentration und somit steigender Aerosole Menge in einem Raum auch das Ansteckungsrisiko durch die Krankheitserreger in den Aerosolen hergeleitet werden.

Gerade kleinere Tröpfchen können durch eine FFP2- bzw. OP-Maske nicht 100% aufgefangen werden, weswegen die Gesundheitsämter regelmäßiges Lüften als Maßnahme gegen Corona vorschlägt.

Aber wie kann die DIY CO2-Ampel unterscheiden, wann ein Fenster geöffnet werden sollte? Hier kommt die gemessene CO2-Konzentration des Sensors und die Richtwerte vom Umweltbundesamt ins Spiel. Der CO2-Sensor liefert eine Momentaufnahme der CO2-Konzentration im Raum, die mit der Bedenklichkeitseinstufung vom Umweltbundesamt, siehe Tabelle 1, abgeglichen wird.

CO2-Konzentration [ppm]Bedenklichkeit
Kleiner 1000Hygienisch unbedenklich
Zwischen 1000 und 2000Hygienisch bedenklich
Über 2000Hygienisch inakzeptabel
Tabelle 1: Bedenklichkeit von CO2-Werten

Nun könnte man annehmen, dass die diversen CO2-Sensoren alle gleich arbeiten, was aber nicht erklärt, warum einige teuer und andere günstiger sind. Die Antwort liegt hier in der Art der Messung der Sensorik. Gerade günstigere Sensoren messen nicht direkt die CO2-Konzentration, sondern ermitteln einen Schätzwert. Dazu werden andere Gase als CO2 ausgewertet , weswegen diese Art von Sensoren auch meistens als Gassensor verkauft werden. Erst im preisintensiveren Segment erhält man richtige CO2-Sensoren, wie der Adafruit SCD30. Diese messen den tatsächlichen CO2-Gehalt, weswegen diese Art von Sensoren CO2-Sensor genannt werden.

Der Zusammenbau

Nun soll die DIY CO2-Ampel mit Display v2.0 zusammengebaut werden. Dazu musst du die verschiedenen Bauteile gemäß Abbildung 1 bzw. Tabelle 2 verbinden.

Abbildung 1: Verkabelung der CO2-Ampel
D1 Mini PinTFT PinBME280 PinSCCD30 Pin
3,3V3,3V3,3VVIN
GGGNDGND
D0TC  
D1 SCLSCL
D2 SDASDA
D3SI  
D4DC  
D5CK  
D7SI  
Tabelle 2: Verdrahtungstabelle CO2-Ampel

Achte bei allen Komponenten darauf, dass die 3.3V-Spannungsversorgung vom D1 Mini verwendet wird! Einige Komponenten können bei höherer Spannung beschädigt werden. Das TFT-Display hat einen Spannungsregler, weswegen hier ein geringeres Risiko eines Defekts besteht.

Bei der i2c-Verbindung des SCD30 und BME280 werden die Datenleitungen für SDA und SCL in Reihe geschaltet.

Der Programmcode für CO2-Ampel mit Display

Im letzten Schritt muss der D1 Mini noch mit dem Programmcode geflasht werden. Als Vorraussetzung sind die Bibliotheken unter Die Software erforderlich.

Zusätzlich zur I CO2-Warner.ino-Datei gibt es eine header-Datei mit dem Namen bitmap.h, welche sich im gleichen Verzeichnis befinden muss. Andernfalls wird es beim Kompilieren zu Fehlern kommen. Das komplette Paket musst du von https://github.com/BerryBase-de/CO2-Warner kopieren.

Wenn du die oben angegebene Adresse aufgerufen hast, gehe auf Code -> Download ZIP, siehe Abbildung 2.

Abbildung 2: Repository kopieren

Nach dem Download muss du die Zip-Datei entpacken. Anschließend öffnest du die Datei CO2-Warner.ino.

Der Programmcode hat viele Kommentare, damit du schnell und einfach debuggen oder Fehler finden kannst, sofern einer der Sensoren nicht reagiert. Damit die loop-Funktion nicht zu überladen wird, sind einige Programmaufgaben in Unterfunktionen ausgelagert worden. Das hilft dir, den Programmcode auf deine Sensoren oder Erweiterungen anzupassen.

Zuletzt noch die Erklärung, wie der Programmcode genau arbeitet. Nach dem Start des D1 Mini wird über die setup-Funktion zunächst die benötigte Hardware vorbereitet. Damit Sie sehen was passiert, gibt das TFT-Display alle Informationen aus, siehe Abbildung 3.

Abbildung 3: Start der DIY-CO2-Ampel

Da bei der Initialisierung vom Display kein Status zurückgegeben wird, siehst du alle Daten gleichzeitig im seriellen Monitor, siehe Abbildung 4.

Abbildung 4: Serieller Monitor

In der loop-Funktion wird beim Start vom Code bzw. alle 60 Sekunden die Sensoren ausgelesen. Der ausgelesene Wert vom CO2-Sensor wird direkt in das Array iCO2Array geschrieben. Da die letzten 15 Minuten auf dem Display ausgegeben werden sollen, werden die vorherigen Daten geshiftet. Gleichzeitig werden die aktuellen Daten auf dem TFT-Display visualisiert. Je nach CO2-Konzentration gibt das TFT-Display den Status aus, ob gelüftet werden muss oder nicht.

Je nach CO2-Konzentration wird das Bitmap an der rechten Seite vom TFT-Display entsprechend ausgetauscht und eingefärbt. Die Anzeige sollte ähnlich wie in Abbildung 5 aussehen.

Abbildung 5: Ausgabe von Messdaten

Wundern Sie sich am Anfang nicht über die wenigen Daten im Graphen. Da immer minutenweise gemessen wird, dauert es insgesamt 15 Minuten, bis der Graph voll befüllt ist.

Den Maker wecken

Zum Schluss kann nun der Aufbau noch in ein passendes Gehäuse verbaut werden. Hier ist ihrer Kreativität keine Grenzen gesetzt. Gleichzeitig können Sie sich auch überlegen die Icons oder den Text auf dem Display zu verändern.

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung 4.1 / 5. Anzahl Bewertungen: 13

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Über Jörn Weise

Freier Blogger, Dipl.-Ing. (FH) Mechatronik und Hobbymaker seit 10 Jahren

Kommentare

  1. Hallo,
    erstmal: Cooles Projekt!
    Jetzt kommt nochmal so eine neunmalkluge Frage:
    Wozu ist eigentlich der BME280 da ?
    Der SCD30 liefert doch bereits selber Temperatur und Feuchtigkeit.
    Der BME280 liefert zwar zusätzlich den Luftdruck, aber der wird ausschließlich in die Console ausgegeben.
    Man könnte den wohl noch zurück an den SCD30 geben, um das Messergebnis noch zu verbessern, aber das konnte ich im Code auch nicht finden.
    Wie ich das verstanden habe ist der SDC30 so gut / teuer, weil er weitestgehend ohne regelmäßige Kalibrierung auskommt.
    Gruß Steve

    1. Hallo Steve,

      danke für das Feedback. Bezogen auf Ihre Frage möchte ich dir natürlich eine Antwort geben.
      Tatsächlich hat der SCD30 einen Temperatur- und Feuchtigkeitssensor, diesen wollte ich aber aus Prinzip nicht verwenden. Tatsächlich wollte ich zeigen, dass es mit dem D1 Mini und dem SCD30 auch möglich ist, noch parallel ein anderes Gerät anzuschließen. Da ich den Code so modifizierbar wie möglich gemacht habe, kann statt der Temperatur oder Luftfeuchtigkeit einfach der Druck angezeigt werden. Du kannst gerne den Code dahingehend modifizieren.
      Laut dem Datenblatt vom SCD30 ist der CO2-Sensor auch ohne Anpassung vom Druck super genau.
      Gruß
      Jörn

  2. Hallo Jörn,
    Ich habe fast das gleiche Projekt geplant, das ich mit Kindern machen möchte! Dabei habe ich nun zufällig Deine Webseite gefunden. Es gefällt mir was Du da machst! Prima!
    Im Fritzing Schaltbild ist mir ein kleiner Zeichenfehler aufgefallen. Das Display hat anscheinend zwei mal Plus und keine Masse!

    Toll ist ja, daß da gleich eine Warenkorb aufgeht – mit akzeptablen Preisen. Leider fehlt (bei mir?) der CO2-Sensor und der BME280. Der zur Zeit wohl sehr schlecht zu bekommen ist, obwohl es schon Nachfolger gibt (dann aber sehr teuer). (Es sind auch nur noch 2 Displays auf Lager!)
    Viele Grüße!

    1. Hallo Florian,

      ja aktuell scheinen die Sensoren teilweise bis ganz ausverkauft zu sein. Aber es gibt ja hier im Shop genügend Alternativen und mit kleinen Anpassungen im Quellcode ist dann auch schon das Projekt wieder einsatzbereit.
      Den Fehler im Schaltbild sehe ich nun nicht. Das Display hat einen 5V und einen 3,3V-Pin. Ersteres ist eine Spannungsversorgung und soweit ich mich erinnere kann der 3,3V-Anschluss dann als Ausgang genutzt werden (quais als 3,3V Spannungsversorgung), da es einen Regler im Display gibt. Bei dem Display selbst gibt es bei der Bezeichnung kein klassiches GND sondern hier ist die Beschriftung einfach G. Das kann in diesem Zudammenhang schon ein bisschen verwirren.
      Mit freundlichen Grüßen
      Jörn Weise

      1. Hallo Jörn,
        Es ist NUR ein kleiner Zeichenfehler in dem FRITZING – Verschaltungsplan.
        Schau Dir mal mein Bildchen an:
        *Link*
        Da ist vermutlich nur der schwarze Draht (ganz links) verhopst! Du hast das schon richtig zusammengebaut, sonst würde es ja nicht laufen!

        1. Hallo Florian,
          ja ich habe den Fehler jetzt auch gesehen, danke dafür. Ich habe die Verdrahtung entsprechend angepasst und das Schaubild auch gleich im Beitrag einem Update unterzogen.
          Danke für den aufmerksamen Hinweis.
          Gruß
          Jörn

  3. hallo jörn,

    erst einmal danke für das projekt.
    ich bekomme es aber nicht zum laufen.
    es wird mir immer nur in schleife ” init bme … fail ” angezeigt.
    ich habe mich wirklich genauestens an die anleitung gehalten.
    an wen kann ich mich wenden um hilfe zu erhalten?

    beste grüße

    sebastian

    1. Hallo Sebastian,

      es kann sein, dass dein BME280 eine andere i2c-Adresse hat, daher einfach mal mit einem i2c-Scanner mal nach der richtigen suchen und dann klappt es auch mit dem Projekt.
      Such am besten bei google mal nach Arduino i2c-Scanner und du wirst schnell fündig.

      Gruß

      Jörn Weise

      1. hallo jörn,

        danke für die schnelle antwort. ich habe es gleich ausprobiert und es hat nicht ganz geklappt.
        ich konnte die i2c-adresse des co2 sensors auslesen, jedoch nicht die des bme280 sensors. ich habe es auch noch bei einem bmp280 sensor probiert (der hat noch zusätzlich 2 pins – cse und sd0), aber auch bei dem sagt der serielle monitor immer i2c device not found.
        fällt dir vielleicht noch etwas ein was ich falsch machen könnte?

        beste grüße

        sebastian

  4. Hey, geiles Projekt !!

    bin vor kurzem auch dabei mich in die Materie einzuarbeiten aber leider fehlt mir noch die Erfahrung um so etwas nach zu bauen.

    Aber auf einer Platine in einem Gehäuse würde ich es auf jedenfall kaufen^^

    mfg

    1. Hallo Mirko,
      leider habe ich für dieses Projekt weder ein Gehäuse vorgesehen, noch ein Gehäuse konstruiert.
      Vom Prinzip sollte mit einem 3D-Drucker das aber schnell gehen.

      Gruß
      Jörn Weise

  5. Keine Ahnung, wo der Author sein Diplom gemacht hat, aber wenn ich mir die x-Achse auf seinem Diagramm anschaue, scheint bei ihm die Zeit rückwärts zu laufen. Obwohl die Achsen sind ja sowieso nicht beschriftet, Aussagekraft also sowieso gleich Null. Mathematik? Setzen, sechs!

    1. Schönen guten Tag Herr Kingcraft,
      Danke erst einmal für ihren Kommentar, auch wenn ich die Art und Weise, wie Sie hier argumentieren eher fraglich finde.
      Die X-Achse ist so gewählt, das der jüngste Eintrag auf Höhe der Koordinate 0,0 liegt und die älteren auf der X-Achse immer weiter wandern. Es steht ihnen frei die Berechnung und Darstellung von Diagramm zu ändern, darum habe ich das Projekt genauso aufgebaut. Ebenfalls können Sie eine Skalierung hinzufügen, wobei ich durch die Farben und den Mittelwert eine Tendenz über die Vergangenheit aufzeigen wollte.
      Sie können aber gerne das Projekt nach ihren Wünschen modifizieren und hier das Ergebnis allen zur Verfügung stellen.

    2. Keiner zwingt dich die Achse zu beschriften, die Zeitachse zu invertieren oder die Farbe der Plots auf pink zu verändern.
      Ja, hat mich auch kurz verwirrt, dass auf der x-Achse nicht t sondern delta t = (t_0- t) aufgetragen ist. Ich persönlich würde die Achsenpfeile weglassen und die neusten Werte an die rechte Kante packen. Aber das kann wie schon erwähnt jede Person selbst nach eigenem Belieben umprogrammieren.

Hinterlasse ein Kommentar

XHTML: Sie können diese Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>