Nano-Clone mit SH1106 OLED hängt im setup fest

Guten Tag, liebe Gemeinde,
ich unternehme meine ersten Gehversuche mit Arduino&Co und versuche derzeit den Code des Taupunktlüfters aus der Make so umzubauen, dass das Ganze mit SHT31-Sensoren und einem OLED-Display (SH1106, 128x64, auch Clone) funktioniert.
Der Nano-Clone werkelte bereits erfolgreich mit dem Original-Code (LCD+Dht-Sensoren).
Habe den Code zunächst nur bzgl. der SHT-Sensoren umgeschrieben. Das hat funktioniert. Nur das Display will einfach nicht.
Der Beispielcode unter

läuft problemlos. Daher entnehme ich, dass Verdrahtung und Display selbst intakt sind.
Aus dem Beispielcode habe ich mir auch die Initalisierungszeilen rüberkopiert und zwischenzeitlich mit seriellen Ausgaben versehen, um rauszufinden, wo es hängt. Demnach ist er vor display.begin(...) in einer Dauerschleife.
Hat hier jemand eine zündende Idee?
Vielen Dank schonmal
Olaf
Hier der Code:

// Dieser Code benötigt zwingend die folgenden Libraries:
#include <Wire.h> 
#include <avr/wdt.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_SH110X.h>

#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1   //   QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RELAIPIN 6 // Anschluss des Lüfter-Relais

Adafruit_SHT31 sht31a = Adafruit_SHT31();
Adafruit_SHT31 sht31b = Adafruit_SHT31();

#define RELAIS_EIN LOW
#define RELAIS_AUS HIGH
bool rel;

// *******  Korrekturwerte der einzelnen Sensorwerte  *******
#define Korrektur_t_1  0 // Korrekturwert Innensensor Temperatur
#define Korrektur_t_2  0 // Korrekturwert Außensensor Temperatur
#define Korrektur_h_1  0  // Korrekturwert Innensensor Luftfeuchtigkeit
#define Korrektur_h_2  0  // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************

#define SCHALTmin   5.0 // minimaler Taupunktunterschied, bei dem das Relais schaltet
#define HYSTERESE   1.0 // Abstand von Ein- und Ausschaltpunkt
#define TEMP1_min  10.0 // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
#define TEMP2_min -10.0 // Minimale Außentemperatur, bei der die Lüftung aktiviert wird
//lcd.write('C');
bool fehler = true;

void setup() {

  wdt_enable(WDTO_8S); // Watchdog timer auf 8 Sekunden stellen
  
  pinMode(RELAIPIN, OUTPUT);          // Relaispin als Output definieren
  digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
  
  Serial.begin(9600);  // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
   Serial.println(F("serial.begin"));
  delay(250); // wait for the OLED to power up
   Serial.println(F("delay250"));
   Serial.println(i2c_Address); 
  display.begin(i2c_Address, true); // Address 0x3C default
   Serial.println(F("display.begin"));
 //display.setContrast (0); // dim display
 
  display.display();
   Serial.println(F("display.display"));
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();
  
  display.setCursor(3,10);
  display.println("Teste Sensoren..");
  
  
  Serial.println("SHT31 test");
  if (! sht31a.begin(0x44)) {    // first sensor with default address
    Serial.println("Couldn't find SHT31 #1");
    while (1) delay(1);
  }
  if (! sht31b.begin(0x45)) {    // second sensor with secondary address
    Serial.println("Couldn't find SHT31 #2");
    while (1) delay(1);
   }
    Serial.println(F("Teste Sensoren.."));
}

