CO2 Gassensor Testen

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

Ich habe festgestellt, dass es nicht immer gut ist, wenn ich die Zimmertüre offen habe. Gerade vor einer Std. hatte ich eine Beobachtung. Die Zimmertüre war einen Spalt offen. Der CO2 Sensor kam mit seinem Wert über 900ppm. Also machte das Gerät das Fenster auf. Da habe ich nach etwa 20 Min. festgestellt, dass das Fenster immer noch offen ist, weil der ppm Wert nicht besser wurde, sondern schlechter (1100 ppm). Ausserdem wurde die Temperatur nicht niedriger. Draussen hatte es -0,5 Grad. Also MUSS es im Raum unter dem Fenster kälter werden. Tat es aber nicht. Ich habe daher angenommen, dass die Luft im Haus von unten durch irgend ein Fenster einströmte, und bei mir beim Fenster die Luft nicht rein, sondern raus strömte. Also Zimmertüre zu, und innerhalb von 10 Min. machte es wieder das, was es machen sollte. Die Luft wurde wieder sehr gut, unter 420ppm, die Temperatur ging runter auf 22,4 Grad. Das Fenster machte zu, weil der ppm Wert unter 420 war. Alles gut. Also wenn die Lüftung arbeitet, ist es nicht unbedingt gut, wenn die Zimmertüre offen ist, weil dann die Luftströmung in einer ungewünschten Richtung ziehen kann.

Vielleicht sollte ich einen Art Plausiblitäts-Test in die Software einbauen. Wenn das Fenster geöffnet ist, draussen sehr niedrige Themperaturen herrschen, aber die Themperatur innen nach 10 Min. nicht absinkt, Fenster wieder schließen und eine Std. warten. Weil ich nicht das ganze Haus lüften will, sondern meinen Raum. :roll: :idea: Eine Alternative wäre natürlich, die Zimmertüre automatisch schließen und weiter Lüften. :roll: Aber das ist mir vom Aufwand her zu groß. Auch noch eine automatische Türschießung einzubauen. Aber das wäre natürlich konsequent zu Ende gedacht.

Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

Ich habe jetzt mal ein Display mit Heißkleber fixiert, dann diese Stehbolzen mit Sekundekleber so angeklebt, dass sie auf die Löcher zum Anschrauben passen. Dann nochmal Sekundenkleber, rund um die Stehbolzen und das zugehörige Grunlat drauf gestreut. Das härtet sofort aus. Aber trotzdem muss man alles noch ein paar Std. ohne Belastung aushärten lassen. Ob diese Stehbolzen dann fest sind, wird sich zeigen :(o):

Wenn das nicht funktioniert, dann bleibe ich beim Heißkleber zum befestigen.
Im Bildvordergrund rechts bin ich mit dem Streu-Granulat ein bischen weit rausgekommen. Aber ich denke das lässt sich wegschleifen.
.
Alufront mit Displayausschnitt.jpg
Alufront mit Displayausschnitt.jpg (458.26 KiB) 270 mal betrachtet
Heute habe ich das Display eingebaut. Ich ziehe jetzt die Muttern nicht an bis das Wasser kommt, aber das passt schon.
.
Alufront mit Displayausschnitt_mit Display.jpg
Alufront mit Displayausschnitt_mit Display.jpg (471.28 KiB) 263 mal betrachtet

Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

Ich habe eine neue Beta Version von 12.12.2021
ein kleiner Fehler in der "Motoranforderung Überwachung" beseitigt. Der Warnton für "Handsteuerung steht der Automatik engegen", ging nach dem wieder umschalten auf Automatik nicht mehr aus.

Code: Alles auswählen

// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
   CO2_Sensor_Lueftungssteuerung_Beta2_12.12.2021
   bis 400   frische Außenluft
   bis 800   hohe Raumluftqualität
   bis 1000  akzeptabel „Pettenkoferzahl“
   1000–2000 Hygienisch auffällig
   über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2;         // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3;         // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
//------CO2 Sensor-----
const byte DataPin = 6; // Pin für CO2 Sensor

