Hilfe bei meiner Lüftersteuerung

Hallo ich bin neu hier im Forum und auch "Blutiger Anfänger", sowie ein Copy and Paster.

Ich hoffe trotzdem auf eure Hilfe.

Ich habe mir eine Lüftersteuerung mit einem Arduino Uno, 2xDht22, Relais für 2 Lüfter, Oled Display und ESP8266-01(um alles online zu ändern und Sensorwerte auszulesen) zusammengebaut.
In meinem Seketch, welcher bis jetzt auch läuft, gibt es die Möglichkeit zwischen Automatisch und
Manuell umzuschalten.
Ich möchte die Sensorwerte nicht alle 6Sek. auslesen wie es jetzt mit Delay ist, sondern nur alle 15Min.
Bei Delay ist dann mein Schalter blockiert, weil der Sketch ja angehalten wird.
Ich weiss es gibt die millis, wo man auch noch weitere Funktionen ausführen kann, nur weiss ich nicht wie ich diese einbinden soll, so das ich jederzeit auf Manuell umschalten kann.
Desweiteren sollen die Lüfter alle 60 Min. für 5 Min. loslaufen, um Pauschall Frischluft zu fördern.
Im vorraus sage ich schon mal Danke.
Gruss Andi

// ******Lüftersteuerung*********************************************************

#include <U8g2lib.h>       // Oled
#include <Wire.h>          // Oled
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#include <dht.h>           // library für DHT22

#define PinS1 2            // Schalter an Pin 2 (Automatik)
#define PinS2 5            // Schalter an Pin 5 (Man. ein)
#define PinFanIN 6         // Lüfter Zuluft an Pin 6
#define PinFanOUT 7        // Lüfter Abluft an Pin 7
#define DHT1_PIN 3         // Zur Messung DHT-Sensor 1 verwendeter Pin 3 (Innen)
#define DHT2_PIN 4         // Zur Messung DHT-Sensor 2 verwendeter Pin 4 (Aussen)
#define Hmax 70            // max. Luftfeuchte Aussen
#define Tmin 15            // min. Temperatur Innen
#define dT 2               // Standard 5, Temp. Delta für Taupunktberechnung
#define OS1 0.0            // Offset Temp Sensor 1   (Bitte alle Offsets mit allen Sensoren abgleichen!)
#define OS2 0.0            // Offset Temp Sensor 2
#define OSH1 0.0           // Offset Feuchte Sensor 1
#define OSH2 0.0           // Offset Feuchte Sensor 2

dht DHT2;                  // Initialisieren der DHTs
dht DHT1;                  // Initialisieren der DHTs

boolean S1;                // Schalter S1 (Automatik)
boolean S2;                // Schalter S2 (Man. ein)

boolean FAN_IN = true;     // Zuluft Lüfter ein

float dht1_h;              // Innen Feuchte
float dht1_t;              // Innen Temp.
float dht2_h;              // Aussen Feuchte
float dht2_t;              // Aussen Temp.
float dp;                  // Berechneter Taupunkt Aussen

// ****** SETUP ****************************************************************
void setup()
{
  pinMode(PinS1, INPUT);          // Schalter I Automatik
  digitalWrite(PinS1, HIGH);      // Pullupwiderstand aktivieren (gegen Masse schalten)
  pinMode(PinS2, INPUT);          // Schalter II Man. ein.
  digitalWrite(PinS2, HIGH);      // Pullupwiderstand aktivieren (gegen Masse schalten)
  pinMode(PinFanIN, OUTPUT);      // Lüfter Zuluft
  digitalWrite(PinFanIN, HIGH);   // Ausschalten
  pinMode(PinFanOUT, OUTPUT);     // Lüfter Abluft
  digitalWrite(PinFanOUT, HIGH);  // Ausschalten
  FAN_IN = false;
  pinMode(LED_BUILTIN, OUTPUT);   // Kontroll LED für Loop
  u8g2.begin();                   // Oled
  Serial.begin(9600);
  Serial.flush();
}
void draw() {
  u8g2.setFont(u8g2_font_helvR10_tf);
  u8g2.setCursor(0, 16);
  u8g2.print("T-Aussen  "); u8g2.print(dht2_t); u8g2.print(" *C");
  u8g2.setCursor(0, 32);
  u8g2.print("F-Aussen  "); u8g2.print(dht2_h); u8g2.print("  %");
  u8g2.setCursor(0, 48);
  u8g2.print("T-Innen     "); u8g2.print(dht1_t); u8g2.print(" *C");
  u8g2.setCursor(0, 64);
  u8g2.print("F-Innen     "); u8g2.print(dht1_h); u8g2.print("  %");
 }
// ****** Hauptprogramm Loop START *********************************************
void loop()
{
  readSensor();
  // ****** Betriebswahl *******************************************************
  S1 = digitalRead(PinS1);  // Schalter 1 = Automatik EIN
  S2 = digitalRead(PinS2);  // Schalter 2 = HAND EIN
  if (S1 == LOW) Automatik();
  if (S2 == LOW) Handbetrieb();
  if (S1 == HIGH && S2 == HIGH) AUS();

  digitalWrite(LED_BUILTIN,digitalRead(LED_BUILTIN)^1);   // Kontroll LED
  // ****** Oled ***************************************************************
  u8g2.firstPage();
  do {
  draw();
  } while ( u8g2.nextPage() );
  Serial.print("Temperatur aussen:..");
  Serial.print(dht2_t);
  Serial.print(",..Feuchtigkeit aussen:..");
  Serial.print(dht2_h);Serial.print("...Taupunkt aussen:..");
  Serial.println(dp);
  Serial.print("Temperatur innen:...");
  Serial.print(dht1_t);
  Serial.print(",...Feuchtigkeit innen:..");
  Serial.println(dht1_h);
  Serial.println(" ");
}
// ****** Funktion Temperatur der Sensoren auslesen ****************************
void readSensor()
{
  delay(6000);
  DHT1.read22(DHT1_PIN);
  dht1_h = DHT1.humidity, 1;         // Luftfeuchte auslesen
  dht1_h = dht1_h + OSH1;            // Offset hinzu
  dht1_t = DHT1.temperature, 1;      // Temperatur auslesen
  dht1_t = dht1_t + OS1;             // Offset hinzu
  
  delay(6000);
  DHT2.read22(DHT2_PIN);
  dht2_h = DHT2.humidity, 1;         // Luftfeuchte auslesen
  dht2_h = dht2_h + OSH2;            // Offset hinzu
  dht2_t = DHT2.temperature, 1;      // Temperatur auslesen
  dht2_t = dht2_t + OS2;             // Offset hinzu
}
//****** Automatik Betrieb *****************************************************
void Automatik()
{
  Regelung();  // Automatikregelung
  if (FAN_IN)
  {
    digitalWrite(PinFanIN, LOW);  // Einschalten
    digitalWrite(PinFanOUT, LOW); // Einschalten
  } else {
    digitalWrite(PinFanOUT, HIGH); // Ausschalten
    digitalWrite(PinFanIN, HIGH);  // Ausschalten
  }
}
//****** Man. ein Betrieb ******************************************************
void Handbetrieb()
{
  if (S2 == LOW)
  {
    digitalWrite(PinFanOUT, LOW); // Einschalten
    digitalWrite(PinFanIN, LOW);  // Einschalten
    FAN_IN = true;
  }
}
//****** Ausschalten ***********************************************************
void AUS()
{
  digitalWrite(PinFanOUT, HIGH); // Ausschalten
  digitalWrite(PinFanIN, HIGH);  // Ausschalten
  FAN_IN = false;
}
//******Lüftersteuerung ********************************************************
void Regelung() {
  // Formeln von hier https://www.wetterochs.de/wetter/feuchte.html
  float a, b;
  if (dht2_t >= 0) {
    a = 7.5;
    b = 237.3;
  } else {            // kälter als 0°C
    a = 7.6;
    b = 240.7;
  }
// Sättigungsdampfdruck in hPa
  float sgp = 6.1078 * pow(10, (a * dht2_t) / (b + dht2_t));
// Dampfdruck in hPa
  float gp = (dht2_h / 100) * sgp;
  float v = log10(gp / 6.1078);
// Taupunkttemperatur in °C
  dp = (b * v) / (a - v);

  if ((dp - dT) < dht1_t) {
    FAN_IN = true;
  } else {                                       // Feuchte außen zu hoch im Vergleich zu innen
    FAN_IN = false;
  }
  if (dht2_h > Hmax)  FAN_IN = false;            // Feuchte außen zu hoch, absolut
  if (dht2_t < Tmin)  FAN_IN = false;            // Temperatur außen zu niedrig
}

Hi

Schau Dir die Links an, Die combie hier zum Thema zusammen getragen hat.
Dort ist auch die Nachtwächter-Erklärung - genau Das, was Du suchst.

MfG