void loop() {
  
  float t1 = sht31a.readTemperature()+Korrektur_t_1;
  float h1 = sht31a.readHumidity()+Korrektur_h_1;
  float t2 = sht31b.readTemperature()+Korrektur_t_2;
  float h2 = sht31b.readHumidity()+Korrektur_h_2;

  if (fehler == true)  // Prüfen, ob gültige Werte von den Sensoren kommen
  {
    fehler = false; 
    if (isnan(h1) || isnan(t1) || h1 > 100 || h1 < 1 || t1 < -40 || t1 > 80 )  {
      Serial.println(F("Fehler beim Auslesen vom 1. Sensor!"));
      
       display.setTextSize(2);
       display.setTextColor(SH110X_WHITE);
       display.setCursor(0,1);
       display.print("Fehler Sensor 1");
      fehler = true;
    }else {
     
      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0,1);
      display.print("Sensor 1 in Ordnung");
   }
  
    delay(2000);  // Zeit um das Display zu lesen
  
      if (isnan(h2) || isnan(t2) || h2 > 100 || h2 < 1 || t2 < -40 || t2  > 80)  {
        Serial.println(F("Fehler beim Auslesen vom 2. Sensor!"));
      
         display.setTextSize(2);
         display.setTextColor(SH110X_WHITE);
         display.setCursor(0,1);
         display.print("Fehler Sensor 2");
        fehler = true;
      } else {
        
         display.setTextSize(2);
         display.setTextColor(SH110X_WHITE);
         display.setCursor(0,1);
         display.print("Sensor 2 in Ordnung");
     }

    delay(2000);  // Zeit um das Display zu lesen
  }
  if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) fehler = true;
   
 if (fehler == true) {
    digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten 
   
    display.setTextSize(2);
    display.setTextColor(SH110X_WHITE);
    display.setCursor(0,3);
    display.println(F("CPU Neustart....."));
    while (1);  // Endlosschleife um das Display zu lesen und die CPU durch den Watchdog neu zu starten
 }
 wdt_reset();  // Watchdog zurücksetzen

//**** Taupunkte errechnen********
float Taupunkt_1 = taupunkt(t1, h1);
float Taupunkt_2 = taupunkt(t2, h2);

// Werteausgabe auf Serial Monitor
 Serial.print(F("Sensor-1: " ));
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h1);                     
  Serial.print(F("%  Temperatur: "));
  Serial.print(t1);
  Serial.print(F("°C  "));
  Serial.print(F("  Taupunkt: "));
  Serial.print(Taupunkt_1);
  Serial.println(F("°C  "));

  Serial.print("Sensor-2: " );
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h2);
  Serial.print(F("%  Temperatur: "));
  Serial.print(t2);
  Serial.print(F("°C "));
  Serial.print(F("   Taupunkt: "));
  Serial.print(Taupunkt_2);
  Serial.println(F("°C  "));


 Serial.println();

  // Werteausgabe auf dem I2C-Display
  

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0,0);
  display.print("Innen: ");
  display.print(t1);
  display.print("°C | ");
  display.print(h1);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_1);
  display.println("°C");
  display.print("Außen: ");
  display.print(t2);
  display.print("°C | ");
  display.print(h2);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_2);
  display.println("°C");
    
  
delay(6000); // Zeit um das Display zu lesen
wdt_reset(); // Watchdog zurücksetzen

  
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0,0);

float DeltaTP = Taupunkt_1 - Taupunkt_2;

if (DeltaTP > (SCHALTmin + HYSTERESE))rel = true;
if (DeltaTP < (SCHALTmin))rel = false;
if (t1 < TEMP1_min )rel = false;
if (t2 < TEMP2_min )rel = false;

if (rel == true)
{
  digitalWrite(RELAIPIN, RELAIS_EIN); // Relais einschalten
  display.println("Fenster auf");
} else {                             
  digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
  display.println("Fenster zu");
}

 display.setCursor(0,15);
 display.print("Delta TP: ");
 display.print(DeltaTP);
 display.println("°C");

 delay(4000);   // Wartezeit zwischen zwei Messungen
 wdt_reset();   // Watchdog zurücksetzen 
 
}

