MQ135. Sensorwert fällt anstatt zu steigen.

Hallo zusammen,

ich habe ein Projekt in dem ich 4 MQ135 verbaut habe und diese sollen mir einen Wert für den CO2-Gehalt in der jeweiligen Kammer liefern.
Diese Werte werden untereinander verglichen, ich will also keine exakten Werte und weiß auch das dies ohne Referenz nicht möglich ist.
Mein Problem ist: Sobald ich CO2 aus der Gasflasche in die Kammer gebe, sinkt der gemessene Wert anstatt zu steigen. Der Sensor scheint also ein anderes Gas zu detektieren.

Ich benutze folgende Bibliothek:
https://github.com/GeorgK/MQ135

und der relevante Code beginnt ab Zeile 108:

#include <MQ135.h>
#include <DHT.h>
#include <Wire.h>              //Bibliothek hinzufügen      
#include <LiquidCrystal_I2C.h> //Bibliothek hinzufügen

#define DHT1PIN 3             //Dem ersten DHT-Sensor wird Pin 3 zugeordnet
#define DHT2PIN 2             //Dem zweiten DHT-Sensor wird Pin 2 zugeordnet
#define DHT3PIN 5             //Dem dritten DHT-Sensor wird Pin 4 zugeordnet
#define DHT4PIN 4             //Dem vierten DHT-Sensor wird Pin 5 zugeordnet
#define DHT1TYPE DHT22        //Der erste DHT-Sensor wird als DHT22 deklariert
#define DHT2TYPE DHT22
#define DHT3TYPE DHT22
#define DHT4TYPE DHT22

LiquidCrystal_I2C lcd1(0x27, 16, 2);  //Hier wird das erste Display benannt (Adresse/Zeichen pro Zeile/Anzahl Zeilen). In unserem Fall „lcd1“. Die Adresse des I²C Displays kann je nach Modul variieren.
LiquidCrystal_I2C lcd2(0x23, 16, 2);  //Hier wird das zweite LCD benannt, hier "lcd2".
LiquidCrystal_I2C lcd3(0x25, 16, 2);  //Hier wird das zweite LCD benannt, hier "lcd3".
LiquidCrystal_I2C lcd4(0x26, 16, 2);  //Hier wird das zweite LCD benannt, hier "lcd4".
DHT dht1(DHT1PIN, DHT1TYPE);          //Der Sensor wird ab jetzt mit „dht1“ angesprochen
DHT dht2(DHT2PIN, DHT2TYPE);          //Der Sensor wird ab jetzt mit „dht2“ angesprochen
DHT dht3(DHT3PIN, DHT3TYPE);
DHT dht4(DHT4PIN, DHT4TYPE);

  MQ135 gasSensor0 = MQ135(2);    //Sensor Nr 0 (gasSensor0)an Analogen Eingang A2 (MQ135(2)) angeschlossen
  float Co2ppm0;
  float Co2ppmMin0;
  float Co2ppmMax0;

  MQ135 gasSensor1 = MQ135(3);    //Sensor Nr 1 (gasSensor1)an Analogen Eingang A3 (MQ135(3)) angeschlossen
  float Co2ppm1;
  float Co2ppmMin1;
  float Co2ppmMax1;

  MQ135 gasSensor2 = MQ135(0);    //Sensor Nr 2 (gasSensor2)an Analogen Eingang A0 (MQ135(0)) angeschlossen
  float Co2ppm2;
  float Co2ppmMin2;
  float Co2ppmMax2;
  
  MQ135 gasSensor3 = MQ135(1);    //Sensor Nr 3 (gasSensor3)an Analogen Eingang A1 (MQ135(1)) angeschlossen
  float Co2ppm3;
  float Co2ppmMin3;
  float Co2ppmMax3;
  