//-----Motortreiber----
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;

//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;

//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;

//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;

//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
int lueftungszaehler = 0;

//-----Lautsprecher---
const byte lautsprecher = 8;
byte LS_merker = 0;

//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
//--------------------------------------------------------------------------------------------
void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(DataPin, INPUT);
  Serial.begin(9600);
  // Luftfeuchte und Temperatur Sensoren
  dht1.begin(); // Sensor1 starten
  dht2.begin(); // Sensor2 starten
  //-----------Aus-/Eingänge einrichten-------------------------------------
  pinMode(RPWM, OUTPUT);              // PWM Motorsteuerung auf
  pinMode(LPWM, OUTPUT);              // PWM Motorsteuerung zu
  pinMode(offen, INPUT_PULLUP);       // Schalter Fenster auf
  pinMode(zu, INPUT_PULLUP);          // Schalter Fenster zu
  pinMode(Taster, INPUT_PULLUP);      // Taster Display ein/aus
}
//--------------------------------------------------------------------------------------------
void loop()
{
  //-------------Taster lesen-----------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
    Tasterstatus = digitalRead(Taster);         // Pin von Taster abfragen
    if (Tasterstatus == LOW) {                    // Ist Taster gedrueckt?
      Tastenmerker = !Tastenmerker;   // Merken dass Taster gedrueckt wurde
      if (Tastenmerker == LOW)
      {
        lcd.noBacklight();
      }
      else
      {
        lcd.backlight();
        Sekundenablauf03 = millis();
      }
      Sekundenablauf01 = millis();                  // Die 200ms neu starten
    }
  }
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 10 Min. abgelaufen?
  {
    Tastenmerker = LOW;  // Tastenmerker auf Displaybeleuchtung aus
    lcd.noBacklight();   // Displaybeleuchtung aus
  }
  //----------------Lüftungszähler-------------------------------------------
  if (lueftung == 1)
  {

  }
  //-------------------------------------------------------------------------
  if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
    Sekundenablauf02 = millis();                     // Die 5000ms neu starten
    //-----------------------------------------------------------------------
    pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
    float pulsepercent = pwmtime / 1004.0;
    PPM = ppmrange * pulsepercent;
    lcd.setCursor (0, 3);
    lcd.print (F(" CO2 in PPM = "));
    lcd.setCursor (14, 3);
    lcd.print (F("     "));
    lcd.setCursor (14, 3);
    lcd.print (PPM);

    float h1 = dht1.readHumidity();    // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
    float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
    float h2 = dht2.readHumidity();    // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
    float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
    //--------------------------
    lcd.setCursor (18, 1);
    lcd.print (F(" "));
    lcd.setCursor (0, 1);
    lcd.print (F(" L1 "));
    lcd.print (h1);
    lcd.print (F("% T1 "));
    lcd.setCursor (14, 1);
    lcd.print (t1);
    if (t1 < 10)
    {
      lcd.setCursor (14, 1);
      lcd.print (F(" "));
      lcd.print (t1);
    }
    lcd.setCursor (19, 1);
    lcd.print (F(" "));
    //------------------------
    lcd.setCursor (18, 2);
    lcd.print (F(" "));
    lcd.setCursor (0, 2);
    lcd.print (F(" L2 "));
    lcd.print (h2);
    lcd.print (F("% T2 "));
    lcd.setCursor (14, 2);
    lcd.print (t2);
    if (t2 < 10)
    {
      lcd.setCursor (14, 2);
      lcd.print (F(" "));
      lcd.print (t2);
    }
    lcd.setCursor (19, 2);
    lcd.print (F(" "));
    //---Lüftung Einschaltbedingung-----
    if (lueftung == 0)
    {
      if ((t1 >= 23) && (PPM > 900))
      {
        lueftung = 1;
      }
    }
    //---Lüftung Ausschaltbedingung-----
    if (lueftung == 1)
    {
      if ((t1 <= 21) || (PPM < 430))
      {
        lueftung = 0;
      }
    }
    //-------------Schalter lesen-------------------------------------------
    schalter1 = digitalRead(offen);
    if (schalter1 == LOW)
    {
      schaltermerker = 1;
    }
    schalter2 = digitalRead(zu);
    if (schalter2 == LOW)
    {
      schaltermerker = 2;
      lueftungszaehler = 0;
    }
    if ((schalter1 == HIGH) && (schalter2 == HIGH))
    {
      schaltermerker = 0;
    }
    lcd.setCursor (14 , 0);
    lcd.print (schaltermerker);
    lcd.print (F("-"));
    lcd.print (lueftung);
    lcd.print (F("-"));
    lcd.print (lueftungszaehler);
    //---------------Motoranforderung überwachen--------------------------------
    /*
       Schaltermerker = 0 Automatik
       Schaltermerker = 1 Fenster auf
       Schaltermerker = 2 Fenster zu
       Lueftung = 0 Fenster zu
       Lueftung = 1 Fenster auf
    */
    if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
    {
      if ((lueftung == 0) && (schaltermerker == 0))
      {
        lueftungszaehler ++;
        if (lueftungszaehler == 100)
        {
          lueftungszaehler == 0;
        }
      }
      if (((lueftung == 1) && (schaltermerker == 2)) || ((lueftung == 0) && (schaltermerker == 1)))
      {
        tone(lautsprecher, 440, 200);   //Ton wenn Fenster nicht geöffnet werden kann
        LS_merker = 1;
      }
      else
      {
        LS_merker = 0;
      }
      Tastenmerker = HIGH;  //Tastenmerker auf Displaybeleuchtung ein
      lcd.backlight();      // Displaybeleuchtung ein
      //------------------Fenster öffnen--------------------------------------
      if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
      {
        analogWrite(LPWM, 0);
        analogWrite(RPWM, 255);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fenster auf  "));
      }
      //------------------Fenster schließen-----------------------------------
      if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
      {
        analogWrite(LPWM, 255);
        analogWrite(RPWM, 0);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fenster zu  "));
      }
      motostart = millis();
      lueftung2 = lueftung;
      schaltermerker2 = schaltermerker;
    }
    if (millis() - motolauf >= motostart)
    {
      analogWrite(LPWM, 0);
      analogWrite(RPWM, 0);
      lcd.setCursor (0, 0);
      lcd.print (F(" Fenster Stop "));
    }
    if (LS_merker == 1)
    {
      tone(lautsprecher, 440, 200);
    }
  }
}

Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