float taupunkt(float t, float r) {
  
float a, b;
  
  if (t >= 0) {
    a = 7.5;
    b = 237.3;
  } else 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 software_Reset() // Startet das Programm neu, nicht aber die Sensoren oder das LCD 
 {
   asm volatile ("  jmp 0");  
 }

und hier die serielle Ausgabe:

serial.begin
delay250
60
serial.begin
delay250
60
serial.begin
delay250
60

Hallo,
Im Setup wird dein Display nicht initialisiert.
Stimmt da die Verkabelung ?
I2C vertauscht ?

Werfe den wdt raus. Der Rest am Nano nimmt mehr Strom als die MCU

// Dieser Code benötigt zwingend die folgenden Libraries:
#include <SPI.h>
#include <Wire.h>
#include <avr/wdt.h>
#include <Adafruit_GFX.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_SH110X.h>

#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1   //   QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RELAIPIN 6 // Anschluss des Lüfter-Relais

Adafruit_SHT31 sht31a = Adafruit_SHT31();
Adafruit_SHT31 sht31b = Adafruit_SHT31();

#define RELAIS_EIN digitalWrite(RELAIPIN,LOW)
#define RELAIS_AUS digitalWrite(RELAIPIN,HIGH)
bool rel;

// *******  Korrekturwerte der einzelnen Sensorwerte  *******
#define Korrektur_t_1  0 // Korrekturwert Innensensor Temperatur
#define Korrektur_t_2  0 // Korrekturwert Außensensor Temperatur
#define Korrektur_h_1  0  // Korrekturwert Innensensor Luftfeuchtigkeit
#define Korrektur_h_2  0  // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************

#define SCHALTmin   5.0 // minimaler Taupunktunterschied, bei dem das Relais schaltet
#define HYSTERESE   1.0 // Abstand von Ein- und Ausschaltpunkt
#define TEMP1_min  10.0 // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
#define TEMP2_min -10.0 // Minimale Außentemperatur, bei der die Lüftung aktiviert wird
//lcd.write('C');
bool fehler = true;

void setup() {

  RELAIS_AUS; // Relais ausschalten

  Serial.begin(9600);  // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
  pinMode(RELAIPIN, OUTPUT);          // Relaispin als Output definieren

  Serial.println(F("serial.begin"));
  delay(250); // wait for the OLED to power up
  Serial.println(F("delay250"));
  Serial.println(i2c_Address);
  display.begin(i2c_Address, true); // Address 0x3C default
  Serial.println(F("display.begin"));
  //display.setContrast (0); // dim display

  display.display();
  Serial.println(F("display.display"));
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();

  display.setCursor(3, 10);
  display.println("Teste Sensoren..");


  Serial.println("SHT31 test");
  if (! sht31a.begin(0x44)) {    // first sensor with default address
    Serial.println("Couldn't find SHT31 #1");
    while (1) delay(1);
  }
  if (! sht31b.begin(0x45)) {    // second sensor with secondary address
    Serial.println("Couldn't find SHT31 #2");
    while (1) delay(1);
  }
  Serial.println(F("Teste Sensoren.."));
  wdt_enable(WDTO_8S); // Watchdog timer auf 8 Sekunden stellen
}

void loop() {
  wdt_reset();
  float t1 = sht31a.readTemperature() + Korrektur_t_1;
  float h1 = sht31a.readHumidity() + Korrektur_h_1;
  float t2 = sht31b.readTemperature() + Korrektur_t_2;
  float h2 = sht31b.readHumidity() + Korrektur_h_2;

  if (fehler == true)  // Prüfen, ob gültige Werte von den Sensoren kommen
  {
    fehler = false;
    if (isnan(h1) || isnan(t1) || h1 > 100 || h1 < 1 || t1 < -40 || t1 > 80 )  {
      Serial.println(F("Fehler beim Auslesen vom 1. Sensor!"));

      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0, 1);
      display.print("Fehler Sensor 1");
      fehler = true;
    } else {

      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0, 1);
      display.print("Sensor 1 in Ordnung");
    }

    delay(2000);  // Zeit um das Display zu lesen

    if (isnan(h2) || isnan(t2) || h2 > 100 || h2 < 1 || t2 < -40 || t2  > 80)  {
      Serial.println(F("Fehler beim Auslesen vom 2. Sensor!"));

      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0, 1);
      display.print("Fehler Sensor 2");
      fehler = true;
    } else {

      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0, 1);
      display.print("Sensor 2 in Ordnung");
    }

    delay(2000);  // Zeit um das Display zu lesen
  }
  if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) fehler = true;

  if (fehler == true) {
    RELAIS_AUS; // Relais ausschalten

    display.setTextSize(2);
    display.setTextColor(SH110X_WHITE);
    display.setCursor(0, 3);
    display.println(F("CPU Neustart....."));
    while (1);  // Endlosschleife um das Display zu lesen und die CPU durch den Watchdog neu zu starten
  }
  wdt_reset();  // Watchdog zurücksetzen

  //**** Taupunkte errechnen********
  float Taupunkt_1 = taupunkt(t1, h1);
  float Taupunkt_2 = taupunkt(t2, h2);

  // Werteausgabe auf Serial Monitor
  Serial.print(F("Sensor-1: " ));
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h1);
  Serial.print(F("%  Temperatur: "));
  Serial.print(t1);
  Serial.print(F("°C  "));
  Serial.print(F("  Taupunkt: "));
  Serial.print(Taupunkt_1);
  Serial.println(F("°C  "));

  Serial.print("Sensor-2: " );
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h2);
  Serial.print(F("%  Temperatur: "));
  Serial.print(t2);
  Serial.print(F("°C "));
  Serial.print(F("   Taupunkt: "));
  Serial.print(Taupunkt_2);
  Serial.println(F("°C  "));
  Serial.println();

  // Werteausgabe auf dem I2C-Display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0, 0);
  display.print("Innen: ");
  display.print(t1);
  display.print("°C | ");
  display.print(h1);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_1);
  display.println("°C");
  display.print("Außen: ");
  display.print(t2);
  display.print("°C | ");
  display.print(h2);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_2);
  display.println("°C");

  delay(6000); // Zeit um das Display zu lesen
  wdt_reset(); // Watchdog zurücksetzen

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0, 0);

  float DeltaTP = Taupunkt_1 - Taupunkt_2;

  if (DeltaTP > (SCHALTmin + HYSTERESE))rel = true;
  if (DeltaTP < (SCHALTmin))rel = false;
  if (t1 < TEMP1_min )rel = false;
  if (t2 < TEMP2_min )rel = false;

  if (rel == true)
  {
    RELAIS_EIN; // Relais einschalten
    display.println("Fenster auf");
  } else {
    RELAIS_AUS; // Relais ausschalten
    display.println("Fenster zu");
  }

  display.setCursor(0, 15);
  display.print("Delta TP: ");
  display.print(DeltaTP);
  display.println("°C");
  wdt_reset();
  delay(4000);   // Wartezeit zwischen zwei Messungen
}

