Stinkt das hier? – Teil 2 mit dem Winsen MH-Z19B

Wie schon im 1. Teil beschrieben, funktioniert der MH-Z19B völlig anders wie der BME680. Wer wissen will, wie, der kann es dort nachlesen. Eine gute, aber leider englischsprachige, Erklärung des Verfahrens findet sich hier. Aber nicht nur die Funktionsweise ist anders, sondern auch was er misst. Denn der MH-Z19B kann ausschließlich Kohlendioxid messen und ist damit eine interessante Ergänzung zum BME680.

Setze ich beide Sensoren gleichzeitig ein, gibt es theoretisch die Möglichkeit, durch den Vergleich der Werte herauszufinden, wann und ob der BME680 auf Kohlendioxid anspricht.

Das TTGO T-Display mit dem MH-Z19B

Um den MH-Z19B auszuprobieren habe ich ihn direkt mit altem Klingeldraht mit dem TTGO T-Display verlötet und dieses, samt Akku, in eines meiner Nerd-Anhänger Gehäuse gesteckt. So ist der Sensor mobil und ich kann ihn für Experimente irgendwohin mitnehmen.

Ein aktuelles Datenblatt mit der Bezeichnung User’s Manual in der Version 1.5 habe ich bei Reichelt gefunden. Eine Google Suche nach dem Datenblatt führte zwar zum Hersteller Winsen, aber nur zur Version 1.0. Eine interessante Seite, die, unter anderem, einen Blick auf die Platine des Sensors zeigt, habe ich hier gefunden. Laut hier besitzt der MH-Z19 einen Mikrocontroller vom Typ STM32 F103 C8, hat einen 12-bit ADC (4096) für einen Messbereich von 0-2000 PPM oder 0-5000 PPM.

  • Pin 5V    -> V+
  • Pin GND -> mit V-
  • Pin 25     -> RxD
  • Pin 26     -> TxD

Der Sensor wird nicht über einen I2C-Bus angeschlossen, sondern einfach über die serielle Schnittstelle, womit er zwei Anschlüsse dauerhaft belegt. Um die Schnittstelle anzusprechen ist nichts weiter nötig als:

#define RX_PIN 26
#define TX_PIN 25
#define BAUDRATE 9600

HardwareSerial CO2Serial(1);

CO2Serial.begin(BAUDRATE, SERIAL_8N1, RX_PIN, TX_PIN);

Im Datenblatt wird genau erklärt, welche Zeichenfolgen notwendig sind, um bestimmte Daten zu empfangen oder bestimmte Einstellungen vorzunehmen. Es gibt aber auch mindestens 2 Bibliotheken, die einem den Umgang mit Zeichenfolgen ersparen und dafür verschiedene Funktionen bereit halten.

MH-Z-CO2-Sensors von Tobias Schürg und Andreas Horn

MH-Z19 von Jonathan Dempsey

Letztere habe ich eingesetzt.

Screen Design

Mir macht es Freude interessante Screen Designs zu entwickeln. Darum habe ich für diesen Sensor einen halbkreisförmigen Bogen gezeichnet, der passend zu den Bereichsgrößen eingefärbt ist. Die Bereiche orientieren sich diesmal an den Kohlendioxid-Werten. Ein weißes Dreieck zeigt analog die Stelle im Halbkreis an, die dem aktuellen Messwert entspricht. Der Messwert selbst wird innerhalb des Halbkreises dargestellt.

Darunter  zeige ich ein Verlaufsdiagramm aus einzelnen farbigen Balken. Wieder entspricht die Farbe den zur Balkenhöhe passenden Bereichen. Der überspannte Zeitbereich des Diagramms kann aus 5 Zeitspannen gewählt werden:

  • Demo
  • 1 Minute
  • 24 Minuten
  • 1 Stunde
  • 6 Stunden

Die Einstellung ‘Demo’ befriedigt meinen Spieltrieb! Es zeigt, wie schnell das Verlaufsdiagramm sein könnte, wenn der Messwert schneller abgefragt werden könnte. Aber der ESP32 kann noch  schneller als in der Demo gezeigt. 🙂

      0   650 Grün Gut
  651   950 Gelb Mäßig
  951 1250 Orange Ungesund für bestimmte Gruppen
1251 1500 Rot Ungesund
1501 1850 Magenta Sehr ungesund
1851 2000 Braun Gefährlich

Erstkontakt

Ok, der Sensor ist mit dem TTGO T-Display verbunden und ich bekomme erste Werte angezeigt. Die bewegen sich so um die 6000 PPM herum! Das ist eindeutig ein viel zu hoher Wert. Aber klar doch, der Sensor hat eine weite Reise von China bis zu mir hinter sich. Er ist durch viele verschiedene Temperaturregionen bewegt worden und möchte bestimmt erst einmal ‘akklimatisiert’ werden, also – kalibriert werden.

Für absolute Laien: Kalibrieren bedeutet im Fall von elektronischen Sensoren und Geräten, die am Sensor anliegende Größe, meist eine elektrische Spannung, dem tatsächlich vorhandenen, realen Wert zuzuordnen. Das Problem dabei ist es, exakt zu wissen, welcher Wert tatsächlich gerade vorliegt. Zur Problematik folgendes Beispiel: Wir haben alle irgendwelche Thermometer zu Hause, die irgendwelche Temperaturen anzeigen. Schon einmal darüber nachgedacht, wie wir beweisen können, das die Werte auch stimmen?

Beim Kalibrieren mache ich nichts anderes, als dem MH-Z19B mitzuteilen, wenn ich der Meinung bin, dass er sich gerade in einer Kohlendioxid-Konzentration von 400 PPM befindet. Er wird sich dann den gerade anliegenden Spannungswert merken und als untere Grenze für die Berechnung der Messwerte verwenden. Bleibt die Frage, woher ich eine Konzentration von 400 PPM bekomme? Zum Glück ist das einfach. Denn diese Konzentration ist üblicherweise der zur Zeit natürliche Wert draußen an der frischen Luft. Zu Beginn der Industrialisierung waren das laut Wikipedia einmal 280 PPM! Um den Sensor damit zu kalibrieren, soll er dieser Luft für 20 Minuten ausgesetzt sein. Wenn ich jetzt über die serielle Schnittstelle eine bestimmte Zeichenfolge sende, nimmt der MH-Z19B den zu diesem Zeitpunkt gemessenen Wert als untere Grenze seines Messbereichs. Zumindest dachte ich das so.

Ich wusste aber anfangs nichts von den 20 Minuten und habe ihn einfach mit raus genommen, gewartet bis ich auf meiner Anzeige einen Wert deutlich unter den bisherigen 400 hatte und dieser sich kaum noch verändert hat. Blöde nur, dass der Wert dann nach der Kalibrierung weiter herunter gegangen ist. Aber ich dachte mir, macht ja nix, einfach noch einmal kalibriert und dann noch einmal. Das Ende vom Lied war, das mein Sensor nur noch Schrott von sich gegeben hat. Das hat mich dann ein klein wenig nervös gemacht. Aber zum Glück fand ich dann heraus, dass man ihn auch wieder ‘resetten’ kann. Puh!

Theoretisch kann ich auch einen zweiten Wert, im Datenblatt ‘Span’ genannt – ich würde das einmal mit Bereich übersetzen – einstellen. Dazu benötige ich aber eine CO2 Quelle mit einer Konzentration von  2000 PPM und im Moment weiß ich noch nicht, wo ich die her bekomme. Da ich sie nicht habe, frage ich mich natürlich, woher der MH-Z19B die obere Grenze für den Bereich her nimmt?

Neustart

Nach diesen ersten, eher negativen, Erfahrungen mit dem MH-Z19B entschloss ich mich noch einmal genauer in das Datenblatt zu sehen. Dort findet sich in Kapitel 8 die ‘Zero point calibration‘ in den 3 Geschmacksrichtungen:

  • Hand-operated method
  • Sending command method
  • Self-calibration

Nach meinen ersten Erfahrungen mit dem händischen Kalibrieren entschloss ich mich jetzt, es mit der ‘Self-calibration’ zu probieren. Warum soll ich mich mit dem Kalibrieren herumschlagen, wenn das der Sensor auch selbst kann? Ich stelle ihn einfach auf und wenn er zu viel CO2 anzeigt, öffne ich das Fenster.

Aber nach einigen Tagen wunderte ich mich darüber, dass die Werte einfach nicht immer schlüssig waren. Woraufhin ich mich genauer damit beschäftigte. Wenn ich die bisher gewonnenen Informationen richtig verstehe, so funktioniert die ‘Self-calibration’ ungefähr so: Der im ‘Sensor’ eingebaute Mikrocontroller vom Typ STM32 F103 C8 arbeitet ein Programm ab, welches eine Variable, sie könnte ‘minCO2’ heißen, einsetzt, um den tiefsten gemessenen Wert des Tages zu ermitteln. Ist der Tag herum, nimmt der Sensor an, dass dieser tiefste gemessene Wert 400 PPM bedeutet und stellt sich entsprechend ein.

Das heißt aber auch, wenn ich einen Tag nicht lüfte, oder nicht lange genug lüfte, der Sensor auf keinen Fall genügend frische Luft sieht, um im Raum eine Konzentration von 400 PPM zu erreichen. Der tiefste gemessene Wert wird dann deutlich über 400 PPM sein! Und wenn dann am nächsten Tag einmal besser gelüftet wird, Werte weit unter 400 PPM angezeigt werden! Nimmt man hingegen an, dass der Raum mindestens einmal täglich richtig gelüftet wird, so könnte es sein, dass die ‘Self-calibration’ funktioniert. Bei meinen Experimenten ging ich davon aus, dass der Raum mit dem Sensor des öfteren durchlüftet worden ist, trotzdem veränderte sich der Wert wie beschrieben.

Drift nach unten

Als Konsequenz aus diesen Erkenntnissen habe ich dann die ‘Self-calibration’ abgeschaltet, den Sensor eine halbe Stunde auf dem Balkon in die frische Luft gelegt und dann eine ‘Zero point calibration’ per Zeichenkommando über die serielle Schnittstelle durchgeführt. Dazu habe ich eine der Tasten des TTGO T-Display entsprechend programmiert. Direkt danach gab der Sensor Werte um 400 PPM aus, was meinen Erwartungen entsprach. Anschließend bin ich wieder ins Haus gegangen und habe den Sensor beobachtet. Interessanterweise – und wieder Erwarten – sind die Sensorwerte jetzt erst einmal schnell bis auf 0 abgesunken! Das verstehe ich überhaupt nicht. Das einzige, was mir dazu noch einfällt, sind die im Moment starken Temperaturunterschiede zwischen ca. 5 Grad auf dem Balkon und etwas über 20 Grad im Haus. Andererseits hat der MH-Z19B angeblich einen Temperatursensor integriert und ich hätte jetzt angenommen, dass er diesen zur Temperaturkompensation verwendet, da er keine Möglichkeit anbietet, die Temperatur abzufragen.

Drift nach oben

Beim mobilen Einsatz, sprich, ich habe den Sensor vom ersten Stock meines Arbeitszimmers mit hinunter in den Wohnraum genommen, sind mir weitere Merkwürdigkeiten am MH-Z19B aufgefallen. Es ist mehrmals passiert, dass die Werte den eingestellten Messbereich bei weitem nach oben hin verlassen haben. Das konnte ich mir erst nicht erklären, da es aber immer erst nach einiger Zeit passiert ist, wäre es unter Umständen möglich, dass es mit einer verringerten Spannung am Akku einhergeht. Andererseits habe ich den MH-Z19B sowohl mit 3.3 Volt als auch mit 5.0 Volt ausprobiert und dabei zeigten sich keine Probleme.

Auf microcontroller.net fand ich einen Beitrag, in dem folgende interessante Aussage steht:

'Wir kontaktierten Winsensor. Deren Antwort: die Sensoren würden mit 
Auto-Calibration ON ausgeliefert, weshalb die Sensoren so alle 24 
Stunden kurz mal 400ppm schnuppern müssten; ansonsten würden sie den 
gemessenen Minimal-Wert als 400ppm annehmen. Sowas stand aber nicht im 
Manual und wurde erst spaeter hinzugefügt.'

Wenn diese Aussage stimmt, dann ist es ja völlig klar, warum mein Sensor letztlich nur Mist anzeigt!

Fazit

Den Umgang mit dem Sensor habe ich erst mühsam erlernen müssen, da ich anfangs nicht wirklich mit ihm zurecht kam und möglicherweise taugt er auch einfach nicht. Es ist kein Problem ihn anzuschließen und Werte zu bekommen! Aber deren Interpretation ist nicht so einfach. Und was soll ich von einem Sensor halten, der erst nach einer Woche, oder so, vernünftige Werte liefert?

Kurz: Bis jetzt bin ich mit dem MH-Z19B Sensor noch nicht glücklich geworden. Wahrscheinlich muss ich den Sensor erst besser verstehen, um mit seinen Werten etwas anfangen zu können.

Meine bisherigen Erfahrungen würden sich auch dadurch erklären lassen, dass der Sensor überhaupt kein CO2 messen kann und der jeweils ausgegebene Wert schlicht von der Temperatur abhängig ist.

Denn jetzt im Herbst, in dem ich ihn teste, gehe ich für frische Luft aus dem warmen Zimmer auf den kalten Balkon und von dort wieder ins warme Zimmer. Würde der Sensor die CO2 einfach aus der Temperatur ableiten, würde er sich ganz ähnlich verhalten! 🙂

Eine Alternative ist möglichweise der SenseAir S8. Er ist aber auch deutlich teurer und ich muss mir noch überlegen, ob ich damit einen neuen Versuch wage.

 

