Ob zu Hause, in der Schule oder am Arbeitsplatz – wir alle haben großes Interesse, in gut belüfteten Räumen zu leben, zu lernen und zu arbeiten. Der CO2-Gehalt und die relative Luftfeuchtigkeit gelten als wichtige Indikatoren der Luftqualität: Gute Raumluft hat weniger als 1.000 ppm CO2 und eine relative Luftfeuchtigkeit, die mehr als 40 Prozent beträgt.
Auf dieser Basis wollen wir ein Messgerät bauen, mit dem wir diese Größen erfassen und dann entsprechend handeln können. Gerade für Schulen oder Büros bietet dieses Messgerät eine gute Möglichkeit, um Richtlinien für regelmäßiges Lüften in Zeiten von Corona leichter einzuhalten.
Wir realisieren unser Projekt mithilfe eines ESP32-Controllers mit WLAN-Funktion und den zwei Sensoren DHT22 und MH-Z19B. Die Stromversorgung erfolgt wahlweise über ein USB-Netzteil oder eine kleine Powerbank.
1. Das Projekt

Geeignet für: Anfänger
Zeitaufwand: 2 Stunden
Das wird benötigt:
- Die Teile aus diesem reichelt-Warenkorb.
- Außerdem: Lötkolben, PC mit Windows oder Linux, diverses Kleinwerkzeug
Budget: etwa 55 €
2. Umsetzung
2.1 Hardware
Bei der CO2-Messung handelt es sich um ein relativ kompliziertes Infrarotmessverfahren. Dank der Verfügbarkeit preiswerter integrierter Sensoren, lässt sich das Anliegen aber auch für geschätzte Bastler*innen einfach und unkompliziert umsetzen.
Nachdem wir die Einzelteile und Werkzeuge bereitgestellt und auf Vollständigkeit kontrolliert haben, können wir loslegen.
Wir nehmen uns das Gehäuse, in unserem Fall ein Universalgehäuse aus dem reichelt-Sortiment, und positionieren probehalber die Laborkarte. Wenn nötig, brechen wir diese vorher auf die passende Größe herunter.
Dann ordnen wir die beiden Sensoren so an, dass sie einen Abstand zum ESP32 von mindestens drei cm haben, sodass das spätere Messergebnis nicht durch die Eigenwärme des ESP32 verfälscht wird. Damit der CO2-Sensor gut von der Raumluft umströmt wird, muss das Gehäuse entsprechende Öffnungen haben.

Wir nehmen die Teile wieder aus dem Gehäuse und bohren nun die Schraubenlöcher in die Leiterkarte, um diese im weiteren Verlauf im Gehäuse befestigen zu können.
Außerdem bohren wir in das Gehäuse ein Loch für das USB-Kabel für die spätere Stromversorgung (s. Foto).
Dann löten wir den ESP32 und die Sensoren auf die Leiterkarte.
Beide Sensoren haben eine digitale Schnittstelle. Der CO2-Sensor besitzt auch einen Analogausgang, den wir jedoch nicht benutzen, weil hier die Messgenauigkeit geringer ist.
Wir verbinden nun die Pins der Sensoren mit den Pins am ESP32 mit Schaltdraht entsprechend dem Schaltplan und überprüfen anschließend noch einmal die Übereinstimmung der Verdrahtung mit dem Schaltplan, um späteren Ärger zu vermeiden.
Jetzt setzen wir unsere bestückte Leiterplatte ins Gehäuse und befestigen sie dort mit kleinen Schrauben.
Alternativ können natürlich auch andere Gehäuse, z. B. alte Rauchmelder, verwendet werden.
Wer es einfach und praktisch haben möchte, kann, statt zu löten, die Bauteile frei verdrahten und im Gehäuse befestigen (mit Klebepads o. ä.).


Der Wächter wird durch ein USB-Kabel mit dem PC verbunden. Später, wenn die Software auf das CO2-Messgerät geladen ist, erfolgt die Stromversorgung über ein USB-Netzteil oder eine Powerbank.
Der Kopf qualmt schon? Jetzt: Zimmer lüften!
2.2 Software-Installation
Um den Sensor „zum Leben zu erwecken“, brauchen wir die passende Software. Diese werden wir aus schon vorhandenen Bibliotheken und eigenen Programmen erstellen.
Wir verwenden dazu die Arduino-IDE, die, falls noch nicht vorhanden, als erstes auf dem PC installiert werden muss.
Diese konfigurieren wir für unseren Sensor und installieren über den Board-Verwalter das ESP32-Paket entsprechend den Anweisungen, die dem Board ESP32 beiliegen.
Um die Hard- und Software über den „seriellen Monitor“ zu testen, wird der Sensor durch ein USB-Kabel mit dem PC verbunden. Beim ersten Start stellen wir über /Werkzeuge/Board den „ESP32 Dev Module“ ein.
Dann laden wir über Datei/Beispiele/ESP32/ChipID das Testprogramm „GETChipID“ herunter. Damit prüfen wir die Programmierung und Kommunikation des Boards.
Wenn der Test erfolgreich ist, geht es zum nächsten Schritt: dem Installieren und Einbinden der Bibliotheken.
Wir nutzen dafür bereits vorhandene und getestete Softwarebibliotheken (Softwarequellen), in denen die von uns benötigten Funktionen schon definiert sind und die im Internet frei zur Verfügung stehen. Sie werden in der Arduino IDE über den Bibliotheksverwalter installiert und über die „#include ….“ – Anweisung in unseren Quellcode eingebunden.
Im github haben wir alle notwendigen Bibliotheken und die genauen Anweisungen zum Herunterladen und zum Installieren der Softwarequellen zusammengestellt.
https://github.com/repair-frank/luftwaechter
2.3 Software-Beschreibung
Jetzt erläutern wir die Software im Einzelnen:
Um den ESP32 mit dem WLAN-Netzwerk zu verbinden und damit wir unseren Webserver erreichen können, benötigen wir die WiFi.h- Bibliothek.
#include "WiFi.h"
Um den Server einzurichten (d.h. Serverrouten und -funktionen zu konfigurieren), nutzen wir die Bibliothek ESPAsyncWebServer.h.
#include "ESPAsyncWebServer.h"
Für die Kommunikation mit dem Feuchtigkeitssensor DHT22 benötigen wir die DHTesp.h Bibliothek, die für uns das Single-Wire-Protokoll organisiert.
#include "DHTesp.h"
Der MHZ-19 kommuniziert mit dem ESP32 über ein serielles asynchrones Protokoll, das über die
SoftwareSerial.h organisiert wird:
#include "SoftwareSerial.h"
Die Anweisungen zur Kalibrierung und zum Auslesen der Messwerte des CO2-Sensors sind in der MHZ19.h Bibliothek untergebracht:
#include "MHZ19.h"
Die verwendeten Pins des ESP32 werden so definiert:
#define RX_PIN 33
#define TX_PIN 32
int dhtPin = 4;
Diese Anweisungen sind die Konstruktoren für die einzelnen Bibliotheken:
DHTesp dht;
MHZ19 myMHZ19;
SoftwareSerial mySerial(RX_PIN, TX_PIN);
Wir benötigen außerdem ein Objekt der Klasse AsyncWebServer, mit dem der Server, wie bereits erwähnt, konfiguriert wird.
Beachten Sie, dass der Konstruktor dieser Klasse als Eingabe die Nummer des Ports empfängt, an dem der Server empfangsbereit ist. Wir verwenden Port 80, den Standard-HTTP-Port.
AsyncWebServer server(80);
Zum Abschluss der Deklarationen benötigen wir die Anmeldeinformationen des WLAN-Netzwerks, mit dem der ESP32 eine Verbindung herstellen wird.
const char* ssid = "Netzwerkname";
const char* password = "Passwort";
Als nächstes initialisieren wir die serielle Schnittstelle, damit wir Nachrichten zur Inbetriebnahme ausgeben können. Wir werden sie verwenden, um nach dem Herstellen der WLAN-Verbindung die dem ESP32 im Netzwerk zugewiesene IP zu übertragen. So können wir später von einem Client aus auf den Webserver zugreifen.
Serial.begin(115200);
Um den ESP32 mit dem WiFi-Netzwerk zu verbinden, rufen wir die begin-Methode einer externen Variablen namens WiFi auf, die beim Importieren der WiFi.h-Bibliothek verfügbar ist. Als Eingabe erhält diese Methode den Netzwerknamen und das Kennwort, die wir auch in globalen Variablen gespeichert haben.
WiFi.begin(ssid, password);
Ist die Verbindung erfolgreich hergestellt, wird über den seriellen Monitor die IP-Adresse des Wächters gesendet. Wenn nicht, wird das CO2-Messgerät immer wieder versuchen, eine Verbindung aufzubauen. Da muss der Nutzer eingreifen und korrigieren.
Sobald der WLAN-Verbindungsvorgang abgeschlossen ist, folgt die Konfiguration der Serverrouten. Grundsätzlich müssen wir für jeden Endpunkt in unserem Server eine Handling-Funktion angeben.
Wir haben eine Route für jeden Messtyp: Temperatur, Luftfeuchtigkeit und CO2. Jede Route hört nur HTTP-GET-Anforderungen ab.
Die erste Route, die wir konfigurieren werden, ist die CO2-Messung. Sie wird ” / co2 ” genannt.
server.on("/co2", HTTP_GET, [](AsyncWebServerRequest * request) {
//Route handling function
});
Innerhalb der „handling function“ führen wir die Messung der CO2-Konzentration mit dem MH-Z19 durch.
int measurement = myMHZ19.getCO2()
Genauso behandeln wir die Temperatur- und Feuchtigkeits-Messung.
Der CO2-Sensor wird automatisch kalibriert. Dazu wird der niedrigste Messwert innerhalb von 24 Stunden als 400 ppm CO2-Wert angenommen. Unter normalen Bedingungen muss man sich darum nicht kümmern. Das passiert im Hintergrund und völlig selbstständig.
Das eigentliche Hauptprogramm ist leer. Alle Routinen laufen im Hintergrund ereignisgesteuert.
Im Quellcode befinden sich einige Anweisungen, die nur für den Test und die Inbetriebnahme genutzt werden.
2.4 Test der Software
Jetzt beginnt die Testphase des CO2-Messgeräts.
Wenn unser Programm fehlerfrei kompiliert wurde, wird es zum CO2-Wächter übertragen.
Sind über #define test die Testroutinen aktiviert, werden die aktuelle IP-Adresse und die Sensorwerte im Sekundentakt im seriellen Monitor angezeigt.
Diese Werte sollten im erwarteten Bereich liegen. Wenn das nicht der Fall ist, müssen wir uns auf Fehlersuche begeben, d. h. Verdrahtungen und Softwaredeklarationen überprüfen.
Achtung: Vorher Spannung abschalten!
Wenn alles funktioniert, deaktivieren wir die Testanweisung (// #define test) und kompilieren das Programm noch einmal.
Die Abfrage der Messwerte kann nun von einem beliebigen Gerät im WLAN-Netzwerk über einen Webbrowser erfolgen.



Nun ist der Moment gekommen, einen geeigneten Messort im Raum auszuwählen. Der CO2-Messer soll gut von der Raumluft umspült werden und Störungen durch andere Luftquellen (Fenster, Ofen usw.) sollten vermieden werden.

3. Fazit
Die Überwachung der Raumluft mit dem selbstgebauten CO2-Messgerät funktioniert! Das Gerät ist preiswert und relativ einfach zu bauen und zu programmieren. Außerdem bietet das Gerät Möglichkeiten zur Erweiterung: Mittels komplexerer Software lassen sich Funktionen wie optischer / akustischer Alarm, Luftbefeuchter und die Verringerung des Strombedarfs für längerfristigen Batteriebetrieb hinzufügen. Im Web gibt es dazu zahlreiche Anregungen und umfangreiche Sammlungen von Bibliotheken.