float taupunkt(float t, float r) {
  float a, b;

  if (t >= 0) {
    a = 7.5;
    b = 237.3;
  } else 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 };
}

Hi,
wie geschrieben, ich spiel bei unveränderter Verkabelung den Beispielsketch drauf und das läuft.

Hab alle Einträge mit WDT auskommentiert, hat leider nichts gebracht.

Leider auch nicht. Hab hier auch gar keine Ausgabe auf dem seriellen Monitor.

Da muss aber irgendwas faul sein, da dein Nano an der Stelle immer neu startet.
An welcher Spannung hast du das Display angeschlossen ?

Hängt mit an 5V. Gemessen sind es nur 4,6V. Das Display kann 3-5V. Sollte also gehen.
Kann natürlich sein, dass die Versorgung über USB irgendwie in die Knie geht, aber warum geht dann der Beispielsketch?

Hab mir mal die Stromaufnahme angeschaut. Liegt bei 50mA, wenn er im Setup hängt. Das wird es ja wohl auch nicht sein...
Im Beispielsketch zieht er bis zu 80mA.

Und den WDT hast du komplett weg genommen.

Fakt ist, der Nano startet im Setup nach
Serial.println(i2c_Address);
neu und das
display.begin(i2c_Address, true);
kommt nicht mehr.

Da wir deine Hardware nicht haben, kannst nur du den Fehler rausfinden.

Das ist der aktuelle Code:

// Dieser Code benötigt zwingend die folgenden Libraries:
#include <Wire.h> 
//#include <avr/wdt.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_SH110X.h>

#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1   //   QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RELAIPIN 6 // Anschluss des Lüfter-Relais