void setup() {
// Temperatursensor
    Serial.begin(9600); //Serielle Verbindung starten
    dht1.begin(); //erster DHT22 startet
    dht2.begin(); //zweiter DHT22 startet
    dht3.begin(); //...
    dht4.begin();
    delay(1000);  // 1000 millisekunden stop 

// CO2-Sensor
    Co2ppmMin0 = 10000; //Initiieren der Max-Variable für ersten Sensor
    Co2ppmMax0 = 0;     //Initiieren der Min-Variable für ersten Sensor
    Co2ppmMin1 = 10000; //Initiieren der Max-Variable für zweiten Sensor
    Co2ppmMax1 = 0;     //Initiieren der Min-Variable für zweiten Sensor
    Co2ppmMin2 = 10000;
    Co2ppmMax2 = 0;
    Co2ppmMin3 = 10000;
    Co2ppmMax3 = 0;

// LCDs
  lcd1.init(); //Im Setup wird das LCD1 gestartet
  lcd2.init(); //Im Setup wird das LCD2 gestartet
  lcd3.init(); //Im Setup wird das LCD3 gestartet
  lcd4.init(); //Im Setup wird das LCD4 gestartet
  lcd1.backlight(); //Hintergrundbeleuchtung von LCD1 einschalten (0 schaltet die Beleuchtung aus).
  lcd2.backlight(); //Hintergrundbeleuchtung von LCD2 einschalten (0 schaltet die Beleuchtung aus).
  lcd3.backlight(); //Hintergrundbeleuchtung von LCD3 einschalten (0 schaltet die Beleuchtung aus).
  lcd4.backlight(); //Hintergrundbeleuchtung von LCD4 einschalten (0 schaltet die Beleuchtung aus).

// Begrüßung
  lcd1.setCursor(0,0);        //Der folgende Text soll beim LCD1 beim ersten Zeichen in der ersten Zeile beginnen.
  lcd1.print("Energiewende"); //In der ersten Zeile soll der Text „Display1 Zeile 1“ angezeigt werden
  lcd1.setCursor(0,1);        //Der folgende Text soll beim LCD1 beim ersten Zeichen in der zweiten Zeile beginnen.
  lcd1.print("macht Schule"); //In der zweiten Zeile soll der Text „Display1 Zeile 2“ angezeigt werden
  lcd2.setCursor(0,0);        //Der folgende Text soll beim LCD2 beim ersten Zeichen in der ersten Zeile beginnen.
  lcd2.print("Experiment:");  //In der ersten Zeile soll der Text „Display2 Zeile 1“ angezeigt werden
  lcd2.setCursor(0,1);        //Der folgende Text soll beim LCD2 beim ersten Zeichen in der zweiten Zeile beginnen.
  lcd2.print("Klimabox");     //In der zweiten Zeile soll der Text „Display2 Zeile 2“ angezeigt werden
  lcd3.setCursor(0,0);        //Der folgende Text soll beim LCD1 beim ersten Zeichen in der ersten Zeile beginnen.
  lcd3.print("Energiewende"); //In der ersten Zeile soll der Text „Display1 Zeile 1“ angezeigt werden
  lcd3.setCursor(0,1);        //Der folgende Text soll beim LCD1 beim ersten Zeichen in der zweiten Zeile beginnen.
  lcd3.print("macht Schule"); //In der zweiten Zeile soll der Text „Display1 Zeile 2“ angezeigt werden
  lcd4.setCursor(0,0);        //Der folgende Text soll beim LCD2 beim ersten Zeichen in der ersten Zeile beginnen.
  lcd4.print("Experiment:");  //In der ersten Zeile soll der Text „Display2 Zeile 1“ angezeigt werden
  lcd4.setCursor(0,1);        //Der folgende Text soll beim LCD2 beim ersten Zeichen in der zweiten Zeile beginnen.
  lcd4.print("Klimabox");     //In der zweiten Zeile soll der Text „Display2 Zeile 2“ angezeigt werden
  delay(4000);                //Zeitraum für Begrüßung in ms
  lcd1.clear();               // Anzeige wird gelöscht
  lcd2.clear();
  lcd3.clear();
  lcd4.clear();
  delay(1000);                //Zeitraum bis zur nächsten Bildschirmausgabe in ms


}

void loop() 
  {
  delay(1000);                //1s Pause, denn der DHT22 braucht seine Zeit
  float Temperatur1 = dht1.readTemperature();   //die Temperatur auslesen und unter „Temperatur“ speichern
  float Temperatur2 = dht2.readTemperature();
  float Temperatur3 = dht3.readTemperature();
  float Temperatur4 = dht4.readTemperature();
  Co2ppm0 = gasSensor0.getPPM(); //Holt sich die Werte vom MQ135
  Co2ppm1 = gasSensor1.getPPM();
  Co2ppm2 = gasSensor2.getPPM();
  Co2ppm3 = gasSensor3.getPPM();
  
  if ( Co2ppm0 < Co2ppmMin0)
  {
  Co2ppmMin0 = Co2ppm0;
  }
    if ( Co2ppm1 < Co2ppmMin1)
  {
  Co2ppmMin1 = Co2ppm1;
  }
    if ( Co2ppm2 < Co2ppmMin2)
  {
  Co2ppmMin2 = Co2ppm2;
  }
    if ( Co2ppm3 < Co2ppmMin3)
  {
  Co2ppmMin3 = Co2ppm3;
  }
  lcd1.setCursor(0, 0);
  lcd1.print("CO2: ");
  lcd1.print(Co2ppm0);
  lcd1.print(" ppm");
  lcd1.setCursor(0, 1);
  lcd1.print(Temperatur1);
  lcd1.print(" Grad Cel.");
  {
  lcd2.setCursor(0, 0);
  lcd2.print("CO2: ");
  lcd2.print(Co2ppm1);
  lcd2.print(" ppm");
  lcd2.setCursor(0, 1);
  lcd2.print(Temperatur2);
  lcd2.print(" Grad Cel.");
  }
  {
  lcd3.setCursor(0, 0);
  lcd3.print("CO2: ");
  lcd3.print(Co2ppm2);
  lcd3.print(" ppm");
  lcd3.setCursor(0, 1);
  lcd3.print(Temperatur3);
  lcd3.print(" Grad Cel.");
  }
  {
  lcd4.setCursor(0, 0);
  lcd4.print("CO2: ");
  lcd4.print(Co2ppm3);
  lcd4.print(" ppm");
  lcd4.setCursor(0, 1);
  lcd4.print(Temperatur4);
  lcd4.print(" Grad Cel.");
  }
  {
    Serial.println("Co2-Werte:");
    Serial.println((int)Co2ppm0);
    Serial.println((int)Co2ppm1);
    Serial.println((int)Co2ppm2);
    Serial.println((int)Co2ppm3);
    Serial.println("Temperaturen:");
    Serial.println(Temperatur1);
    Serial.println(Temperatur2);
    Serial.println(Temperatur3);
    Serial.println(Temperatur4);
  }
  }

Gibt es vielleicht Funktionen mit denen ich bestimmen kann, welches Gas gemessen wird?
In diversen Anleitungen wird CO2 nämlich mit der .getPPM()-Funtkion gemessen, was bei mir aber das besagte Problem hervorruft.

Vielen Dank im Voraus.

Ich kenne diesen Sensor nicht und hab deinen Beitrag auch nur überflogen. Aber kann es vielleicht sein das der Sensor mit einem Pullup oder Pulldown Widerstand angeschlossen werden muss?
Außerdem lassen deine If Abfragen nur eine Tendenz in einer Richtung zu.

Gruß

laut Datemblatt: https://www.olimex.com/Products/Components/Sensors/Gas/SNS-MQ135/resources/SNS-MQ135.pdf ist der Sensor unter anderem auch auf CO2 empfindlich.
Laut Diagramm fig2. bzw fig 3 ist der Sensor von 10 bis 200ppm empfindlich. Als Bezugswert ist der Widerstandswert bei einer Gasatmosfere mit 100ppm NH3 in sauberer Luft. Saubere Luft hat aber ca 400ppm CO2.
Ich weiß jetzt nicht was der Sensor jetzt mißt.
Meiner Ansicht sind diese und ähnliche Gassensoren nicht geeignet zur Messung von CO2 in Luft.
Im medizinischen Bereich wird CO2 mittels Fotometer im Infrarotbereich gemessen.
Um die CO2 Konzentration in Luft zu messen kann ich aber keinen Vorschlagen.

Grüße Uwe

Also erstmal zum ersten Post:
Es ist kein Pull up/down Widerstand nötig und das nur eine Tendenz der CO2-Konzentration zu erkennen ist, ist auch i.O..

Zum zweiten Post:
Das klingt logisch, aber meine Sensoren reagieren ja auf CO2 und das auch relativ empfindlich.

Ich vermute das der Gas-Sensor ganz einfach das falsche Gas misst. Ich fülle reines CO2 in die Kammer und "Messwert" fällt, da der höhere Anteil an CO2 zu einem geringeren Anteil der anderen Luftbestandteile führt.

Ist es nicht auch logisch das der Sensor irgendeine Information zugewiesen bekommen muss, um zu wissen welchen Gaswert er als Information zurückgibt? Oder habe ich da einen Verständnisfehler?