Luftqualitäts-Sensor

Von | 6. Juli 2022

Wenn man seine Passivhaus Lüftunganlage optimieren möchte, also gezielt weniger die Ventilatoren laufen lassen will als im Standard, dann braucht es einen Gegenpart im Regelkreislauf, der mißt und meldet wo man steht.

Dafür habe ich einen Luftqualitätssensor gebaut, der aus folgenden vier Bauteilen besteht. Im Kern würde für die Luftqualität der CO2-Sensor reichen. Deutsche Empfehlungen sind <1000ppm gut, <2000ppm geht so, >2000ppm schlecht. In Österreich gilt <800ppm gut, <1400ppm geht so, darüber schlecht. Normale Außenluft hat ca 400ppm.

Einen DHT-22 für Temperatur und Luftfeuchtigkeit. Er ist mit 5V zu versorgen und liefert über eine Digitalverbinung seine Daten. Die Bibliothek ist für Arduino leicht integrierbar, so daß die Aufgabe in wenigen Zeilen Code erledigt ist.

#include "DHT.h"
#define DHTPIN 5     // what digital pin the DHT22 is conected to
#define DHTTYPE DHT22   // there are multiple kinds of DHT sensors

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  dht.begin();
}

void loop()
{
    float h = dht.readHumidity();
    float t = dht.readTemperature();
}

Einen MH-Z19C-PH CO2-Sensor. Er ist auch mit 5V zu versorgen und liefert ein PWM-Signal welches den Grad der Belastung beschreibt. Via pulseIn liefert er uns die Dauer des High-Signals in Nanosekunden. Entweder wissen wir wie lang es maximal ist, dann reicht es HIGH zu lesen, oder aber wir lesen auch LOW des (nächsten Zyklus) und wissen dann (ungefähr) wie groß die Anteile sind. Der Timeout muss für zwei vollständige Zyklen reichen, weil man den ersten knapp verpassen kann.

void setup()
{
  pinMode(PWMPIN, INPUT);
}

void loop()
{
    //https://unsinnsbasis.de/co2-sensor-mhz19b/
    int pwm_value = pulseIn(PWMPIN, HIGH, 2200000UL);
    int ppm = ((pwm_value / 1000)- 2) * 5;
}

Einen MQ-135 der ganz allgemein Benzol, Gas und Rauch mißt. Auch hier wieder Versorgung mit 5V. Geliefert wird ein Analog-Signal zwischen 0 und 5V. Der ESP8622, der das alles auswertet erwartet allerdings 0-3.3V, so daß es noch eines Spannungsteilers bedarf der uns das herunterbricht. Die Code Zeilen sind dann trivial.

void setup()
{
  //analog Read auf A0 braucht keinen Setup
}

void loop()
{
  //https://www.codrey.com/electronic-circuits/how-to-use-mq-135-gas-sensor/
  int anval = analogRead(ANALOGPIN);  //0-1023, bei 0-3.3V, Achtung(!) Sensor  
                                     // liefert bis 5V => VoltageDivider notwendig
}

Da die Stromversorgung über den ESP8622 und USB für die Bauteile nicht ausreicht, ist ein DC/DC-Wandler verbaut, der mir aus 24V stabile 5V macht.

Zusammengehalten wird das ganze von einem ESP8622 in der Variante NODE-MCU weil es sich so leichter zusammenbauen läßt.

Zur Realisierung nehme ich nach einen Tipp, danke Peter, Streifenraster-Platinen, dabei muss ich “nur” über die waagerechten Verbindungen nachdenken, und in der vertikalen ggf. Unterbrechungen einplanen. Die Planung erfolgt in paint.net in Ebenen: Gitter, vertikale-Verbindungen, Cuts, horizontale Verbindungen und Bauteile. So kann man dies als ein Werk planen und danach im Ausdruck nach Vorder- und Rückseite (horizontal spiegeln) trennen um sich ein Modell zu drucken.

Am besten, dann muss man es nicht mehrmals machen, die Bauteile auf der Original-Platine anordnen und dann dazu die Verbindungen entwickeln.

Die Platine hat zusätzlich noch Steckverbinungen bekommen um die serielle Schnittstelle des ESP8622 mit der seriellen Schnittstelle des MH-Z19-C verbinden zu können. Zudem Zugriff auf GND um den MH-Z19 durch schließen einer Brücke zu kalibrieren. Und wenn man schon mal dabei ist, habe ich auch die 5V zugänglich gemacht.

Die Messwerte werden quasi im Original und mit einer kleinen Bereichsanpassung direkt über http an einen Server gesendet, der sich dann um des Rest kümmern kann, oder wo sich ggf eine Steuerung bedienen könnte.

    //Daten zum melden fertig machen
    itoa(anval,mqr,10);
    itoa(pwm_value,mzr,10);
    itoa(ppm,mzv,10);
    String queryString = HTTPURL + "?room=WOZI&h=" + String(hs) + "&t=" + String(ts)
            + "&mqr=" + String(mqr) + "&mzr=" + String(mzr) + "&mzv=" + String(mzv);

    //melden
    //https://randomnerdtutorials.com/esp8266-nodemcu-http-get-post-arduino/
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;
      http.begin(client, queryString.c_str());
      .....

Den vollständigen Sourcecode findet man hier.

Über den Server kann man dann auswerten:

Wobei ich die Werte bei Temperatur und Luftfeuchtigkeit nicht glaube, da sagen die analogen Messgeräte was anderes. Da muss dann ggf noch ein BME280 her.

Wer Fragen hat, möge Sie stellen. Fragenden Menschen kann geholfen werden.

Schreibe einen Kommentar

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