Adafruit_SHT31 sht31a = Adafruit_SHT31();
Adafruit_SHT31 sht31b = Adafruit_SHT31();

#define RELAIS_EIN LOW
#define RELAIS_AUS HIGH
bool rel;

// *******  Korrekturwerte der einzelnen Sensorwerte  *******
#define Korrektur_t_1  0 // Korrekturwert Innensensor Temperatur
#define Korrektur_t_2  0 // Korrekturwert Außensensor Temperatur
#define Korrektur_h_1  0  // Korrekturwert Innensensor Luftfeuchtigkeit
#define Korrektur_h_2  0  // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************

#define SCHALTmin   5.0 // minimaler Taupunktunterschied, bei dem das Relais schaltet
#define HYSTERESE   1.0 // Abstand von Ein- und Ausschaltpunkt
#define TEMP1_min  10.0 // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
#define TEMP2_min -10.0 // Minimale Außentemperatur, bei der die Lüftung aktiviert wird

bool fehler = true;

void setup() {

  //wdt_enable(WDTO_8S); // Watchdog timer auf 8 Sekunden stellen
  
  pinMode(RELAIPIN, OUTPUT);          // Relaispin als Output definieren
  digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
  
  Serial.begin(9600);  // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
   Serial.println(F("serial.begin"));
  delay(250); // wait for the OLED to power up
   Serial.println(F("delay250"));
   Serial.println(i2c_Address); 
  display.begin(i2c_Address, true); // Address 0x3C default
   Serial.println(F("display.begin"));
 //display.setContrast (0); // dim display
 
  display.display();
   Serial.println(F("display.display"));
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();
  
  display.setCursor(3,10);
  display.println("Teste Sensoren..");
  
  
  Serial.println("SHT31 test");
  if (! sht31a.begin(0x44)) {    // first sensor with default address
    Serial.println("Couldn't find SHT31 #1");
    while (1) delay(1);
  }
  if (! sht31b.begin(0x45)) {    // second sensor with secondary address
    Serial.println("Couldn't find SHT31 #2");
    while (1) delay(1);
   }
    Serial.println(F("Teste Sensoren.."));
}

void loop() {
  
  float t1 = sht31a.readTemperature()+Korrektur_t_1;
  float h1 = sht31a.readHumidity()+Korrektur_h_1;
  float t2 = sht31b.readTemperature()+Korrektur_t_2;
  float h2 = sht31b.readHumidity()+Korrektur_h_2;

  if (fehler == true)  // Prüfen, ob gültige Werte von den Sensoren kommen
  {
    fehler = false; 
    if (isnan(h1) || isnan(t1) || h1 > 100 || h1 < 1 || t1 < -40 || t1 > 80 )  {
      Serial.println(F("Fehler beim Auslesen vom 1. Sensor!"));
      
       display.setTextSize(2);
       display.setTextColor(SH110X_WHITE);
       display.setCursor(0,1);
       display.print("Fehler Sensor 1");
      fehler = true;
    }else {
     
      display.setTextSize(2);
      display.setTextColor(SH110X_WHITE);
      display.setCursor(0,1);
      display.print("Sensor 1 in Ordnung");
   }
  
    delay(2000);  // Zeit um das Display zu lesen
  
      if (isnan(h2) || isnan(t2) || h2 > 100 || h2 < 1 || t2 < -40 || t2  > 80)  {
        Serial.println(F("Fehler beim Auslesen vom 2. Sensor!"));
      
         display.setTextSize(2);
         display.setTextColor(SH110X_WHITE);
         display.setCursor(0,1);
         display.print("Fehler Sensor 2");
        fehler = true;
      } else {
        
         display.setTextSize(2);
         display.setTextColor(SH110X_WHITE);
         display.setCursor(0,1);
         display.print("Sensor 2 in Ordnung");
     }

    delay(2000);  // Zeit um das Display zu lesen
  }
  if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) fehler = true;
   
 if (fehler == true) {
    digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten 
   
    display.setTextSize(2);
    display.setTextColor(SH110X_WHITE);
    display.setCursor(0,3);
    display.println(F("CPU Neustart....."));
    while (1);  // Endlosschleife um das Display zu lesen und die CPU durch den Watchdog neu zu starten
 }
 //wdt_reset();  // Watchdog zurücksetzen