Ich habe hier mal für die CO2 abhängige Lüftungssteuerung den aktuellen Schaltplan angefertigt. Ich habe den jetzt, ein paar Monate nach der in Betriebnahme erst gemacht, weil ich erst die Bilder der Komponenten angefertigt habe. Aber das düfte so passen.

Ich habe ein paar Reglungswerte bischen angepasst und den Warnton ausgeschalten, weil ich oft mal Nachts, wenn es draussen sehr kalt ist, das Fenster mit der Handreglung geschlossen lasse. Da will ich dann nicht das gepieps haben, wenn die Automatik öffnen möchte, aber die Handsteuerung das Fenster zu lässt. Aber ich habe diese "Tone" Befehle einfach nur auskommentiert. Wenn man die beiden // weg nimmt, sind die wieder aktiv. Den Tone - Befehl gibt es an zwei stellen glaube ich. Also da die Striche // weg, und der Piep ist wieder aktiv.

Hier mal noch das aktuelle Programm:

Code: Alles auswählen

// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
   CO2_Sensor_Lueftungssteuerung_Beta2_30.01.2022
   bis 400   frische Außenluft
   bis 800   hohe Raumluftqualität
   bis 1000  akzeptabel „Pettenkoferzahl“
   1000–2000 Hygienisch auffällig
   über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2;         // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3;         // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
//------CO2 Sensor-----
const byte DataPin = 6; // Pin für CO2 Sensor

//-----Motortreiber----
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;

//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;

//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;

//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;

//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
int lueftungszaehler = 0;

