Änderungen im Setup Programm startet neu

Danke für die Aufklärung mir ging es zunächst um

constexpr was für mich auf eine Konstante spricht.

Ich habe das Buch Arduino das umfassende Handbuch ( Claus Kühnel )

Dort sind die Datentypen auch beschrieben.

Siehe: constexpr specifier (since C++11) - cppreference.com

Guten Abend ich habe den sketch erweitert jetzt werden die Werte auf die SDkarte geschrieben.

ohne die Delay`s wurde alles in eine Zeile geschrieben.

Als nächstes werde ich einen BMP280 für den Luftdruck integrieren.

Dann das Programm so ändern das die Aufzeichnung nur alle 30min erfolgt

oder wenn der Lüfter schaltet.

Dazu habe ich bereits nach dem Zeitstempel ( Timestamp ) hier gesucht und gefunden.

/*
 https://forum.arduino.cc/t/anderungen-im-setup-programm-startet-neu/1406435/15
 code my_xy_projekt
*/
// Dieser Code benötigt zwingend die folgenden Libraries:
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>
#include <RTClib.h>
/* für den Kartenleser */
#include <SD.h>
const int chipSelect = 10;
// File für SD Karte
File dataFile;
// DS3231 RTC Modul
RTC_DS3231 rtc;
DateTime now;
uint8_t lastSecond = 255;

constexpr uint8_t RELAIPIN{ 4 };  // Anschluss des Lüfter-Relais
constexpr uint8_t DHTPIN_1{ 5 };  // Datenleitung für den DHT-Sensor 1 (innen)
constexpr uint8_t DHTPIN_2{ 6 };  // Datenleitung für den DHT-Sensor 2 (außen)

constexpr bool RELAIS_EIN{ LOW };
constexpr bool RELAIS_AUS{ !RELAIS_EIN };

#define DHTTYPE DHT11  // DHT 22 geändert DHT11

// *******  Korrekturwerte der einzelnen Sensorwerte  *******
constexpr uint8_t Korrektur_t_1{ 0 };  // Korrekturwert Innensensor Temperatur
constexpr uint8_t Korrektur_t_2{ 0 };  // Korrekturwert Außensensor Temperatur
constexpr uint8_t Korrektur_h_1{ 0 };  // Korrekturwert Innensensor Luftfeuchtigkeit
constexpr uint8_t Korrektur_h_2{ 0 };  // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************

constexpr uint8_t SCHALTmin{ 5 };   // minimaler Taupunktunterschied, bei dem das Relais schaltet
constexpr uint8_t HYSTERESE{ 1 };   // Abstand von Ein- und Ausschaltpunkt
constexpr int8_t TEMP1_min{ 10 };   // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
constexpr int8_t TEMP2_min{ -10 };  // Minimale Außentemperatur, bei der die Lüftung aktiviert wird

DHT dht1(DHTPIN_1, DHTTYPE);  //Der Innensensor wird ab jetzt mit dht1 angesprochen
DHT dht2(DHTPIN_2, DHTTYPE);  //Der Außensensor wird ab jetzt mit dht2 angesprochen

constexpr uint8_t sensors{ 2 };
struct SENS {
  DHT s;
  int16_t t;
  uint8_t h;
  int8_t kH;
  int8_t kT;
  int8_t tMin;
};

SENS sens[sensors]{
  {
    dht1,
    0,
    0,
    Korrektur_h_1,
    Korrektur_t_1,
    TEMP1_min,
  },
  {
    dht2,
    0,
    0,
    Korrektur_h_2,
    Korrektur_t_2,
    TEMP2_min,
  },
};

constexpr uint8_t row{ 20 };
constexpr uint8_t col{ 4 };
LiquidCrystal_I2C lcd(0x27, row, col);  // LCD: I2C-Addresse und Displaygröße setzen

constexpr uint32_t dataIntervall{ 10000 };  // 10 Sekunden
uint32_t lastDataTime;

void setup() {
  Serial.begin(9600);  // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
  Serial.println(F("Teste Sensoren.."));
  pinMode(RELAIPIN, OUTPUT);           // Relaispin als Output definieren
  digitalWrite(RELAIPIN, RELAIS_AUS);  // Relais ausschalten
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print(F("Teste Sensoren.."));
  byte Grad[8] = { B00111, B00101, B00111, B0000, B00000, B00000, B00000, B00000 };  // Sonderzeichen ° definieren
  lcd.createChar(0, Grad);
  byte Strich[8] = { B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100 };  // Sonderzeichen senkrechter Strich definieren
  lcd.createChar(1, Strich);
  SDInit();
  for (byte b = 0; b < sensors; b++) { sens[b].s.begin(); }

  // DS3231 initialisieren
  if (!rtc.begin()) {
    Serial.println(F("Fehler beim Initialisieren des DS3231 RTC Moduls!"));

    while (1)
      ;
  }
}

void loop() {
  if (millis() - lastDataTime > dataIntervall) {
    lastDataTime = millis();
    getSensorData();
    printDisplay();
    actor();
    SDWerte();
  }

  //now = rtc.now();

  // if (now.second() != lastSecond) {
  //   lastSecond = now.second();
  //   Serial.print(now.hour());
  //   Serial.print(':');
  //   Serial.print(now.minute());
  //   Serial.print(':');
  //   Serial.println(now.second());
  // }
}
//
//
void serialDisplay() {
  // Werteausgabe auf Serial Monitor
  for (byte b = 0; b < sensors; b++) {
    Serial.print(F("Sensor-"));
    Serial.print(b + 1);
    Serial.print(F("1: Luftfeuchtigkeit: "));
    Serial.print(sens[b].h);
    Serial.print(F("%  Temperatur: "));
    Serial.print(sens[b].t);
    Serial.print(F("°C  "));
    Serial.print(F("  Taupunkt: "));
    Serial.print(taupunkt(sens[b].t, sens[b].h));
    Serial.println(F("°C  "));
  }

  for (byte b = 0; b < 60; b++) { Serial.print('-'); }

  //Serial.println("\r\n\r\n");
}
//
void printDisplay() {
  static uint32_t lastDisplayTime = 0;
  static uint8_t displayType = 0;

  if (millis() - lastDisplayTime > 5000) {
    serialDisplay();
    lcd.clear();
    displayType++;

    if (errcheck() == true) { displayType = 2; }

    switch (displayType) {
      case 0:
        displayOne();
        break;

      case 1:
        displayTwo();
        break;

      case 2:
        displayThree();
        break;

      default:
        displayType = 0;
        break;
    }
  }
}
//
void displayOne() {
  for (byte b = 0; b < sensors; b++) {
    lcd.setCursor(0, b);
    lcd.print('S');
    lcd.print(b + 1);
    lcd.print(": ");
    lcd.print(sens[b].t);
    lcd.write((uint8_t)0);  // Sonderzeichen °C
    lcd.print('C');
    lcd.write((uint8_t)1);  // Sonderzeichen |
    lcd.print(sens[b].h);
    lcd.print(F(" %"));
    lcd.setCursor(0, b + 2);
    lcd.print(F("Taupunkt "));
    lcd.print(b + 1);
    lcd.print(": ");
    lcd.print(taupunkt(sens[b].t, sens[b].h));
    lcd.write((uint8_t)0);  // Sonderzeichen °C
    lcd.print('C');
  }
}
//
void displayTwo() {
  lcd.setCursor(0, 0);
  lcd.print(F("Lueftung "));

  if (digitalRead(RELAIPIN) == RELAIS_EIN) {
    lcd.print("AN");
  } else {
    lcd.print(F("AUS"));
  }

  lcd.setCursor(0, 1);
  lcd.print(F("Delta TP: "));
  lcd.print(taupunkt(sens[0].t, sens[0].h) - taupunkt(sens[1].t, sens[1].h));
  lcd.write((uint8_t)0);  // Sonderzeichen °C
  lcd.write('C');
}
//
void displayThree() {
  for (byte b = 0; b < sensors; b++) {
    if (isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t < -40 || sens[b].t > 80) {
      Serial.print(F("Fehler beim Auslesen vom "));
      Serial.print(b + 1);
      Serial.println(F(". Sensor!"));
      lcd.setCursor(0, b + 1);
      lcd.print(F("Fehler Sensor "));
      lcd.print(b + 1);
    } else {
      lcd.setCursor(0, b + 1);
      lcd.print(F("Sensor "));
      lcd.print(b + 1);
      lcd.print(F(" in Ordnung"));
    }
  }
}
//
float taupunkt(float t, float r) {
  float a = 7.5, b = 237.3;

  if (t < 0) {
    a = 7.6;
    b = 240.7;
  }

  // Sättigungsdampfdruck in hPa
  float sdd = 6.1078 * pow(10, (a * t) / (b + t));
  // Dampfdruck in hPa
  float dd = sdd * (r / 100);
  // v-Parameter
  float v = log10(dd / 6.1078);
  // Taupunkttemperatur (°C)
  float tt = (b * v) / (a - v);
  return { tt };
}
//
//
void actor() {
  bool val = false;
  float DeltaTP = taupunkt(sens[0].t, sens[0].h) - taupunkt(sens[1].t, sens[1].h);

  if (DeltaTP > (SCHALTmin + HYSTERESE)) { val = true; }

  if (DeltaTP < (SCHALTmin)) { val = false; }

  for (byte b = 0; b < sensors; b++) {
    if ((sens[b].t < sens[b].tMin) || isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t > 80) { val = false; }
  }

  if (val == true) { digitalWrite(RELAIPIN, RELAIS_EIN); }  // Relais einschalten
  else {
    digitalWrite(RELAIPIN, RELAIS_AUS);
  }
}

bool errcheck() {
  bool ret = false;

  for (byte b = 0; b < sensors; b++) {
    if (isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t < -40 || sens[b].t > 80) { ret = true; }
  }

  return ret;
}
//
//
void SDInit() {
  // SD-Karte initialisieren
  Serial.print(F("SD Karte "));

  if (!SD.begin(chipSelect)) {
    Serial.println(F("konnte nicht initialisiert werden."));
    return;
  }

  Serial.println(F("bereit."));
  // Neue Datei erstellen oder bestehende öffnen
  dataFile = SD.open("daten.csv", FILE_WRITE);

  if (dataFile) {
    dataFile.println(F("Datei erstellen im Setupteil des Sketches"));
    dataFile.println(millis());           // Zeile kann entfallen war zum Test da Programm immer neu startete
    dataFile.print(F("Datum,Uhrzeit,"));  // Überschrift der Tabelle
    dataFile.print(F("Temp innen (C),Luftfeuchtigkeit (%),Taupunkt (C),"));
    dataFile.print(F("Luftdruck (hPa),"));
    dataFile.print(F("Temp außen (C),Luftfeuchtigkeit (%),Taupunkt (C),"));
    dataFile.println(F("Lüfter ein,Lüfter aus,Lüfterzeit"));
    Serial.println(F("Erstellen der Datei"));
  } else {
    Serial.println(F("Fehler beim Erstellen der Datei."));
  }

  dataFile.close();
}
//
void SDWerte() {
  // SD-Karte initialisieren
  Serial.print(F("SD Karte Werte schreiben"));

  if (!SD.begin(chipSelect)) {
    Serial.println(F("konnte nicht initialisiert werden."));
    return;
  }

  Serial.println(F("bereit."));
  // Neue Datei erstellen oder bestehende öffnen
  dataFile = SD.open("daten.csv", FILE_WRITE);

  if (dataFile) {
    //dataFile.println(F("Datei erstellen im Setupteil des Sketches"));
    //dataFile.println(millis());           // Zeile kann entfallen war zum Test da Programm immer neu startete
    dataFile.print(F(",  , "));  // Platzhalter
    delay(5);
    dataFile.print(sens[0].t);  // Temp innen (C),(%),Taupunkt (C),"));
    delay(5);
    dataFile.print(F(","));
    delay(5);
    dataFile.print(sens[0].h);  // Luftfeuchtigkeit
    delay(5);
    dataFile.print(F(",  ,  , ")); // Platzhalter
    delay(5);
    dataFile.print(sens[1].t);  // Temp außen  (C),(%),Taupunkt (C),"));
    delay(5);
    dataFile.print(F(","));
    delay(5);
    dataFile.println(sens[1].h);  // Luftfeuchtigkeit

    Serial.println(F("Erstellen der Datei"));
  } else {
    Serial.println(F("Fehler beim Erstellen der Datei."));
  }

  dataFile.close();
}

//
void getSensorData() {
  for (byte b = 0; b < sensors; b++) {
    sens[b].h = sens[b].s.readHumidity() + sens[b].kH;
    sens[b].t = sens[b].s.readTemperature() + sens[b].kT;
  }
}

Probier mal.
Ich habs kommentiert.

/*
  https://forum.arduino.cc/t/anderungen-im-setup-programm-startet-neu/1406435/15
  code my_xy_projekt
*/
// Dieser Code benötigt zwingend die folgenden Libraries:
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h>
#include <RTClib.h>
/* für den Kartenleser */
#include <SD.h>
const int chipSelect = 10;
// File für SD Karte
File dataFile;
// DS3231 RTC Modul
RTC_DS3231 rtc;
DateTime now;
uint8_t lastSecond = 255;

constexpr uint8_t RELAIPIN{ 4 };  // Anschluss des Lüfter-Relais
constexpr uint8_t DHTPIN_1{ 5 };  // Datenleitung für den DHT-Sensor 1 (innen)
constexpr uint8_t DHTPIN_2{ 6 };  // Datenleitung für den DHT-Sensor 2 (außen)

constexpr bool RELAIS_EIN{ LOW };
constexpr bool RELAIS_AUS{ !RELAIS_EIN };
bool lastRelaisState;                         // Merker für Schaltzustand Relais
constexpr uint32_t sdWriteIntervall {30000};  // schreibintervall SD-Karte
uint32_t sdLastWriteTime;                     // letzte Zeit wann geschrieben wurde

#define DHTTYPE DHT11  // DHT 22 geändert DHT11

// *******  Korrekturwerte der einzelnen Sensorwerte  *******
constexpr uint8_t Korrektur_t_1{ 0 };  // Korrekturwert Innensensor Temperatur
constexpr uint8_t Korrektur_t_2{ 0 };  // Korrekturwert Außensensor Temperatur
constexpr uint8_t Korrektur_h_1{ 0 };  // Korrekturwert Innensensor Luftfeuchtigkeit
constexpr uint8_t Korrektur_h_2{ 0 };  // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************

constexpr uint8_t SCHALTmin{ 5 };   // minimaler Taupunktunterschied, bei dem das Relais schaltet
constexpr uint8_t HYSTERESE{ 1 };   // Abstand von Ein- und Ausschaltpunkt
constexpr int8_t TEMP1_min{ 10 };   // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
constexpr int8_t TEMP2_min{ -10 };  // Minimale Außentemperatur, bei der die Lüftung aktiviert wird

DHT dht1(DHTPIN_1, DHTTYPE);  //Der Innensensor wird ab jetzt mit dht1 angesprochen
DHT dht2(DHTPIN_2, DHTTYPE);  //Der Außensensor wird ab jetzt mit dht2 angesprochen

constexpr uint8_t sensors{ 2 };
struct SENS
{
  DHT s;
  int16_t t;
  uint8_t h;
  int8_t kH;
  int8_t kT;
  int8_t tMin;
};

SENS sens[sensors]
{
  {
    dht1,
    0,
    0,
    Korrektur_h_1,
    Korrektur_t_1,
    TEMP1_min,
  },
  {
    dht2,
    0,
    0,
    Korrektur_h_2,
    Korrektur_t_2,
    TEMP2_min,
  },
};

constexpr uint8_t row{ 20 };
constexpr uint8_t col{ 4 };
LiquidCrystal_I2C lcd(0x27, row, col);  // LCD: I2C-Addresse und Displaygröße setzen

constexpr uint32_t dataIntervall{ 10000 };  // 10 Sekunden
uint32_t lastDataTime;

void setup()
{
  Serial.begin(9600);  // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
  Serial.println(F("Teste Sensoren.."));
  pinMode(RELAIPIN, OUTPUT);           // Relaispin als Output definieren
  digitalWrite(RELAIPIN, RELAIS_AUS);  // Relais ausschalten
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print(F("Teste Sensoren.."));
  byte Grad[8] = { B00111, B00101, B00111, B0000, B00000, B00000, B00000, B00000 };  // Sonderzeichen ° definieren
  lcd.createChar(0, Grad);
  byte Strich[8] = { B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100 };  // Sonderzeichen senkrechter Strich definieren
  lcd.createChar(1, Strich);
  SDInit();

  for (byte b = 0; b < sensors; b++)
  {
    sens[b].s.begin();
  }

  // DS3231 initialisieren
  if (!rtc.begin())
  {
    Serial.println(F("Fehler beim Initialisieren des DS3231 RTC Moduls!"));

    while (1)
      ;
  }
}

void loop()
{
  if (millis() - lastDataTime > dataIntervall)
  {
    lastDataTime = millis();
    getSensorData();
    printDisplay();
    actor();

    if (millis() - sdLastWriteTime > sdWriteIntervall)
    { SDWerte(); }
  }

  //now = rtc.now();
  // if (now.second() != lastSecond) {
  // lastSecond = now.second();
  // Serial.print(now.hour());
  // Serial.print(':');
  // Serial.print(now.minute());
  // Serial.print(':');
  // Serial.println(now.second());
  // }
}
//
//
void serialDisplay()
{
  // Werteausgabe auf Serial Monitor
  for (byte b = 0; b < sensors; b++)
  {
    Serial.print(F("Sensor-"));
    Serial.print(b + 1);
    Serial.print(F("1: Luftfeuchtigkeit: "));
    Serial.print(sens[b].h);
    Serial.print(F("%  Temperatur: "));
    Serial.print(sens[b].t);
    Serial.print(F("°C  "));
    Serial.print(F("  Taupunkt: "));
    Serial.print(taupunkt(sens[b].t, sens[b].h));
    Serial.println(F("°C  "));
  }

  for (byte b = 0; b < 60; b++)
  {
    Serial.print('-');
  }

  //Serial.println("\r\n\r\n");
}
//
void printDisplay()
{
  static uint32_t lastDisplayTime = 0;
  static uint8_t displayType = 0;

  if (millis() - lastDisplayTime > 5000)
  {
    serialDisplay();
    lcd.clear();
    displayType++;

    if (errcheck() == true)
    {
      displayType = 2;
    }

    switch (displayType)
    {
      case 0:
        displayOne();
        break;

      case 1:
        displayTwo();
        break;

      case 2:
        displayThree();
        break;

      default:
        displayType = 0;
        break;
    }
  }
}
//
void displayOne()
{
  for (byte b = 0; b < sensors; b++)
  {
    lcd.setCursor(0, b);
    lcd.print('S');
    lcd.print(b + 1);
    lcd.print(": ");
    lcd.print(sens[b].t);
    lcd.write((uint8_t)0);  // Sonderzeichen °C
    lcd.print('C');
    lcd.write((uint8_t)1);  // Sonderzeichen |
    lcd.print(sens[b].h);
    lcd.print(F(" %"));
    lcd.setCursor(0, b + 2);
    lcd.print(F("Taupunkt "));
    lcd.print(b + 1);
    lcd.print(": ");
    lcd.print(taupunkt(sens[b].t, sens[b].h));
    lcd.write((uint8_t)0);  // Sonderzeichen °C
    lcd.print('C');
  }
}
//
void displayTwo()
{
  lcd.setCursor(0, 0);
  lcd.print(F("Lueftung "));

  if (digitalRead(RELAIPIN) == RELAIS_EIN)
  {
    lcd.print("AN");
  }
  else
  {
    lcd.print(F("AUS"));
  }

  lcd.setCursor(0, 1);
  lcd.print(F("Delta TP: "));
  lcd.print(taupunkt(sens[0].t, sens[0].h) - taupunkt(sens[1].t, sens[1].h));
  lcd.write((uint8_t)0);  // Sonderzeichen °C
  lcd.write('C');
}
//
void displayThree()
{
  for (byte b = 0; b < sensors; b++)
  {
    if (isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t < -40 || sens[b].t > 80)
    {
      Serial.print(F("Fehler beim Auslesen vom "));
      Serial.print(b + 1);
      Serial.println(F(". Sensor!"));
      lcd.setCursor(0, b + 1);
      lcd.print(F("Fehler Sensor "));
      lcd.print(b + 1);
    }
    else
    {
      lcd.setCursor(0, b + 1);
      lcd.print(F("Sensor "));
      lcd.print(b + 1);
      lcd.print(F(" in Ordnung"));
    }
  }
}
//
float taupunkt(float t, float r)
{
  float a = 7.5, b = 237.3;

  if (t < 0)
  {
    a = 7.6;
    b = 240.7;
  }

  // Sättigungsdampfdruck in hPa
  float sdd = 6.1078 * pow(10, (a * t) / (b + t));
  // Dampfdruck in hPa
  float dd = sdd * (r / 100);
  // v-Parameter
  float v = log10(dd / 6.1078);
  // Taupunkttemperatur (°C)
  float tt = (b * v) / (a - v);
  return { tt };
}
//
//
void actor()
{
  bool val = false;
  float DeltaTP = taupunkt(sens[0].t, sens[0].h) - taupunkt(sens[1].t, sens[1].h);

  if (DeltaTP > (SCHALTmin + HYSTERESE))
  {
    val = true;
  }

  if (DeltaTP < (SCHALTmin))
  {
    val = false;
  }

  for (byte b = 0; b < sensors; b++)
  {
    if ((sens[b].t < sens[b].tMin) || isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t > 80)
    {
      val = false;
    }
  }

  if (val == true)
  {
    digitalWrite(RELAIPIN, RELAIS_EIN);  // Relais einschalten
  }
  else
  {
    digitalWrite(RELAIPIN, RELAIS_AUS);
  }

  if (digitalRead(RELAIPIN) != lastRelaisState)  // relaisstatus geändert
  {
    lastRelaisState = digitalRead(RELAIPIN);     // status merken
    SDWerte();                                   // Daten schreiben
  }
}

bool errcheck()
{
  bool ret = false;

  for (byte b = 0; b < sensors; b++)
  {
    if (isnan(sens[b].h) || isnan(sens[b].t) || sens[b].h > 100 || sens[b].h < 1 || sens[b].t < -40 || sens[b].t > 80)
    {
      ret = true;
    }
  }

  return ret;
}
//
//
void SDInit()
{
  // SD-Karte initialisieren
  Serial.print(F("SD Karte "));

  if (!SD.begin(chipSelect))
  {
    Serial.println(F("konnte nicht initialisiert werden."));
    return;
  }

  Serial.println(F("bereit."));
  // Neue Datei erstellen oder bestehende öffnen
  dataFile = SD.open("daten.csv", FILE_WRITE);

  if (dataFile)
  {
    dataFile.println(F("Datei erstellen im Setupteil des Sketches"));
    dataFile.println(millis());           // Zeile kann entfallen war zum Test da Programm immer neu startete
    dataFile.print(F("Datum,Uhrzeit,"));  // Überschrift der Tabelle
    dataFile.print(F("Temp innen (C),Luftfeuchtigkeit (%),Taupunkt (C),"));
    dataFile.print(F("Luftdruck (hPa),"));
    dataFile.print(F("Temp außen (C),Luftfeuchtigkeit (%),Taupunkt (C),"));
    dataFile.println(F("Lüfter ein,Lüfter aus,Lüfterzeit"));
    Serial.println(F("Erstellen der Datei"));
  }
  else
  {
    Serial.println(F("Fehler beim Erstellen der Datei."));
  }

  dataFile.close();
}
//
void SDWerte()
{
  sdLastWriteTime = millis();
  // SD-Karte initialisieren
  Serial.print(F("SD Karte Werte schreiben"));
  // Neue Datei erstellen oder bestehende öffnen
  dataFile = SD.open("daten.csv", FILE_WRITE);

  if (dataFile)
  {
    //dataFile.println(F("Datei erstellen im Setupteil des Sketches"));
    //dataFile.println(millis());           // Zeile kann entfallen war zum Test da Programm immer neu startete
    dataFile.print(F(",  , "));  // Platzhalter
    delay(5);
    dataFile.print(sens[0].t);  // Temp innen (C),(%),Taupunkt (C),"));
    delay(5);
    dataFile.print(F(","));
    delay(5);
    dataFile.print(sens[0].h);  // Luftfeuchtigkeit
    delay(5);
    dataFile.print(F(",  ,  , ")); // Platzhalter
    delay(5);
    dataFile.print(sens[1].t);  // Temp außen  (C),(%),Taupunkt (C),"));
    delay(5);
    dataFile.print(F(","));
    delay(5);
    dataFile.println(sens[1].h);  // Luftfeuchtigkeit
    Serial.println(F("Erstellen der Datei"));
  }
  else
  {
    Serial.println(F("Fehler beim Erstellen der Datei."));
  }

  dataFile.close();
}

//
void getSensorData()
{
  for (byte b = 0; b < sensors; b++)
  {
    sens[b].h = sens[b].s.readHumidity() + sens[b].kH;
    sens[b].t = sens[b].s.readTemperature() + sens[b].kT;
  }
}

Ich habe den BMP280 zugefügt und Led`s jetzt ist ein DHT verstorben,wenn ich Ersatz bekomme machte ich weiter.Dann möchte ich die LCD Anzeige noch anpassen oder entfernen Fehler dann über LED kombinationen ausgeben gestalten.Jetzt kompiliert mit 89% Programspeicher und 65% dynamischer Speicher.

Gruß

Walter