//**** Taupunkte errechnen********
float Taupunkt_1 = taupunkt(t1, h1);
float Taupunkt_2 = taupunkt(t2, h2);

// Werteausgabe auf Serial Monitor
  Serial.print(F("Sensor-1: " ));
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h1);                     
  Serial.print(F("%  Temperatur: "));
  Serial.print(t1);
  Serial.print(F("°C  "));
  Serial.print(F("  Taupunkt: "));
  Serial.print(Taupunkt_1);
  Serial.println(F("°C  "));

  Serial.print("Sensor-2: " );
  Serial.print(F("Luftfeuchtigkeit: "));
  Serial.print(h2);
  Serial.print(F("%  Temperatur: "));
  Serial.print(t2);
  Serial.print(F("°C "));
  Serial.print(F("   Taupunkt: "));
  Serial.print(Taupunkt_2);
  Serial.println(F("°C  "));


 Serial.println();

  // Werteausgabe auf dem I2C-Display
  

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0,0);
  display.print("Innen: ");
  display.print(t1);
  display.print("°C | ");
  display.print(h1);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_1);
  display.println("°C");
  display.print("Außen: ");
  display.print(t2);
  display.print("°C | ");
  display.print(h2);
  display.println("% rF");
  display.print("  Taupunkt: ");
  display.print(Taupunkt_2);
  display.println("°C");
    
  
delay(6000); // Zeit um das Display zu lesen
//wdt_reset(); // Watchdog zurücksetzen

  
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(0,0);

float DeltaTP = Taupunkt_1 - Taupunkt_2;

if (DeltaTP > (SCHALTmin + HYSTERESE))rel = true;
if (DeltaTP < (SCHALTmin))rel = false;
if (t1 < TEMP1_min )rel = false;
if (t2 < TEMP2_min )rel = false;

if (rel == true)
{
  digitalWrite(RELAIPIN, RELAIS_EIN); // Relais einschalten
  display.println("Fenster auf");
} else {                             
  digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
  display.println("Fenster zu");
}

 display.setCursor(0,15);
 display.print("Delta TP: ");
 display.print(DeltaTP);
 display.println("°C");

 delay(4000);   // Wartezeit zwischen zwei Messungen
 //wdt_reset();   // Watchdog zurücksetzen 
 
}

float taupunkt(float t, float r) {
  
float a, b;
  
  if (t >= 0) {
    a = 7.5;
    b = 237.3;
  } else 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 software_Reset() // Startet das Programm neu, nicht aber die Sensoren oder das LCD 
 {
   asm volatile ("  jmp 0");  
 }

Habe das Display eben mal spaßeshalber an einen original Uno gehängt. Gleiches Spiel: Beispielsketch läuft, meiner nicht.

Mit oder ohne den Sensoren ?

Habe jetzt mal den Watchdog in den Beispielsketch gefummelt und auf den Uno geladen. Funktioniert.

Am Uno ohne Sensoren

Ok, ich habe deinen geänderten Sketch Ohne Sensoren bei mir auf einen Uno geladen, mit Display und es funktioniert.
Also musst du da einen Fehler haben, den wir nicht sehen können.

Jetzt wird es kurios. Habe jetzt am Uno Display und Sensoren angeschlossen. Er bleibt an gleicher Stelle hängen, geht dann aber nicht in eine Schleife, wie der Nano-Clone. Die Einträge im seriellen Monitor kommen also nur einmal.

Die Schleife ist keine Schleife sondern ein dauernder Reset
und lies meinen letzten Beitrag

Und bei mir zeigt das Display auch was an !!

Ok, danke für die Mühe!
Dann kann es ja nur noch das Display sein. Werde mal versuchen, das auf U8G2 umzustricken. Vielleicht werde ich da was.

Ja, gerne...nur ob das mit der U8G2 besser wird ?
Zeigt er denn mit der Demo-Software etwas an ?