CO₂-sensor und -indikator

felix schwenzel, , in artikel    

MH-Z19

vor ein paar wochen las ich hier, dass der MH-Z19 CO₂-sensor ganz zuverlässig arbeite. vorher hatte ich von gas-sensoren gehört, die heizspulen haben und beim aufwärmen komisch riechen. der MHZ-19 misst mit laserlicht, kostet dafür aber ein bisschen mehr. bei aliexpres ca. 15 euro. letzte woche kamen die beiden sensoren an, die ich dort gekauft habe.

ich wollte gerne einen sensor haben, der seine daten in meinen wohnungscontroller schreibt und loggt, die messdaten aber auch visualisiert, am besten mit einer LED-anzeige. vor allem sollte das ding aber auch alleine funktionieren, also ohne wlan und ohne mqtt-verbindung seine werte anzeigen. mit den lösungen die ich zuhause einsetze, fürchtete ich, könnte das problematisch sein. viele meiner sensoren basieren auf esp-easy, was in der regel wirklich einfach einzurichten und zu verwalten ist, aber eben auf einer wlan und mqtt-verbindung basiert. ohne wlan oder verbindung zum mqtt-server streiken die esp-easys. bei homie, auf dessen basis ich auch ein paar sensoren und aktoren betreibe, gibt’s wohl technische möglichkeiten für einen verbindungs-losen betrieb, aber das schien mir zu kompliziert.

weil ich seit ein paar monaten erfolgreich und befriedigend mit der mysensors-plattform experimentiere, hab ich mich entschieden die CO₂-sensoren als mysensors zu bauen. das konzept von mysensors zu verstehen fiel mir anfangs etwas schwer, weil sich auf der website ein wildes durcheinander findet, von how-tos, bastelanleitungen, forumsbeiträgen und hardware-bauvorschlägen, -werbung, -showcases. irgendwann habe ich dann herausgefunden, dass die leute die die software-bibliothek schreiben und pflegen, eben auch die openhardware.io-plattform betreiben und dass dort, eben deshalb, auch besonders viele leute ihre mysensor-projekte vorstellen (und zum teil verkaufen).

seitdem ich einen funktionierenden mysensors-gateway an den homeassistant angeschlossen habe, ist das hinzufügen (und bauen) von sensoren (und aktoren) auch wirklich einfach.

den MH-Z19 habe ich an einen arduino nano (ca. 2,50 euro/stück) angeschlossen und an den nano eine NRF24L01 sender/empfänger. im prinzip wars das schon, einen arduino-sketch habe ich hier gefunden.

leider war das noch ein bisschen fummelei, bzw. debugging. der MH-Z19 kommuniziert über eine serielle schnittstelle mit dem arduino und sendet auf anfrage eine sequenz von 9 byte. die beiden ersten zeigen den status an, die folgenden beiden den gemessenen CO₂-gehalt in ppm und das fünfte byte die temepratur. der arduino sketch erwartet in etwa diese sequenz:

0xFF 0x86 0x3 0x95 0x42 0x0 0x0 0x0 0xa0

der arduino las aber für die ersten beiden und manchmal auch das dritte byte folgendes aus:

0xFFFFFFFF 0xFFFFFF86 0x3 0xFFFFFF95 0x42 0x0 0x0 0x0 0xFFFFFFA0

theoretisch könnte man hier die hex-werte in strings umwandeln, die FFFFFF-sequenz wegkürzen und wieder zurück in einen integer oder den ursprünglichen zahlenwert umrechnen. das ist in c+ aber leider (für mich zumindest) furchtbar kompliziert. nach einer weile bemerkte ich: der sketch wandelt die falschen hex-werte auch in zahlen um, allerdings negative. in diesem beispiel byte 3 (0x3) in 3 und 0xffffff95 in -107. 0x95 ist im dezimalsystem eine 149. 149 + 107 = 256, die differenz betrug immer 256, wenn die messwerte mit vorangestelltem FFFFFF ausgelesen wurden. damit war die korrektur einfach: wenn eine negativ dezimalzahl rauskommt, addiere 256. mit diesem hack kamen die messwerte dann stabil raus, vorher gabs schwankungen um 256 ppm. das problem tritt bei beiden MH-Z19 auf, wahrscheinlich liegts am zusammenspiel des arduino mit den sensor und der softserial bibliothek. ist mir aber egal, läuft ja. mein angpasster sketch liegt hier: gist.github.com/diplix/9b…

die messwerte die der sensor ausspuckt sind ziemlich flott, die anwesenheit eine sauerstoff-atmers ist mit 1-2 minuten verzögerung deutchlich messbar. auf diesem bild sieht man deutlich, dass ich gegen ein uhr ins bett gegangen bin und das bett gegen halb sieben wieder verlassen habe. die offene tür sorgt für einen rapiden abfall des CO₂-gehalts, der sich allerdings nach ein paar minuten fängt und abflacht. um viertel nach neun sieht man deutlich, dass in beiden zimmern für 10 minuten gelüftet wurde.

messdaten von zwei MH-Z19

einen der beiden sensoren habe ich mit zwei LEDs ausgestattet, die grüne LED leuchtet bis ca. 1500 ppm, ab 1000 ppm schaltet sich die rote LED dazu. damit erkennt man, dass bei 1000 ppm die luft noch in ordnung ist und es so ab 1500 eigentlich zeit wird zu lüften. die LEDs lassen sich auch per mysensor-funk abschalten und der trick, um den sensor auch ohne mysensors-netzwerk funktionieren zu lassen, ohne durch wiederholte verbindungsversuche blockiert zu werden, ist diese zeile:

#define MY_TRANSPORT_WAIT_READY_MS 3000

bei amazon habe ich für einen der sensoren, auf gut glück, eine dose gekauft, in die zufällig alles, inklusive kabellage, reinpasst.

ein MH-Z19, ein arduino nano, ein NRF24L01 funkmodul, zwei LEDs und einige kabel in einer dose

der andere sensor macht es sich derweil in einem plastikbecher gemütlich.

ein MH-Z19, ein arduino nano, ein NRF24L01 funkmodul, zwei LEDs und einige kabel in einem becher

* * *

gekostet hat mich jeder der beiden sensoren ungefähr 20 euro.

  • MH-Z19: 15,00 €
  • NRF24L01 sender: 1,20 €
  • arduino: 2,50 €
  • dose: 1,76 €
  • schrumpfschlauch und LEDs lagen hier noch rum

kommerzielle alternativen, wie der Elgato Eve Room oder der Netatmo Healthy Home Coach, kosten 70 bis 100 euro, können dafür aber auch flüchtige organische verbindungen (VOC, sprich, zum beispiel, darmgase) messen. sensoren dafür gibt’s auch einige, MP901, GM502B oder der BME680 jeweils für ca. 15 euro oder, auch vielversprechend, aber sackteuer, der iAQ-core C.

mir genügt erstmal der MH-Z19 und ich bin gespannt was er misst, wenn ich ihn mal in den besprechungsraum auf der arbeit mitnehme.