So, ich habe heute die geänderte Software getestet und da war noch ein kräftiger Wurm drin.

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.
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 kaum 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);
}
}
}