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

Ja, Beispielsketch geht.
U8G2 wäre halt noch ein weiteres Stochern im Nebel, habe sonst keine Idee mehr.

Hier ist mal dein Sketch ohne die Sensoren.
Teste den mal bei dir.

// 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(115200);  // 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..");
 
}

void loop() {
  
}

Das geht schonmal einen kleinen Schritt weiter, danke!
Er zeigt den Startbildschirm und bleibt dann stehen. Wenn ich den Sketch richtig deute, müsste dann ja noch eine Textausgabe folgen.


Serieller Monitor:

serial.begin
delay250
60
display.begin
display.display

Ich habe Deinen Sketch noch mit ein paar weiteren seriellen Ausgaben versehen, um zu schauen, wo er stehen bleibt: Demnach direkt vor der Zeile

display.println("Teste Sensoren..");

Und hier baust du Stück für Stück denen Sketch weiter auf.
Nicht alles auf einmal, sondern so, dass du Fehler erkennen kannst.

Nein, nicht vor der Zeile, immer die Zeile danach, macht Probleme.

Sorry, das verstehe ich nicht ganz. Wenn ich mit diesem 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(115200);  // 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);
  Serial.println(F("delay2000"));

  // Clear the buffer.
  display.clearDisplay();
    Serial.println(F("clear.display"));
  display.setCursor(3,10);
    Serial.println(F("setCursor"));
  display.println("Teste Sensoren..");
 
}

void loop() {
  
}

diese Ausgabe erzeuge:

serial.begin
delay250
60
display.begin
display.display
delay2000
clear.display
setCursor

dann hängt er doch zwischen den Zeilen

  Serial.println(F("setCursor"));

und

  display.println("Teste Sensoren..");

oder?
Ich muss leider los und kann mich erst am Sonntag wieder kümmern. Viele Dank aber schon für die bisherige Hilfe!

Nein, da wo er hängt, wird nichts mehr angezeigt.
Das letzte was funktioniert, wird noch angezeigt.
Es funktioniert ja noch.

Dein obiger Sketch funktioniert bis zum Ende.
Dann folgt die leere loop().

Da solltest du jetzt etwas einbauen.

Kleiner Hinweis. Keine Ahnung ob es ne Wirkung hat.

In den Beispiel zu der Libs wird nach den INI der Display-Buffer gelöscht.

  delay(250); // wait for the OLED to power up
  display.begin(i2c_Address, true); // Address 0x3C default
 //display.setContrast (0); // dim display
 
  display.display();
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();     // **<- Ich meine diese Zeile.  Würde ich mal Testen. !!!**

  // draw a single pixel
  display.drawPixel(10, 10, SH110X_WHITE);
  // Show the display buffer on the hardware.
  // NOTE: You _must_ call display after making any drawing commands
  // to make them visible on the display hardware!
  display.display();

Gruß

Pucki

Ja.....und ?
Das steht doch schon im Sketch drin.

Wie war das noch mit dem Lesen ?

1 Like

Es war letzte Zeit soooo schönnnn im Forum :wink:

1 Like

Aber es gibt immer welche, die einem das nicht gönnen.

Falls du mich meinst. Ich hoffe eine OP reicht. :roll_eyes:

Gruß

Pucki

Bis zum Ende des setup geht es ja gerade nicht.
" Teste Sensoren" wird vom Display ja nicht mehr ausgegeben.

Gute Besserung !

Oh...sorry. Das habe ich tatsächlich übersehen.
Dann nimmt das Display den Text nicht an.
Ich werde es später noch mal bei mir testen.

Mach das als

display.print("Teste Sensoren..");

Müsste in die Lib schauen habe lange nicht mehr mit den kleinen Oled's rumhantiert.
Jedoch habe in Erinnerung das eine Lib war empfindlich auf display.println

1 Like

Ja...das ists.

Eins verstehe nicht, da sollte doch minderst Warnung ausgegeben werden,.

Auch von mir gute Besserung!
Uwe

Ok, danke. Das probiere ich gleich Sonntag aus, wenn ich den Patienten wieder vor der Nase habe.