//-----Lautsprecher---
const byte lautsprecher = 8;
byte LS_merker = 0;

//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
//--------------------------------------------------------------------------------------------
void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(DataPin, INPUT);
  Serial.begin(9600);
  // Luftfeuchte und Temperatur Sensoren
  dht1.begin(); // Sensor1 starten
  dht2.begin(); // Sensor2 starten
  //-----------Aus-/Eingänge einrichten-------------------------------------
  pinMode(RPWM, OUTPUT);              // PWM Motorsteuerung auf
  pinMode(LPWM, OUTPUT);              // PWM Motorsteuerung zu
  pinMode(offen, INPUT_PULLUP);       // Schalter Fenster auf
  pinMode(zu, INPUT_PULLUP);          // Schalter Fenster zu
  pinMode(Taster, INPUT_PULLUP);      // Taster Display ein/aus
}
//--------------------------------------------------------------------------------------------
void loop()
{
  //-------------Taster lesen-----------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
    Tasterstatus = digitalRead(Taster);         // Pin von Taster abfragen
    if (Tasterstatus == LOW) {                    // Ist Taster gedrueckt?
      Tastenmerker = !Tastenmerker;   // Merken dass Taster gedrueckt wurde
      if (Tastenmerker == LOW)
      {
        lcd.noBacklight();
      }
      else
      {
        lcd.backlight();
        Sekundenablauf03 = millis();
      }
      Sekundenablauf01 = millis();                  // Die 200ms neu starten
    }
  }
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 10 Min. abgelaufen?
  {
    Tastenmerker = LOW;  // Tastenmerker auf Displaybeleuchtung aus
    lcd.noBacklight();   // Displaybeleuchtung aus
  }
  //----------------Lüftungszähler-------------------------------------------
  if (lueftung == 1)
  {

  }
  //-------------------------------------------------------------------------
  if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
    Sekundenablauf02 = millis();                     // Die 5000ms neu starten
    //-----------------------------------------------------------------------
    pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
    float pulsepercent = pwmtime / 1004.0;
    PPM = ppmrange * pulsepercent;
    lcd.setCursor (0, 3);
    lcd.print (F(" CO2 in PPM = "));
    lcd.setCursor (14, 3);
    lcd.print (F("     "));
    lcd.setCursor (14, 3);
    lcd.print (PPM);

    float h1 = dht1.readHumidity();    // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
    float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
    float h2 = dht2.readHumidity();    // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
    float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
    //--------------------------
    lcd.setCursor (18, 1);
    lcd.print (F(" "));
    lcd.setCursor (0, 1);
    lcd.print (F(" L1 "));
    lcd.print (h1);
    lcd.print (F("% T1 "));
    lcd.setCursor (14, 1);
    lcd.print (t1);
    if (t1 < 10)
    {
      lcd.setCursor (14, 1);
      lcd.print (F(" "));
      lcd.print (t1);
    }
    lcd.setCursor (19, 1);
    lcd.print (F(" "));
    //------------------------
    lcd.setCursor (18, 2);
    lcd.print (F(" "));
    lcd.setCursor (0, 2);
    lcd.print (F(" L2 "));
    lcd.print (h2);
    lcd.print (F("% T2 "));
    lcd.setCursor (14, 2);
    lcd.print (t2);
    if (t2 < 10)
    {
      lcd.setCursor (14, 2);
      lcd.print (F(" "));
      lcd.print (t2);
    }
    lcd.setCursor (19, 2);
    lcd.print (F(" "));
    //---Lüftung Einschaltbedingung-----
    if (lueftung == 0)
    {
      if ((t1 >= 23) && (PPM > 900))
      {
        lueftung = 1;
      }
    }
    //---Lüftung Ausschaltbedingung-----
    if (lueftung == 1)
    {
      if ((t1 <= 21) || (PPM < 500))
      {
        lueftung = 0;
      }
    }
    //-------------Schalter lesen-------------------------------------------
    schalter1 = digitalRead(offen);
    if (schalter1 == LOW)
    {
      schaltermerker = 1;
    }
    schalter2 = digitalRead(zu);
    if (schalter2 == LOW)
    {
      schaltermerker = 2;
      lueftungszaehler = 0;
    }
    if ((schalter1 == HIGH) && (schalter2 == HIGH))
    {
      schaltermerker = 0;
    }
    lcd.setCursor (14 , 0);
    lcd.print (schaltermerker);
    lcd.print (F("-"));
    lcd.print (lueftung);
    lcd.print (F("-"));
    lcd.print (lueftungszaehler);
    //---------------Motoranforderung überwachen--------------------------------
    /*
       Schaltermerker = 0 Automatik
       Schaltermerker = 1 Fenster auf
       Schaltermerker = 2 Fenster zu
       Lueftung = 0 Fenster zu
       Lueftung = 1 Fenster auf
    */
    if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
    {
      if ((lueftung == 0) && (schaltermerker == 0))
      {
        lueftungszaehler ++;
        if (lueftungszaehler == 100)
        {
          lueftungszaehler == 0;
        }
      }
      if (((lueftung == 1) && (schaltermerker == 2)) || ((lueftung == 0) && (schaltermerker == 1)))
      {
        //tone(lautsprecher, 440, 200);   //Ton wenn Fenster nicht geöffnet werden kann
        LS_merker = 1;
      }
      else
      {
        LS_merker = 0;
      }
      Tastenmerker = HIGH;  //Tastenmerker auf Displaybeleuchtung ein
      lcd.backlight();      // Displaybeleuchtung ein
      //------------------Fenster öffnen--------------------------------------
      if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
      {
        analogWrite(LPWM, 0);
        analogWrite(RPWM, 255);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fenster auf  "));
      }
      //------------------Fenster schließen-----------------------------------
      if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
      {
        analogWrite(LPWM, 255);
        analogWrite(RPWM, 0);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fenster zu  "));
      }
      motostart = millis();
      lueftung2 = lueftung;
      schaltermerker2 = schaltermerker;
    }
    if (millis() - motolauf >= motostart)
    {
      analogWrite(LPWM, 0);
      analogWrite(RPWM, 0);
      lcd.setCursor (0, 0);
      lcd.print (F(" Fenster Stop "));
    }
    if (LS_merker == 1)
    {
      //tone(lautsprecher, 440, 200);
    }
  }
}
Franz
.
CO2_Lüftungssteuerung.JPG
CO2_Lüftungssteuerung.JPG (450.14 KiB) 232 mal betrachtet

Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