14 Kommentare

  1. Du hast recht! Ich habe meinen mit dem auf der Seite verglichen und alle Indizien sprechen dafür, das meiner einer dieser Fake-Sensoren ist. Auch die ausgegebene Version ist 4.36. Das ist sehr schade. Vielleicht hole ich mir noch einmal einen und probiere es damit noch einmal. Danke für die Info!
    LG
    Thomas

  2. Schaut super aus, wie hast Du denn die Grafik gebaut? Baut das auf dem Eko Tuki Code auf?

    Falls Ja:
    Aktuell habe ich folgende Probleme mit dem Eko Tuki Code, eventuell kannst Du mir helfen:
    1. Wenn ich ein bmp in PROGMEM Code übersetze, dann ist das Bild auf dem Display verschoben. Ich probiere gerade noch ein einfaches 64×64 Monchrom bmp aus.
    2. Wenn ich den Code richtig verstehe, dann zieht sich der jpegRender die Infos aus den Dateien in data z.B. drawFFSJpeg(“/tsp_s.jpg”, 0, 0);
    Vermute mal dafür muss ich eine SD Karte anhängen. Die PINs werden aber im Eko Tuki Code nicht bezeichnet, oder?

    Falls Du das nicht mit dem Eko Tuki Code gamcht hast: Wie hast Du denn die Grafiken erstellt?
    Merci.
    Dirk

  3. Hallo Dirk,

    danke für das Lob. Das ist, bis auf die im Beitrag erwähnten Bibliotheken, mein eigener Code. Für die Grafik verwende ich die bekannte ‘TFT_eSPI’-Bibliothek, die scheinbar auch im Eko Tuki Code verwendet wird. Dies ist eine allgemeine Bibliothek für die Grafik-Programmierung. Grafiken kannst Du mit Inkscape malen und dann passend exportieren. War aber für dieses Projekt nicht nötig. Ich hab alles mit der TFT_eSPI Bibliothek gezeichnet. Anregungen für die Programmierung findest Du im Beispiel ‘TFT_FillArcSpiral’ von TFT_eSPI.

    Thomas

  4. Hallo Thomas,

    Danke für den Tipp. Jetzt läuft es prinzipiell. Ich habe meinen Code auf dem Animated_Dial aufgebaut. Und die Skala dann mit PowerPoint und Paint zusammengefrickelt, da ich mich mit Inkscape leider nicht gut auskenne.
    Jetzt noch flott den Sensor anschließen, und dann mal schauen, wie der Wert nach 2 Tagen Coding im Raum ist 🙂

    Dirk

  5. Hallo Thomas,

    Projekt ist fertig (fast): https://youtu.be/8iYROi_ITsg
    Das mit dem Lüften wird Dir bekannt vorkommen 🙂

    Was ich noch einbauen will, ist eine Art “high score”, also einen 2. Zeiger der pro Tag am höchsten Wert stehen bleibt, während der aktuelle Wert mit dem 1. Zeiger angezeigt wird. Allerdings wird aktuell der 2. Zeiger immer wieder überschrieben.

    Zu Deiner Frage: ich glaube die Werte sind ok, auch mit dem China-Fake. Ich baue das Teil aber noch einmal nach, und folge Deiner Empfehlung mit dem Original und dem grünen PCB.

    Dirk

  6. Hallo Dirk,

    sieht super aus!

    Das ist keine Empfehlung von mir gewesen, sondern ein Hinweis in einem Kommentar. Ich bin mir auch nicht sicher, ob der China Clone wirklich schlechter ist. Ich kenne den anderen ja gar nicht. Ich warte jetzt auf den Sommer, wenn Innentemperatur und Außentemperatur gleich sind und ich die Balkontür stundenlang offen lassen kann. Bin gespannt, wie sich das dann auswirkt.

    Thomas

  7. Hallo Tinkerpete,

    kannst d deinen Code zur Verfügung stellen? Ich würde gerne das TTGO T-Display mit dem MH-Z19B nachbauen.
    Viele Grüße
    Christof

  8. Das mit deinen Aussagen bezüglich der CO2 Konzentration solltest Du nochmal recherchieren. Nur mal so am Rande: Deine Ausatemluft hat im Normalfall ca 4%! CO2 Anteil, das sind 40000ppm CO2. Pflanzen des C3 Typs (das sind ALLE Agrarpflanzen sowie Bäume, Sträucher und Gräser) haben ein Wachstumsoptimum zwischen 900 und 1200 PPM CO2, weswegen in Gewächshäusern der CO2 Gehalt auf dieses Nieveau angehoben wird (meist durch Verbrennung von Erdgas). In der Arbeitsplatzschutzverordnung wird der erlaubte Grenzwert (AGW) für CO2 mit ca. 5000 ppm CO2 (9100mg CO2/m3) für eine durchschnittliche Schichtbelastung angegeben.(8h Schicht). Und dieser Wert darf zeitweise um den Faktor zwei überschritten werden. Dieser Wert kann in der TRGS900 gefunden werden. Zusammenfassend: CO2 im bereich bis 2000 ppm ist nicht gefährlich, noch hat es irgendwelche Auswirkungen auf den Menschen.

  9. Hallo Dirk,
    danke für Deine Infos! Ich habe nicht ganz verstanden um was es Dir jetzt genau geht? Bist Du der Meinung dass die von Bosch vorgeschlagene Einteilung nicht stimmt? Oder meinst Du das es nicht wichtig ist, von zu viel CO2 hervorgerufene Müdigkeit und eventuelle Kopfschmerzen nicht wichtig sind zu erkennen?
    LG Thomas

  10. Hallo Tinkerpete, ich finde die Idee mit dem CO2 Anzeiger klasse.
    Ich warte noch auf meinen Sensor. Hab mir auch Dein Video angeschaut – echt super.

    Die Frage nach dem Code kam schon – ich habe ihn aber leider nicht finden können.
    Ist der Code “confidential” oder kannst Du den bitte mit mir teilen? Ich würde mir gerne Deine Idee “nachbauen”. Danke und viele Grüße
    Markus

Schreibe einen Kommentar zu Tinkerpete Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert