CO2-Sensor gegen Corona: Version mit ESP8266, MH-Z19B und Tasmota

Wie das Umweltbundesamt in dieser Stellungnahme am 12. August 2020 schreibt, wird das Corona-Infektionsrisiko in Innenräumen durch Lüften stark verringert.

Ein guter Indikator für ausreichenden Luftwechsel stellt die CO2-Konzentration dar, die unter 1000 ppm bleiben sollte.

Diese Stellungnahme hat sich herumgesprochen und wer zur Zeit ein CO2-Messgerät kaufen möchte, muss mit ziemlich langen Lieferzeiten rechnen.

Wer nicht so lange warten möchte und gern bastelt, der kann sich ein CO2-Messgerät selber bauen. CO2-Sensoren als elektronische Bauteile sind nämlich nach wie vor lieferbar.

Ein CO2-Sensor nach dem NDIR-Messprinzip zu einem erschwinglichen Preis ist der MH-Z19B, den man bei ebay oder direkt aus China beziehen kann. Mit diesem Sensor wird über eine 3.3V-UART-Schnittstelle (5V-kompatibel laut Datenblatt) kommuniziert; man braucht also lediglich die Anschlüsse GND, Vin, Rx und Tx anzuschließen.

Zusammen mit einem ESP8266-Board wie dem WROOM02 und einer Trägerplatine (wie zum Beispiel meiner eigenen WROOM02_EV, es geht aber praktisch jede andere ESP8266-Platine auch) kann man in 1-2 Stunden (wenn alle Platinen und Bauteile vorliegen) ein simples und genaues CO2-Messgerät bauen, das man in sein Home-Automation-System einbinden kann, wenn es zum Beispiel auf Node-RED oder einem anderen aktuellen System basiert.

So sieht mein CO2-Messgerät aus: Oben der CO2-Sensor MH-Z19B, darunter ein Li-Akku und ganz unten das WROOM02_EV, auf dem ein WROOM02 sitzt. Weil ich den CO2-Sensor zum Herumtragen auch mit dem Li-Akku betreiben möchte, gibt es noch ein kleines Step-up-Converter-Board (HW-106, für wenig Geld aus China) zwischen dem WROOM02_EV und dem MH-Z19B. Der MH-Z19B braucht nämlich laut Datenblatt 4.5-5.5 Volt Betriebsspannung. Das WROOM02_EV ist hier voll bestückt zu sehen, aber für diese Anwendung ist das völlig unnötig. Man muss nur das bestücken, was man wirklich braucht und kann zum Beispiel den Low-Power-Timer und alle daran angeschlossenen Schaltungsteile weglassen; auch die Sensoren usw. brauchen nicht bestückt zu werden. Das Ganze wurde auf eine kleines Fichtenbrettchen montiert. Links sieht man das angeschlossene USB-Micro-Ladekabel für Dauerbetrieb.

Den ESP8266 muss man nicht programmieren, sondern lediglich mit der genialen Tasmota-Firmware beladen.

Aber aufpassen, der Sensor MH-Z19B wird nur von der Variante  tasmota-sensors.bin unterstützt, die man hier runterladen kann.

Nachdem man mit dem Tasmotizer und einem USB-to-Serial-Konverter die Firmware auf den ESP8266 gebracht hat, arbeitet der EP8266 als WLAN Access Point.

Mit dem Smartphone oder Tablet loggt man sich darauf ein und stellt die SSID und das WLAN-Passwort des hauseigenen WLANs ein. Der ESP8266 bootet anschließend und loggt sich dann ins WLAN ein.

Welche IP-Adresse der ESP8266 vom DHCP-Server bekommen hat, findet man zum Beispiel über seine Fritzbox oder einen IP-Scanner wie Fing raus.

Der Name des neu angemeldeten ESP8266 beginnt mit tasmota_…….

Als nächstes muss der Firmware mitgeteilt werden, dass man ein generisches ESP8266-Board betreibt und dass man an die UART-Schnittstelle den MHZ-19B-Sensor angeschlossen hat. Spätestens jetzt entfernt man den USB-to-Serial-Converter von IO1/TxD und IO3/RxD des ESP8266 und schließt an diese Pins stattdessen den MH-Z19B an.

Um die Firmware zu konfigurieren tippt man im Browser die zuvor ermittelte IP-Adresse des ESP8266 ein und wählt dann Configuration -> Configure Module.

Die richtige Einstellung muss so ausschauen (wenn man Rx und Tx nicht vertauscht hat, sonst muss man halt eben Rx und Tx wieder zurücktauschen):

Nach dem Neustart sollte das Main Menu jetzt so aussehen:

Wenn das nicht der Fall sein sollte und bei beiden Messwerten „0“ steht, dann hat man höchstwahrscheinlich Rx und Tx vertauscht.

Zum Einbinden ins Home Automation System bietet Tasmota MQTT an.

Zuerst wird im Menu Configuration -> Configure Other bei „MQTT Enable“ ein Häkchen gemacht. Dann geht man zum Menu Configuration -> Configure MQTT. Bei mir sieht die Einstellung so aus:

Man braucht lediglich die IP-Adresse des Brokers unter Host() einzutragen, sowie die Portnummer (meistens 1883) und dann noch einen sinnvollen Namen für das Topic (hier: mhz19b).

Wem das alles nichts sagt, der möge nach „MQTT“ googeln, und/oder nach „mosquitto“.

Besonders sinnvoll ist es, den MQTT-Broker und Node-RED auf einem Computer zu installieren, der dauernd läuft. Dafür bietet sich ein Raspberry Pi natürlich besonders an.

Wenn man eine Web-Applikation erzeugen möchte, die aus einem Anzeigeinstrument für die CO2-Konzentration besteht und einem darunter angeordneten Diagramm, das den CO-Konzentrationsverlauf über der Zeit zeigt, so wie hier:

dann ist Node-RED ein einfacher und komfortabler Weg dorthin: Man ruft irgendeinen Browser auf irgendeinem Rechner in demselben Subnetz auf, in dem sich auch der Raspberry Pi befindet, auf dem Node-RED läuft.

Zum Editieren des Node-RED-Flows ruft man den Port 1880 der IP-Adresse des Raspberry-Pi auf und kommt so zum Flow-Editor. Dort zeichnet man folgende Nodes und Verbindungslinien:

Den ersten Node, den INJECT node, konfiguriert man so, dass er alle 30 Sekunden (nur als Beispiel) ein MSG-Objekt an den nächsten Node schickt. Die Message-Payload lässt man auf „timestamp“ eingestellt.

Der zweite Knoten ist ein TASMOTA SENSOR-Knoten. Wenn das Tasmote-Paket für Node-RED noch nicht installiert sein sollte, dann muss man das „node-red-contrib-tasmota“-Paket in Node-Red über Einstellungen -> Palette verwalten -> Installieren suchen und installieren.

Den Sensor-Knoten kann man umbenennen, z.B. in „CO2-Sensor“. Als Server trägt man den Namen des eigenen mosquitto-Brokers ein. Durch Druck auf das Bleistift-Symbol erscheint der Konfigurationsdialog dafür:

Wenn man den MQTT-Broker auf demselben Raspberry Pi laufen lässt wie Node-RED, dann trägt man hier als Server „localhost“ und als Port „1883“ ein, außer man betreibt MQTT auf einem anderen Port.

Der dritte Knoten, der gelb-grüne, ist ein CHANGE-Node. Mit diesem Knoten ändert man die Message-Topic auf einen sinnvollen Namen, z.B. auf „mhz19b“. Das ist vor allem nützlich, wenn man mehrere Messdatenquellen in demselben Diagramm darstellen möchte, zum Beispiel die Daten eines zweiten CO2-Sensors. Ein kleines Fenster am Mauszeiger zeigt dann an, welche Kurve zu welcher Datenquelle gehört. Außerdem muss man auswählen, welcher Wert aus dem msg-Objekt, das vom TASMOTA SENSOR-node kommt, denn überhaupt angezeigt werden soll. Diesen Wert muss man msg.payload zuweisen. Eine einfache Möglichkeit, das zu tun, ist, msg.payload dem Ergebnis der JSONata-Abfrage mit dem String „msg.payload.MHZ19B.CarbonDioxide“ zuzuweisen:

Jetzt muss man nur noch den Ausgang des CHANGE-Knoten mit einem GAUGE-Knoten und einem CHART-Knoten verbinden.

Den GAUGE-Knoten kann man zum Beispiel so konfigurieren, dass der Anzeigebereich von 400 ppm bis 2000 ppm geht, dass die Anzeige zwischen 400 ppm und 800 ppm grün ist, zwischen 800 ppm und 1000 ppm auf gelb wechselt und oberhalb von 1000 ppm auf rot:

Den CHART-Knoten kann man so konfigurieren, dass er den CO2-Konzentrationsverlauf der letzten 24 Stunden anzeigt:

Der weiteren Fantasie sind keine Grenzen gesetzt:

  • Erinnerungs-Email oder Telegram-Message verschicken, wenn die CO2-Konzentration zu hoch wird
  • Automatischen Fensteröffner oder Lüfter einschalten, wenn die CO2-tration zu hoch wird
  • Signalton ertönen lassen, wenn die CO-2-Konzentration zu hoch wird

usw. usf.

6 Replies to “CO2-Sensor gegen Corona: Version mit ESP8266, MH-Z19B und Tasmota”

  1. Super Erklärt und einfach nach zu bauen. Ich liebe Tasmota, sehr einfach dort alles nötige einzustellen! Vielen Dank und mach weiter so 😉

    1. Ich hab ehrlich gesagt noch nicht gemessen wie lang der Akku hält. Aber ich benutze den Akkus nur zum Überbrücken der Netzstromversorgung um den Sensor von einem Ort zu einem anderen herumzutragen oder für kurze Testmessungen an einem bestimmten Ort. Mehr als 1-2 Stunden würde ich nicht erwarten.

Schreibe einen Kommentar zu RickSanchez Antworten abbrechen

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