Ich habe heute mal ein bischen umprogrammiert. Bisher hatte ich noch keine Verwendung für die Aussentemperatur. Aber in den lezten Wochen war die Aussentemperatur schon fast immer über 16 Grad. Wenn ich da das Fenster mit der Handsteuerung durchgehend geöffnet hatte, wurde es trotzdem nie weniger als 24 Grad im Raum. Also meine Wohlfühl - Temperatur :) :) Da kam mir die Idee, das als zusätzliche Funktion einzubauen. Habe ich heute mal getan und teste es ab jetzt. Ich sage jetzt der Kiste, öffne das Fenster bei einer Aussentemperatur von Minimal 16 Grad, bis Max 26 Grad. Wenn die Aussentemperatur über 28 Grad geht, dann wird diese Anweisung wieder auf "0" gesetzt. Aber geschlossen wird das Fenster dann erst, wenn die übliche Lüftungsanweisung das anordnet. Also, wenn die Innentemperatur unter 22 Grad geht, oder die Luftgüte besser, also niedriger, 500 ppm ist.

Wenn alles zur Zufriedenheit läuft, setzte ich die Programmänderung hier wieder rein.

Franz :(V):

Benutzeravatar
Admin
Administrator
Beiträge: 653
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: CO2 Gassensor Testen

Beitrag von Admin »

So, ich habe heute die geänderte Software getestet und da war noch ein kräftiger Wurm drin. :oops: Aber habe ich gefunden und beseitigt. Es greift hier sehr viel ineinander, es gibt gegenseitige Abhängigkeiten, bei denen auch die Reihenfolge der Prioritäten wichtig ist. Das ist schnell mal der Wurm drin. :O:

Jetzt scheint es zu funktionieren.
Also Bisher hat die Steuerung gelüftet, wenn der PPM Wert größer 900 ppm war, und die Raumperatur größer 23 Grad. Das deshalb, weil ich es ja recht warm brauche. Also bevor der Raum nicht wieder auf wenigstens 23 Grad ist, keine Lüftung.
Wenn der PPM Wert dann werend dem Lüften unter 500ppm geht, wird das Fenster wieder geschlossen. Wenn die Raumtemperatur unter 21 Grad geht, wird das Fenster auch geschlossen. Auch wenn die unter 500 ppm noch nicht erreicht sind.
Das war die bisherige Funktion.
Neu dazugekommen ist, dass das Fenster auch immer göffnet ist, wenn die Aussentemperatur größer 16 Grad bis 26 Grad ist.
Steigt die Temperatur weiter auf über 28 Grad, wird das Fenster wieder geschoßen, dass die Temperatur im Raum nicht zu hoch wird, durch einströmende Luft von Aussen über 28 Grad.
Ausserdem, wird die Dauerlüftung beendet, wenn die Aussentemperatur unter 16 Grad ist. Da dann zu befürchten ist, dass es im Raum zu weit abkühlt, und dadurch mehr geheizt werden muss. Oberhalb 16 Grad Aussentemperatur wird die Raumtemperatur nicht nach unten verändert. Das habe ich die letzten Wochen getestet. Und nach dem Ergebnis habe ich die Dauerlüftung in der Steuerung dazu eingefügt. Im Moment bin ich zufrieden. Ich werde es jetzt ein paar Tage gut beobachten, und vielleicht noch anpassen, wenn es Grund dazu geben sollte.
Die Handsteuerung ist wie vorher unverändert geblieben.
Schalter in Mittelstellung, Lüftungsteuerung Automatisch, wie oben beschrieben.
Schalter nach ober, Fenster macht zu, und ist von der Automatik nicht zu erreichen.
Schalter nach unten, Fenster wird und bleibt geöffnet und ist auch von der Automatik nicht zu erreichen.

Hier schon mal das aktuelle Programm dazu:

Code: Alles auswählen

// Arduino CO2 Sensor - MH-Z19 Beispiel und Sketch
// https://iotspace.dev/arduino-co2-sensor-mh-z19-beispiel-und-sketch
/*
   CO2_Sensor_Lueftungssteuerung_V2.0_16.06.2022
   Neu Aussentemperatur 16 - 26 Fenster öffnen
   bis 400   frische Außenluft
   bis 800   hohe Raumluftqualität
   bis 1000  akzeptabel „Pettenkoferzahl“
   1000–2000 Hygienisch auffällig
   über 2000 Hygienisch inakzeptabel
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include "DHT.h"
const byte DHTPIN1 = 2;         // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
const byte DHTPIN2 = 3;         // Hier die Pin Nummer eintragen wo der Sensor2 angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
DHT dht2(DHTPIN2, DHTTYPE); //Sensor2 einrichten
//------CO2 Sensor-----
const byte DataPin = 6; // Pin für CO2 Sensor

//-----Motortreiber----
const byte RPWM = 9;
const byte LPWM = 10;
unsigned long motostart = 0;
unsigned long motolauf = 15000;

//-------Schalter------
const byte offen = 11;
byte schalter1 = 0;
const byte zu = 12;
byte schalter2 = 0;
byte schaltermerker = 0;
byte schaltermerker2 = 0;

//--Aussentemp. Kontrolle----
byte Mindest = 15;
byte Hoechst = 26;
byte Solloffen = 0;

//-------Taster-------
const byte Taster = 13;
byte Tasterstatus = 0;
byte Tastenmerker = 0;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster 300ms aussetzen
const unsigned long Pausezeit01 = 300;
unsigned long Sekundenablauf03 = 0; // Displayzeit 10 Min. hell
const unsigned long Pausezeit03 = 60000 * 10UL;

//----CO2 Sensor------
int ppmrange = 5000;
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;

//---Fenstersteller--
byte lueftung = 0;
byte lueftung2 = 0;
int lueftungszaehler = 0;

//-----Lautsprecher---
const byte lautsprecher = 8;
byte LS_merker = 0;

//---Programm Pause--
unsigned long Sekundenablauf02 = 5000; // Programmpause 5 Sekunden
const unsigned long Pausezeit02 = 5000;
//--------------------------------------------------------------------------------------------
void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(DataPin, INPUT);
  Serial.begin(9600);
  // Luftfeuchte und Temperatur Sensoren
  dht1.begin(); // Sensor1 starten
  dht2.begin(); // Sensor2 starten
  //-----------Aus-/Eingänge einrichten-------------------------------------
  pinMode(RPWM, OUTPUT);              // PWM Motorsteuerung auf
  pinMode(LPWM, OUTPUT);              // PWM Motorsteuerung zu
  pinMode(offen, INPUT_PULLUP);       // Schalter Fenster auf
  pinMode(zu, INPUT_PULLUP);          // Schalter Fenster zu
  pinMode(Taster, INPUT_PULLUP);      // Taster Display ein/aus
}
//--------------------------------------------------------------------------------------------
void loop()
{
  //-------------Taster lesen-----------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) { // 200msec abgelaufen?
    Tasterstatus = digitalRead(Taster);         // Pin von Taster abfragen
    if (Tasterstatus == LOW) {                    // Ist Taster gedrueckt?
      Tastenmerker = !Tastenmerker;   // Merken dass Taster gedrueckt wurde
      if (Tastenmerker == LOW)
      {
        lcd.noBacklight();
      }
      else
      {
        lcd.backlight();
        Sekundenablauf03 = millis();
      }
      Sekundenablauf01 = millis();                  // Die 200ms neu starten
    }
  }
  if (millis() - Sekundenablauf03 >= Pausezeit03)  // 10 Min. abgelaufen?
  {
    Tastenmerker = LOW;  // Tastenmerker auf Displaybeleuchtung aus
    lcd.noBacklight();   // Displaybeleuchtung aus
  }
  //----------------Lüftungszähler-------------------------------------------
  if (lueftung == 1)
  {

  }
  //-------------------------------------------------------------------------
  if (millis() - Sekundenablauf02 >= Pausezeit02) { // 5000ms abgelaufen?
    Sekundenablauf02 = millis();                     // Die 5000ms neu starten
    //-----------------------------------------------------------------------
    pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
    float pulsepercent = pwmtime / 1004.0;
    PPM = ppmrange * pulsepercent;
    lcd.setCursor (0, 3);
    lcd.print (F(" CO2 in PPM = "));
    lcd.setCursor (14, 3);
    lcd.print (F("     "));
    lcd.setCursor (14, 3);
    lcd.print (PPM);

    float h1 = dht1.readHumidity();    // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
    float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
    float h2 = dht2.readHumidity();    // Lesen der Luftfeuchtigkeit2 und speichern in die Variable h2
    float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C2 und speichern in die Variable t2
    //--------------------------
    lcd.setCursor (18, 1);
    lcd.print (F(" "));
    lcd.setCursor (0, 1);
    lcd.print (F(" L1 "));
    lcd.print (h1);
    lcd.print (F("% T1 "));
    lcd.setCursor (14, 1);
    lcd.print (t1);
    if (t1 < 10)
    {
      lcd.setCursor (14, 1);
      lcd.print (F(" "));
      lcd.print (t1);
    }
    lcd.setCursor (19, 1);
    lcd.print (F(" "));
    //------------------------
    lcd.setCursor (18, 2);
    lcd.print (F(" "));
    lcd.setCursor (0, 2);
    lcd.print (F(" L2 "));
    lcd.print (h2);
    lcd.print (F("% T2 "));
    lcd.setCursor (14, 2);
    lcd.print (t2);
    if (t2 < 10)
    {
      lcd.setCursor (14, 2);
      lcd.print (F(" "));
      lcd.print (t2);
    }
    lcd.setCursor (19, 2);
    lcd.print (F(" "));
    //---Lüftung Einschaltbedingung-----
    if (lueftung == 0)
    {
      if ((t1 >= 23) && (PPM > 900))
      {
        lueftung = 1;
      }
      if (Solloffen ==1)
      {
        lueftung = 1;
      }
    }
    //---Lüftung Ausschaltbedingung-----
    if (lueftung == 1)
    {
      if (Solloffen == 0)
      {
      if ((t1 <= 21) || (PPM < 500))
      {
        lueftung = 0;
      }
      }
    }
    //----Aussentemperatur Kontrolle zur Lüftung----------------------------
    //++++++++++++++++++++++++++++++++++++++NEU+++++++++++++++++++++++++++++
    if ((t2 > Mindest) && (t2 < Hoechst))
    {
      Solloffen = 1;
    }
    if ((t2 < Mindest) || (t2 > Hoechst + 2))
    {
      Solloffen = 0;
    }

    //-------------Schalter lesen-------------------------------------------
    schalter1 = digitalRead(offen);
    if (schalter1 == LOW)
    {
      schaltermerker = 1;
    }
    schalter2 = digitalRead(zu);
    if (schalter2 == LOW)
    {
      schaltermerker = 2;
      lueftungszaehler = 0;
    }
    if ((schalter1 == HIGH) && (schalter2 == HIGH))
    {
      schaltermerker = 0;
    }
    lcd.setCursor (11 , 0);
    lcd.print (F("         "));
    lcd.setCursor (11 , 0);
    lcd.print (schaltermerker);
    lcd.print (F("-"));
    lcd.print (lueftung);
    lcd.print (F("-"));
    lcd.print (lueftungszaehler);
    lcd.print (F("-"));
    lcd.print (Solloffen);
    
    //---------------Motoranforderung überwachen--------------------------------
    /*
       Schaltermerker = 0 Automatik
       Schaltermerker = 1 Fenster auf
       Schaltermerker = 2 Fenster zu
       Lueftung = 0 Fenster zu
       Lueftung = 1 Fenster auf
    */
    if ((lueftung != lueftung2) || (schaltermerker != schaltermerker2))
    {
      if ((lueftung == 0) && (schaltermerker == 0))
      {
        lueftungszaehler ++;
        if (lueftungszaehler == 100)
        {
          lueftungszaehler == 0;
        }
      }
      if (((lueftung == 1) && (schaltermerker == 2)) || ((lueftung == 0) && (schaltermerker == 1)))
      {
        //tone(lautsprecher, 440, 200);   //Ton wenn Fenster nicht geöffnet werden kann
        LS_merker = 1;
      }
      else
      {
        LS_merker = 0;
      }
      Tastenmerker = HIGH;  //Tastenmerker auf Displaybeleuchtung ein
      lcd.backlight();      // Displaybeleuchtung ein
      //------------------Fenster öffnen--------------------------------------
      if (((lueftung == 1) && (schaltermerker == 0)) || (schaltermerker == 1))
      {
        analogWrite(LPWM, 0);
        analogWrite(RPWM, 255);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fen. auf "));
      }
      //------------------Fenster schließen-----------------------------------
      if (((lueftung == 0) && (schaltermerker == 0)) || (schaltermerker == 2))
      {
        analogWrite(LPWM, 255);
        analogWrite(RPWM, 0);
        lcd.setCursor (0, 0);
        lcd.print (F(" Fen. zu  "));
      }
      motostart = millis();
      lueftung2 = lueftung;
      schaltermerker2 = schaltermerker;
    }
    if (millis() - motolauf >= motostart)
    {
      analogWrite(LPWM, 0);
      analogWrite(RPWM, 0);
      lcd.setCursor (0, 0);
      lcd.print (F(" Fen. Stop "));
    }
    if (LS_merker == 1)
    {
      //tone(lautsprecher, 440, 200);
    }
  }
}

Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast