Pillzucht- Steuerung | Problem mit Relais Schaltung | art installation | GELÖST!

Liebe community,

Ich habe ein Problem mit meiner Steuerung für ein Pilzzucht- Projekt.
Die Steuerung soll in einer Box die Temperatur messen, in einer weiteren die Temperatur messen und in einer dritten die Temperatur und Luftfeuchtigkeit messen.
Ausgehend von den Messwerten soll ein Akteur durch ein Relais an- oder ausgeschaltet werden.
Das läuft immer nach diesem Prinzip ab:
z.B.: Heizen bis max. Temperatur erreicht ist, dann Pause bis min. Temperatur erreicht ist, dann heizen bis max. Temperatur erreicht ist usw.
Ich habe die Schaltung gerade mit Box Nr. 2 ausprobiert, dieser Teil des Sketches ist dafür zuständig:

// Temperaturregelung von Wachstum 1
  if (SchalterzustandSteckdose1 == false) {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum1 >= maximumTempWachstum1) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1) {
    SchalterzustandSteckdose1 = false;
  }

Folgender Fehler tritt auf:
Wenn die max. Temperatur erreicht ist dann schaltet das Relais ein und aus und ein und aus...
Währenddessen zeigt der LCD Display sehr komische wechselnde Zeichen und irgendwann stürzt der Arduino Nano ab.
Ich versorge den Arduino Nano per USB mit 5V. Ich habe probehalber mit 9V über VIN und GND versorgt um eine zu schwache Stromversorgung ausschließen zu können - das hat nicht
geholfen.
Das Relais schaltet einen Heizstab mit max. 100W (230VAC) und einen PC- Lüfter, der mit einem Netzteil betrieben wird (230VAC).

Weiß jmd. woran das liegen könnte?

Moin Künstler! Schön wieder was von Dir zu lesen! Du lebst... :heartbeat: :heartbeat: :heartbeat:
Zeig mal bitte Deinen kompletten Code. Du weisst doch, das es sonst nur raten ist.
Und dann die verwendete Hardware - einfach soweit es geht nen link dahin.

Das wird auch fertig.
versprochen.

Ja, ich lebe:). Ich freue mich auch von Dir zu hören! und dass Du mir so verdammt schnell antwortest:D.
Hier ist der komplette Code:

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen


//Pins für Relais- Schaltung am Arduino festlegen
#define Relais_Steckdose1 4 //==> Pin 4 ist "Steckdose 1"
#define Relais_Steckdose2 5 //==> Pin 5 ist "Steckdose 2"
#define Relais_Steckdose3 6 //==> Pin 6 ist "Steckdose 3"
#define Relais_Steckdose4 7 //==> Pin 7 ist "Steckdose 4"

// Minimum und -Maximumwerte für Parameter festlegen //Ich darf hier keine Kommazahlen verwenden, sonst kommt es zu Störungen!
#define minimumTempWachstum1 24 //==> Temperatur minimum Wachstum1
#define maximumTempWachstum1 26 //==> Temperatur maximum Wachstum1 
#define minimumTempWachstum2 24 //==> Temperatur minimum Wachstum2
#define maximumTempWachstum2 26 //==> Temperatur maximum Wachstum2
#define minimumTempFruchtung 10 //==> Temperatur minimum Fruchtung1
#define maximumTempFruchtung 16 //==> Temperatur maximum Fruchtung2
#define minimumLFFruchtung 85 //==> LF minimum Fruchtung2
#define maximumLFFruchtung 92 //==> LF maximum Fruchtung2

// Schalterzustände der Steckdosen deklarieren
bool SchalterzustandSteckdose1 = false; // Steckdose 1 ist deaktiviert
bool SchalterzustandSteckdose2 = false; // Steckdose 2 ist deaktiviert
bool SchalterzustandSteckdose3 = false; // Steckdose 3 ist deaktiviert
bool SchalterzustandSteckdose4 = false; // Steckdose 4 ist deaktiviert

// Sensorwerte deklarieren
int TempWachstum1;
int TempWachstum2;
int TempFruchtung;
int LFFruchtung;

// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================


void setup() {
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss

  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(Relais_Steckdose1, OUTPUT); //
  pinMode(Relais_Steckdose2, OUTPUT);
  pinMode(Relais_Steckdose3, OUTPUT);
  pinMode(Relais_Steckdose4, OUTPUT);
  digitalWrite(Relais_Steckdose1, LOW);
  digitalWrite(Relais_Steckdose2, LOW);
  digitalWrite(Relais_Steckdose3, LOW);
  digitalWrite(Relais_Steckdose4, LOW);

}
void loop() {

  // Werte ablesen
  int LFFruchtung = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  int TempFruchtung = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  int TempWachstum1 = sensors.getTempCByIndex(0);
  int TempWachstum2 = sensors.getTempCByIndex(1);
  sensors.requestTemperatures();
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    lcd.print(TempWachstum1); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempWachstum2); // Temperatur von Wachstum2 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempFruchtung); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen

    lcd.setCursor(10, 1);
    lcd.print(LFFruchtung); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  // Temperaturregelung von Wachstum 1
  if (SchalterzustandSteckdose1 == false) {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum1 >= maximumTempWachstum1) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1) {
    SchalterzustandSteckdose1 = false;
  }

  // Temperaturregelung von Wachstum 2
  if (SchalterzustandSteckdose2 == false) {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum2 >= maximumTempWachstum2) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
  }
  if (TempWachstum2 <= minimumTempWachstum2) {
    SchalterzustandSteckdose2 = false;
  }

  // Temperaturregelung von Fruchtung
  if (SchalterzustandSteckdose3 == false) {
    digitalWrite(Relais_Steckdose3, LOW);
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempFruchtung >= maximumTempFruchtung) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose3, HIGH);
    SchalterzustandSteckdose3 = true;
  }
if (TempFruchtung <= minimumTempFruchtung) {
    SchalterzustandSteckdose3 = false;
  }
  
  // LF- Regulierung von Fruchtung
  if (SchalterzustandSteckdose4 == false) {
    digitalWrite(Relais_Steckdose4, LOW);
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (LFFruchtung >= maximumLFFruchtung) { // Wenn die Luftfeuchtgkeit gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose4, HIGH);
    SchalterzustandSteckdose4 = true;
  }
  if (LFFruchtung <= minimumLFFruchtung) {
    SchalterzustandSteckdose4 = false;
  }
}

Ich melde mich gleich bzgl. der Hardware;)

Bzgl. der Hardware:

Das ist in der Steuerung verbaut:

Die Akteure werden über eine modifizierte 3-fach- Steckdose (jetzt 4- Fach:D) geschaltet (in "Pilzzucht_Steckplatine_bearbeitet" sollen die kleinen schwarzen Rechtecke die einzelnen Steckdosen (1-4) symbolisieren) :

Jetzt kommen alle Akteure, die an der 4- fach Steckdose dranhängen:

  • Steckdose1 = Heizmatte (230VAC/ 4 Watt)

  • Steckdose2 = Heizstab (230VAC/ 100 Watt + PC- Lüfter)

  • (Steckdose 3 = noch nichts, muss vielleicht auch garnicht sein)

  • Steckdose 4 = Ultraschallzerstäuber mit 230 VAC zu 24VDC Netzteil + PC- Lüfter mit 230VAC zu 5VDC- Netzteil

Hier ist noch eine Erklärung bezüglich des Displays, also was die angezeigten Werte zu bedeuten haben:

Da würde ich bei Relais auf eine EMV Störung tippen, entweder vom Relais selbst oder von den Kontakten. Richtig weiterhelfen kann nur ein Scope zur Überwachung der Versorgungsspannung des Controllers.

Jede einzelne Netzleitung sollte entstört werden, mindestens mit einem Y-Kondensator. Vorrangig diejenige, deren Schaltung das Fehlverhalten auslöst, und die zum Arduino Netzteil.

Den habe ich leider nicht, wie Du schon erahnt hast:).

Meinst Du so (die Kondensatoren sind rot eingekreist):


Es gibt ja Y- Kondensatoren mit verschiedenen nF- Werten, zu welchen würdest Du mir raten, gibt es dafür eine Faustformel?

Ich habe eben zu Probezwecken die Akteure aus der modifizierten 4-fach Steckdose genommen um zu gucken ob die EVM von den Akteuren oder dem Relais kommen. Der Fehler (ständiges An- und Ausschalten des Relais) kam beim Einschalten des Relais_Steckdose2 zwar noch vor, dafür blieb aber die Störung des LCD- Displays aus und der Arduino Nano stürzte nicht ab.

Ich habe den Fehler gefunden.
Ich hatte im Sketch eine Zeile vergessen (** mit Sternchen markiert **) :

// Temperaturregelung von Wachstum 2
  if (SchalterzustandSteckdose2 == false) {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum2 >= maximumTempWachstum2) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
    **SchalterzustandSteckdose2 = true;**
  }
  if (TempWachstum2 <= minimumTempWachstum2) {
    SchalterzustandSteckdose2 = false;
  }

Peinlich , dass ich in meinem ersten Post, den falschen Abschnitt, nämlich "Temperaturregelung von Wachstum 1" als mögliche Fehlerquelle zitiert habe, hier war nämlich alles richtig.
Sry!

Ich kann mir also vorerst die Y- Kondensatoren sparen, gerade läuft so nämlich alles:).

Hier ist jetzt der komplette aktualisierte Sketch:

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen


//Pins für Relais- Schaltung am Arduino festlegen
#define Relais_Steckdose1 4 //==> Pin 4 ist "Steckdose 1"
#define Relais_Steckdose2 5 //==> Pin 5 ist "Steckdose 2"
#define Relais_Steckdose3 6 //==> Pin 6 ist "Steckdose 3"
#define Relais_Steckdose4 7 //==> Pin 7 ist "Steckdose 4"

// Minimum und -Maximumwerte für Parameter festlegen //Ich darf hier keine Kommazahlen verwenden, sonst kommt es zu Störungen!
#define minimumTempWachstum1 24 //==> Temperatur minimum Wachstum1
#define maximumTempWachstum1 26 //==> Temperatur maximum Wachstum1 
#define minimumTempWachstum2 24 //==> Temperatur minimum Wachstum2
#define maximumTempWachstum2 26 //==> Temperatur maximum Wachstum2
#define minimumTempFruchtung 10 //==> Temperatur minimum Fruchtung
#define maximumTempFruchtung 16 //==> Temperatur maximum Fruchtung
#define minimumLFFruchtung 85 //==> LF minimum Fruchtung
#define maximumLFFruchtung 92 //==> LF maximum Fruchtung

// Schalterzustände der Steckdosen deklarieren
bool SchalterzustandSteckdose1 = false; // Steckdose 1 ist deaktiviert
bool SchalterzustandSteckdose2 = false; // Steckdose 2 ist deaktiviert
bool SchalterzustandSteckdose3 = false; // Steckdose 3 ist deaktiviert
bool SchalterzustandSteckdose4 = false; // Steckdose 4 ist deaktiviert

// Sensorwerte deklarieren
int TempWachstum1;
int TempWachstum2;
int TempFruchtung;
int LFFruchtung;

// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================


void setup() {
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss

  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(Relais_Steckdose1, OUTPUT); //
  pinMode(Relais_Steckdose2, OUTPUT);
  pinMode(Relais_Steckdose3, OUTPUT);
  pinMode(Relais_Steckdose4, OUTPUT);
  digitalWrite(Relais_Steckdose1, LOW);
  digitalWrite(Relais_Steckdose2, LOW);
  digitalWrite(Relais_Steckdose3, LOW);
  digitalWrite(Relais_Steckdose4, LOW);

}
void loop() {

  // Werte ablesen
  int LFFruchtung = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  int TempFruchtung = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  int TempWachstum1 = sensors.getTempCByIndex(0);
  int TempWachstum2 = sensors.getTempCByIndex(1);
  sensors.requestTemperatures();
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    lcd.print(TempWachstum1); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempWachstum2); // Temperatur von Wachstum2 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempFruchtung); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen

    lcd.setCursor(10, 1);
    lcd.print(LFFruchtung); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  // Temperaturregelung von Wachstum 1
  if (SchalterzustandSteckdose1 == false) {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum1 >= maximumTempWachstum1) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1) {
    SchalterzustandSteckdose1 = false;
  }

  // Temperaturregelung von Wachstum 2
  if (SchalterzustandSteckdose2 == false) {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum2 >= maximumTempWachstum2) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
    SchalterzustandSteckdose2 = true;
  }
  if (TempWachstum2 <= minimumTempWachstum2) {
    SchalterzustandSteckdose2 = false;
  }

  // Temperaturregelung von Fruchtung
  if (SchalterzustandSteckdose3 == false) {
    digitalWrite(Relais_Steckdose3, LOW);
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempFruchtung >= maximumTempFruchtung) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose3, HIGH);
    SchalterzustandSteckdose3 = true;
  }
if (TempFruchtung <= minimumTempFruchtung) {
    SchalterzustandSteckdose3 = false;
  }
  
  // LF- Regulierung von Fruchtung
  if (SchalterzustandSteckdose4 == false) {
    digitalWrite(Relais_Steckdose4, LOW);
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (LFFruchtung >= maximumLFFruchtung) { // Wenn die Luftfeuchtgkeit gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose4, HIGH);
    SchalterzustandSteckdose4 = true;
  }
  if (LFFruchtung <= minimumLFFruchtung) {
    SchalterzustandSteckdose4 = false;
  }
}

Vielen Dank für Eure Hilfe!:slight_smile:

Da bin ich wieder:D.
Also so richtig einwandfrei funktioniert es leider immer noch nicht.
Es hängt ein Heizstab (100 Watt/ 230VAC) und ein PC- Lüfter + Netzteil ( ca. 0,5 Watt/ 230VAC) an Relais_Steckdose2.
Manchmal funktioniert alles einwandfrei wenn ich das Setup mit Strom versorge und manchmal erscheinen diese Zeichen hier auf dem LCD Display, aber: trotzdem funkioniert der Rest wie gewollt, d.h. das Relais_Steckdose2 schaltet wenn es schalten soll usw.

Dann würde ich jetzt doch mal das hier ausprobieren (es sei dem es fällt jemand anderem noch eine andere raffinierte Idee ein) :

(KLEINES UPDATE: Der Arduino Nano wird jetzt über VIN und GND mit einem 12V/ 1A Netzteil betrieben um eine zu geringe Stromversorgung ausschließen zu können.)

Stimmt das so, nach DrDiettrich?
Kann mir bitte jemand einen bestimmten Y- Kondensator dafür empfehlen und kurz erläutern wie man ihn bestimmt?

Vielleicht solltest du mal probieren if (SchalterzustandSteckdoseX == false) in if (SchalterzustandSteckdoseX == false && digitalRead(Relais_SteckdoseX) != LOW)
für jeden "Schalterzustand" ändern weil die Pin-"Schaltung" und somit auch die LCD Aktualisierung" permanent erfolgt. Das Gleiche bei if (TempWachstumX >= maximumTempWachstumX) oder if (TempFruchtung >= maximumTempFruchtung) usw.

Was ich meine... das Umschalten der Pins so steuern, dass ein Schaltvorgang nur einmal bei einer Über- / Unterschreitung der Temperaturschwelle erfolgt. So wie es jetzt ist, wird bei jedem Loopdurchlauf geschaltet und das Display aktualisiert.

Oder einen dritten Schaltzustand einführen um die IF Bedingungen zu vereinfachen.

Evtl. bringt das ja etwas bei Deinem Darstellungsproblem.

Wie hast Du die Verbindung vom Display am Nano dran? Sind die angelötet oder sind das Dupontkabel?

Dann ist der Code doch sehr wiederholend, da kann einiges zusammengefasst werden.
Zudem halte ich die Variablen SchalterzustandSteckdoseX für überflüssig. Am Beispiel für einen Kreis würde ich das komplett so lösen:

  // Temperaturregelung von Wachstum 1
  if (TempWachstum1 >= maximumTempWachstum1 &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose1) == LOW)
  {
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1 &&
      digitalRead(Relais_Steckdose1) == HIGH)
  {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }

Warum schaltest Du am Anfang alle Relais ein?
Wenn die oberen Schaltpunkte bereits erreicht sind, klackert es gleich wieder.

Ja, wenn das Y-Kondensatoren mit 3 Anschlüssen sind.
Für die Gleichstromversorgung des Arduinos funktionieren die nicht, da sie nur für Wechselstrom ausgelegt sind.

Das hilft nichts, wenn der on-board Spannungsregler überlastet wird. Zumindest wäre eine niedrigere Spannung (7V) oder gleich 5V eine bessere Stromversorgung.

Nach den Tabellen in Wikipedia würde ich auf X3 Y3 tippen. Ansonsten habe ich keine Erfahrungen damit.

Dein Tipp hat geholfen!
Der Display hat bisher nach wiederholtem Anschalten keinen Fehler mehr angezeigt!
Vielen Dank!:slight_smile:
So sieht der Sketch jetzt aus:

// Vielleicht solltest du mal probieren if (SchalterzustandSteckdoseX == false) in if (SchalterzustandSteckdoseX == false && digitalRead(Relais_SteckdoseX) != LOW)

// für jeden "Schalterzustand" ändern weil die Pin-"Schaltung" und somit auch die LCD Aktualisierung" permanent erfolgt. Das Gleiche bei if (TempWachstumX >= maximumTempWachstumX) oder if (TempFruchtung >= maximumTempFruchtung) usw.

// Was ich meine... das Umschalten der Pins so steuern, dass ein Schaltvorgang nur einmal bei einer Über- / Unterschreitung der Temperaturschwelle erfolgt. So wie es jetzt ist, wird bei jedem Loopdurchlauf geschaltet und das Display aktualisiert.

// Oder einen dritten Schaltzustand einführen um die IF Bedingungen zu vereinfachen.

// Evtl. bringt das ja etwas bei Deinem Darstellungsproblem.

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen


//Pins für Relais- Schaltung am Arduino festlegen
#define Relais_Steckdose1 4 //==> Pin 4 ist "Steckdose 1"
#define Relais_Steckdose2 5 //==> Pin 5 ist "Steckdose 2"
#define Relais_Steckdose3 6 //==> Pin 6 ist "Steckdose 3"
#define Relais_Steckdose4 7 //==> Pin 7 ist "Steckdose 4"

// Minimum und -Maximumwerte für Parameter festlegen //Ich darf hier keine Kommazahlen verwenden, sonst kommt es zu Störungen!
#define minimumTempWachstum1 24 //==> Temperatur minimum Wachstum1
#define maximumTempWachstum1 26 //==> Temperatur maximum Wachstum1 
#define minimumTempWachstum2 24 //==> Temperatur minimum Wachstum2
#define maximumTempWachstum2 26 //==> Temperatur maximum Wachstum2
#define minimumTempFruchtung 10 //==> Temperatur minimum Fruchtung
#define maximumTempFruchtung 16 //==> Temperatur maximum Fruchtung
#define minimumLFFruchtung 85 //==> LF minimum Fruchtung
#define maximumLFFruchtung 92 //==> LF maximum Fruchtung

// Schalterzustände der Steckdosen deklarieren
bool SchalterzustandSteckdose1 = false; // Steckdose 1 ist deaktiviert
bool SchalterzustandSteckdose2 = false; // Steckdose 2 ist deaktiviert
bool SchalterzustandSteckdose3 = false; // Steckdose 3 ist deaktiviert
bool SchalterzustandSteckdose4 = false; // Steckdose 4 ist deaktiviert

// Sensorwerte deklarieren
int TempWachstum1;
int TempWachstum2;
int TempFruchtung;
int LFFruchtung;

// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================


void setup() {
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss

  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(Relais_Steckdose1, OUTPUT); //
  pinMode(Relais_Steckdose2, OUTPUT);
  pinMode(Relais_Steckdose3, OUTPUT);
  pinMode(Relais_Steckdose4, OUTPUT);
  digitalWrite(Relais_Steckdose1, LOW);
  digitalWrite(Relais_Steckdose2, LOW);
  digitalWrite(Relais_Steckdose3, LOW);
  digitalWrite(Relais_Steckdose4, LOW);

}
void loop() {

  // Werte ablesen
  int LFFruchtung = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  int TempFruchtung = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  int TempWachstum1 = sensors.getTempCByIndex(0);
  int TempWachstum2 = sensors.getTempCByIndex(1);
  sensors.requestTemperatures();
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    lcd.print(TempWachstum1); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempWachstum2); // Temperatur von Wachstum2 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempFruchtung); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen

    lcd.setCursor(10, 1);
    lcd.print(LFFruchtung); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  // Temperaturregelung von Wachstum 1
  if (SchalterzustandSteckdose1 == false && digitalRead(Relais_Steckdose1)!= LOW) { 
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum1 >= maximumTempWachstum1 && digitalRead(Relais_Steckdose1)!= HIGH) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1) {
    SchalterzustandSteckdose1 = false;
  }

  // Temperaturregelung von Wachstum 2
  if (SchalterzustandSteckdose2 == false && digitalRead(Relais_Steckdose2)!= LOW) {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempWachstum2 >= maximumTempWachstum2 && digitalRead(Relais_Steckdose2)!= HIGH) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
    SchalterzustandSteckdose2 = true;
  }
  if (TempWachstum2 <= minimumTempWachstum2) {
    SchalterzustandSteckdose2 = false;
  }

  // Temperaturregelung von Fruchtung
  if (SchalterzustandSteckdose3 == false && digitalRead(Relais_Steckdose3)!= LOW) {
    digitalWrite(Relais_Steckdose3, LOW);
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (TempFruchtung >= maximumTempFruchtung && digitalRead(Relais_Steckdose3)!= HIGH) { // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose3, HIGH);
    SchalterzustandSteckdose3 = true;
  }
if (TempFruchtung <= minimumTempFruchtung) {
    SchalterzustandSteckdose3 = false;
  }
  
  // LF- Regulierung von Fruchtung
  if (SchalterzustandSteckdose4 == false && digitalRead(Relais_Steckdose4)!= LOW) {
    digitalWrite(Relais_Steckdose4, LOW);
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  if (LFFruchtung >= maximumLFFruchtung && digitalRead(Relais_Steckdose4)!= HIGH) { // Wenn die Luftfeuchtgkeit gleich oder höher des festgelegten Maximums...
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose4, HIGH);
    SchalterzustandSteckdose4 = true;
  }
  if (LFFruchtung <= minimumLFFruchtung) {
    SchalterzustandSteckdose4 = false;
  }
}

Dupontkabel.

Gute Frage, ich habe es geändert;)

Hier ist der aktuelle Sketch:

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen


//Pins für Relais- Schaltung am Arduino festlegen
#define Relais_Steckdose1 4 //==> Pin 4 ist "Steckdose 1"
#define Relais_Steckdose2 5 //==> Pin 5 ist "Steckdose 2"
#define Relais_Steckdose3 6 //==> Pin 6 ist "Steckdose 3"
#define Relais_Steckdose4 7 //==> Pin 7 ist "Steckdose 4"

// Minimum und -Maximumwerte für Parameter festlegen //Ich darf hier keine Kommazahlen verwenden, sonst kommt es zu Störungen!
#define minimumTempWachstum1 24 //==> Temperatur minimum Wachstum1
#define maximumTempWachstum1 26 //==> Temperatur maximum Wachstum1 
#define minimumTempWachstum2 24 //==> Temperatur minimum Wachstum2
#define maximumTempWachstum2 26 //==> Temperatur maximum Wachstum2
#define minimumTempFruchtung 10 //==> Temperatur minimum Fruchtung
#define maximumTempFruchtung 16 //==> Temperatur maximum Fruchtung
#define minimumLFFruchtung 85 //==> LF minimum Fruchtung
#define maximumLFFruchtung 92 //==> LF maximum Fruchtung

// Schalterzustände der Steckdosen deklarieren
bool SchalterzustandSteckdose1 = false; // Steckdose 1 ist deaktiviert
bool SchalterzustandSteckdose2 = false; // Steckdose 2 ist deaktiviert
bool SchalterzustandSteckdose3 = false; // Steckdose 3 ist deaktiviert
bool SchalterzustandSteckdose4 = false; // Steckdose 4 ist deaktiviert

// Sensorwerte deklarieren
int TempWachstum1;
int TempWachstum2;
int TempFruchtung;
int LFFruchtung;

// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================


void setup() {
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss

  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(Relais_Steckdose1, OUTPUT); //
  pinMode(Relais_Steckdose2, OUTPUT);
  pinMode(Relais_Steckdose3, OUTPUT);
  pinMode(Relais_Steckdose4, OUTPUT);
}
void loop() {

  // Werte ablesen
  int LFFruchtung = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  int TempFruchtung = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  int TempWachstum1 = sensors.getTempCByIndex(0);
  int TempWachstum2 = sensors.getTempCByIndex(1);
  sensors.requestTemperatures();
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    lcd.print(TempWachstum1); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempWachstum2); // Temperatur von Wachstum2 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempFruchtung); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen

    lcd.setCursor(10, 1);
    lcd.print(LFFruchtung); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  
  // Temperaturregelung von Wachstum 1
  if (TempWachstum1 >= maximumTempWachstum1 &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose1) == LOW)
  {
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1 &&
      digitalRead(Relais_Steckdose1) == HIGH)
  {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }

  // Temperaturregelung von Wachstum 2
  if (TempWachstum2 >= maximumTempWachstum2 &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose2) == LOW)
  {
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
    SchalterzustandSteckdose2 = true;
  }
  if (TempWachstum2 <= minimumTempWachstum2 &&
      digitalRead(Relais_Steckdose2) == HIGH)
  {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }

  // Temperaturregelung von Fruchtung
  if (TempFruchtung >= maximumTempFruchtung &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose3) == LOW)
  {
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose3, HIGH);
    SchalterzustandSteckdose3 = true;
  }
  if (TempFruchtung <= minimumTempFruchtung &&
      digitalRead(Relais_Steckdose3) == HIGH)
  {
    digitalWrite(Relais_Steckdose3, LOW);
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  
  // LF- Regulierung von Fruchtung
  if (LFFruchtung >= maximumLFFruchtung &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose4) == LOW)
  {
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose4, HIGH);
    SchalterzustandSteckdose4 = true;
  }
  if (LFFruchtung <= minimumLFFruchtung &&
      digitalRead(Relais_Steckdose4) == HIGH)
  {
    digitalWrite(Relais_Steckdose4, LOW);
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
}

Der Sketch funktioniert auch hervorragend und ist dabei noch so schön aufgeräumt:). Danke!
Gerade habe ich noch nicht die komplett zu schaltende Hardware an der 4- fach Steckdose installiert. Ich mache das gleich mal und bin gespannt ob dann auch noch alles so gut funktioniert.

Danke für Deine Antwort! Ich lasse das jetzt zunächst einmal, weil gerade alles gut funktioniert, aber sollten wieder Probleme auftreten weiß ich an welcher Stelle ich ansetzen muss.

Die Variablen brauchst Du nicht. Die können komplett aus dem Sketch raus - der funktioniert weiterhin :wink:

Freut mich wenn es geholfen hat. Natürlich geht das mit dem Code noch etwas schöner .... das war bloß ein "Quickfix" ;-).

Okay, ist draußen:). Er wird immer schöner, der Sketch:).

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen


//Pins für Relais- Schaltung am Arduino festlegen
#define Relais_Steckdose1 4 //==> Pin 4 ist "Steckdose 1"
#define Relais_Steckdose2 5 //==> Pin 5 ist "Steckdose 2"
#define Relais_Steckdose3 6 //==> Pin 6 ist "Steckdose 3"
#define Relais_Steckdose4 7 //==> Pin 7 ist "Steckdose 4"

// Minimum und -Maximumwerte für Parameter festlegen //Ich darf hier keine Kommazahlen verwenden, sonst kommt es zu Störungen!
#define minimumTempWachstum1 24 //==> Temperatur minimum Wachstum1
#define maximumTempWachstum1 26 //==> Temperatur maximum Wachstum1 
#define minimumTempWachstum2 24 //==> Temperatur minimum Wachstum2
#define maximumTempWachstum2 26 //==> Temperatur maximum Wachstum2
#define minimumTempFruchtung 10 //==> Temperatur minimum Fruchtung
#define maximumTempFruchtung 16 //==> Temperatur maximum Fruchtung
#define minimumLFFruchtung 85 //==> LF minimum Fruchtung
#define maximumLFFruchtung 92 //==> LF maximum Fruchtung

// Sensorwerte deklarieren
int TempWachstum1;
int TempWachstum2;
int TempFruchtung;
int LFFruchtung;

// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================


void setup() {
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss

  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor

  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  pinMode(Relais_Steckdose1, OUTPUT); //
  pinMode(Relais_Steckdose2, OUTPUT);
  pinMode(Relais_Steckdose3, OUTPUT);
  pinMode(Relais_Steckdose4, OUTPUT);
}
void loop() {

  // Werte ablesen
  int LFFruchtung = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
  int TempFruchtung = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
  int TempWachstum1 = sensors.getTempCByIndex(0);
  int TempWachstum2 = sensors.getTempCByIndex(1);
  sensors.requestTemperatures();
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    lcd.print(TempWachstum1); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempWachstum2); // Temperatur von Wachstum2 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen
    lcd.print(TempFruchtung); // Temperatur von Wachstum1 anzeigen
    lcd.print("\337C "); // Grad und dahinter Leerzeichen

    lcd.setCursor(10, 1);
    lcd.print(LFFruchtung); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  
  // Temperaturregelung von Wachstum 1
  if (TempWachstum1 >= maximumTempWachstum1 &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose1) == LOW)
  {
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose1, HIGH);
    SchalterzustandSteckdose1 = true;
  }
  if (TempWachstum1 <= minimumTempWachstum1 &&
      digitalRead(Relais_Steckdose1) == HIGH)
  {
    digitalWrite(Relais_Steckdose1, LOW);
    lcd.setCursor(3, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }

  // Temperaturregelung von Wachstum 2
  if (TempWachstum2 >= maximumTempWachstum2 &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose2) == LOW)
  {
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose2, HIGH);
    SchalterzustandSteckdose2 = true;
  }
  if (TempWachstum2 <= minimumTempWachstum2 &&
      digitalRead(Relais_Steckdose2) == HIGH)
  {
    digitalWrite(Relais_Steckdose2, LOW);
    lcd.setCursor(8, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }

  // Temperaturregelung von Fruchtung
  if (TempFruchtung >= maximumTempFruchtung &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose3) == LOW)
  {
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose3, HIGH);
    SchalterzustandSteckdose3 = true;
  }
  if (TempFruchtung <= minimumTempFruchtung &&
      digitalRead(Relais_Steckdose3) == HIGH)
  {
    digitalWrite(Relais_Steckdose3, LOW);
    lcd.setCursor(15, 0); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
  
  // LF- Regulierung von Fruchtung
  if (LFFruchtung >= maximumLFFruchtung &&   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
      digitalRead(Relais_Steckdose4) == LOW)
  {
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print(" "); // das w überschreiben
    digitalWrite(Relais_Steckdose4, HIGH);
    SchalterzustandSteckdose4 = true;
  }
  if (LFFruchtung <= minimumLFFruchtung &&
      digitalRead(Relais_Steckdose4) == HIGH)
  {
    digitalWrite(Relais_Steckdose4, LOW);
    lcd.setCursor(15, 1); // Cursor setzen
    lcd.print("w"); // ein w für "working" anzeigen
  }
}

So... dann mal noch ein Hinweis:
Du schreibst alle 500ms den Display mit den Temperaturen.

if (millis() - timestore_LCD > 500 ) // wenn Pausenzeit um wird der Display erneuert

Das macht keinen Sinn.
Du hast 12bit Auflösung für die DS-sensoren eingestellt, da ist die Zeit für die Berechnung aber schon 750ms.

Ich würde alle Sekunde das Display mit den Temp-/Humiwerten schreiben.
Und dann ist die Frage, ob Dir mit diesem Schreiben auch das W bzw. das Leerzeichen für die Anzeige der Zustände für die Anzeige ausreicht.

Ich hab mal was in Richtung "schön" versucht.
Ungetestet - kompiliert aber sauber.

//Bibliotheken und Definieren von DHT22
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3 //==> Der Sensor wird an Pin 3 angeschlossen
#define DHTTYPE DHT22//==> Es handelt sich um einen DHT22 Sensor
DHT dht(DHTPIN, DHTTYPE); // Der Sensor wird ab jetzt mit "dht" angesprochen

// Bibliotheken und Definieren von LCD1602
#include <LiquidCrystal_I2C.h> // LiquidCrystal Bibliothek laden für LCD Display
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // so wenn ein 1602 display genutzt wird

#include <Wire.h> // Bibliothek für 1602 LCD Display
#include <OneWire.h> // OneWire- Bibliothek für DS18B20
#include <DallasTemperature.h> // DallasTemperature- Bibliothek für DS18B20

// Bibliotheken und Definieren für DS18B20
#define ONE_WIRE_BUS 2 // Das Datenkabel vom DS18B20 ist an Pin 2 angeschlossen
#define TEMPERATURE_PRECISION 12// ?
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress one, two; // bei mir sind zwei Temperatursensoren angeschlossen

const byte kreise = 4; // Anzahl der Regelkreise
const byte steckdose[kreise] = {4, 5, 6, 7}; //==> Pin 4 ist "Steckdose 1"
const byte minimalWert[kreise] = {24, 24, 10, 85};
const byte maximalWert[kreise] = {26, 26, 16, 92};
byte sensorWert[kreise] = {0}; // T - Wachstum1, T - Wachstum2, T - Fruchtung, Hygro


// LCD- Display
unsigned long timestore_LCD;               // Zeitmerker für LCD Display
//=============================================================================

void setup()
{
  Serial.begin(9600); //Serielle Verbindung starten, falls ich mit dem seriellen Monitor arbeiten muss
  // Sensoren und LCD starten
  sensors. begin(); // DS18B20 Sensoren starten
  dht.begin(); //DHT22 Sensor starten
  lcd.init(); // für den LCD- Monitor
  lcd.backlight(); // für den LCD- Monitor
  //Pins deklarieren und Anfangszustand deklarieren (Alle Steckdosen einschalten am Anfang!!!)
  for (byte b = 0; b < kreise; b++)
  { pinMode(steckdose[b], OUTPUT); } //
}

void loop()
{
  getSensors();
  setActor();
  setDisplay();
}

void getSensors()
{
  for (byte b = 0; b < kreise; b++)
  {
    switch (b)
    {
      case 0: sensorWert[b] = sensors.getTempCByIndex(0); break;
      case 1: sensorWert[b] = sensors.getTempCByIndex(1); break;
      case 2: sensorWert[b] = dht.readTemperature(); break;
      case 3: sensorWert[b] = dht.readHumidity(); break;
    }
    // sensors.requestTemperatures(); // EDIT: zu früh
  }
  sensors.requestTemperatures(); // Edit: richtig
}

void setActor()
{
  for (byte b = 0; b < kreise; b++)
  {
    if (sensorWert[b] >= maximalWert[b])   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    { digitalWrite(steckdose[b], HIGH); }
    if (sensorWert[b] >= minimalWert[b])   // Wenn die Temperatur gleich oder höher des festgelegten Maximums...
    { digitalWrite(steckdose[b], LOW); }
  }
}

void setDisplay()
{
  // und auf dem LCD erneuern
  if (millis() - timestore_LCD > 1000 ) // wenn Pausenzeit um wird der Display erneuert
  {
    lcd.setCursor(0, 0);
    for (byte b = 0; b < kreise - 1; b++)
    {
      lcd.print(sensorWert[b]); // Temperatur von Wachstum1 anzeigen
      lcd.print("\337C "); // Grad und dahinter Leerzeichen
    }
    lcd.setCursor(10, 1);
    lcd.print(sensorWert[kreise - 1]); // LF von Fruchtung anzeigen
    lcd.print(" %"); //
    timestore_LCD = millis();            // Ausschaltzeit merken
  }
  for (byte b = 0; b < kreise; b++)
  {
    switch (b)
    {
      case 0: lcd.setCursor(3, 1); break;
      case 1: lcd.setCursor(8, 1); break;
      case 2: lcd.setCursor(15, 0); break;
      case 3: lcd.setCursor(15, 1); break;
    }
    if (digitalRead(steckdose[b] == HIGH))
    { lcd.print(' '); } // das w überschreiben
    else
    { lcd.print('w'); }
  }
}

Eigentlich sollte man das Display nur aktualisieren, wenn sich die Werte um einen sinnvollen Betrag geändert haben.

Gruß Tommy