OLED Display zeigt nichts an

Hallo,
ich bastel mir einen Datenlogger mit dem ich die Daten auf eine SD-Karte schreiben kann. Außerdem möchte ich zu Kontrollzwecken die aktuellen Daten auf einem 0,96" Oled Display anzeigen. Den Testaufbau habe ich zunächst mit einem Arduino Uno, DHT22, einem SD-Card Reader, RTC-Modul und LCD-Display mit I2C-Adapter erstellt. Hierbei funktioniert alles sehr gut. Für das RTC-Modul habe ich zusätzlich einen Levelconverter TXS0108E verwendet, weil das RTC-Modul mit 3,3 V arbeitet und das Display mit 5V und beide über die I2C-Schnittstelle verbunden sind. Leider bekomme ich keine Anzeige auf dem OLED-Display. Das Display ist funktionsfähig, hab ich mit dem Bespiel aus der Bibliothek getestet. Nach nunmehr 2 Tagen try and errror weis ich nicht mehr weiter. Ich hoffe auf Eure Unterstützung.
Hier der Code:

```cpp
// Arduino data logger with SD card and DHT22 humidity and temperature sensor

#include <Wire.h>  
#include <SPI.h>               // Include SPI library (needed for the SD card)
#include <SD.h>                // Include SD library
#include <DHT.h>               // Include DHT sensor library
#include <Time.h>              // bei Verwendung eines RTC Modul
#include <RTClib.h>            // Adafruit RTClib.h
#include <Adafruit_SSD1306.h>  // OLED Display

File dataFile;
RTC_DS1307 rtc;

// OLED 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET  -1   
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ###### DHT22 ##########
#define DHTPIN 5            // DHT22 data pin is connected to Arduino pin 5
#define DHTTYPE DHT22       // DHT22 sensor is used
DHT dht(DHTPIN, DHTTYPE);   // Initialize DHT library

// Für OLED ###############
  int i = 0;
  int x_pos = 5;
  int y_pos = 20;
  char zeile_1[18] = "Temp   C :";
  char zeile_2[18] = "Feuchte % :";
//#######################

unsigned long previousMillis = 0; 
const long interval = 20000; //kurzes Intervall z.Zt. für Testzwecke eigestellt
int z = 1;  // Zähler für Zeile1-2 schreiben setzen

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.display(); 
  display .clearDisplay();  
//##########################################################################
  //Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect. Needed for native USB port only
  Serial.print("Initializing SD card...");
  if (!SD.begin()) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  Serial.println("Test12345");
  delay(2000);

 //#############################################
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
  }  
//##################################################
  dht.begin();
//################# Für OLED #############################
  delay(1000);                                        
  display.clearDisplay();
  display.drawRect(0,0,128,64,WHITE);
  display.display();  
} // ENDE Setup
//##########################################################################
void Zeile1_schreiben() {
  display.drawRect(0, 0, 128, 64, WHITE);  // Rechteck zeichnen
  display.display();

  //Zeile 1 schreiben
  i = 0;
  x_pos = 5;

  while (i < 12) {
    y_pos = 10;
    Serial.print("x_pos Temp = ");
    Serial.println(x_pos);
    display.drawChar(x_pos, y_pos, zeile_1[i], WHITE, BLACK, 2);
    display.display();
    i++;
    x_pos = x_pos + 12;
  }
  display.drawRect(0, 0, 128, 64, WHITE);
  display.display();
}

void Zeile2_schreiben() {
  display.drawRect(0, 0, 128, 64, WHITE);  // Rechteck zeichnen
  display.display();
  // Zeile 3 schreiben
  i = 0;
  x_pos = 5;

  while (i < 11) {
    y_pos = 10;
    display.drawChar(x_pos, y_pos, zeile_2[i], WHITE, BLACK, 2);
    display.display();
    i++;
    x_pos = x_pos + 11;
  }
}
//##############################################################
uint16_t line = 1;
  
void loop() {

DateTime time = rtc.now();
unsigned long currentMillis = millis();
  // Read humidity
  byte RH = dht.readHumidity();
  //Read temperature in degree Celsius
  byte Temp = dht.readTemperature();
if (currentMillis - previousMillis >= interval)
{ 
    previousMillis = currentMillis; 
   
  dataFile = SD.open("DHT22Log.txt", FILE_WRITE);  
// SD.open(time.timestamp(DateTime::TIMESTAMP_FULL)+"DHT22Log.txt", FILE_WRITE)
  
// if the file opened okay, write to it:
  if (dataFile) 
  {
    Serial.print(line);    
    Serial.print(":    Temperature = ");
    Serial.print(Temp);
    Serial.print("°C,    Humidity = ");
    Serial.print(RH);
    Serial.print("%  ");
//######## Write data to SD card file (DHT11Log.txt) ##########
DateTime now = rtc.now();
 Serial.print(now.year(), DEC);
 Serial.print('/');
 Serial.print(now.month(), DEC);
 Serial.print('/');
 Serial.print(now.day(), DEC);
 Serial.print("  ");
 Serial.print(now.hour(), DEC);
 Serial.print(':');
 Serial.println(now.minute(), DEC);
//###################################################
   dataFile.print(line++);
    dataFile.print("  Temp = ");
    dataFile.print(Temp);
    dataFile.print("°C    Feuchte = ");
    dataFile.print(RH);
    dataFile.print("%  ");
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.print("  ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    dataFile.println(now.minute(), DEC);   
    dataFile.close(); 
  }
  // if the file didn't open, print an error:
  else
    Serial.println("error opening DHT22Log.txt");
}
// für OLED ###################################
   // Hilfsvariablen für das OLED initialisieren
    int i = 0;
    int x_pos = 0;
    int y_pos = 0;
// Temperatur in OLED schreiben    
  if (z == 1) {
    Zeile1_schreiben();
      y_pos = 35;
      display.drawChar(x_pos,y_pos,Temp,WHITE,BLACK,2);
      display.display();
      x_pos = x_pos + 6;
      delay(5000);
      display.clearDisplay();
      z = z+1 ;
  } 
// Luftfeuchte in OLED schreiben
       
  if (z == 2) {
    Zeile2_schreiben();
      y_pos = 30;
      display.drawChar(x_pos,y_pos,RH,WHITE,BLACK,2);
      display.display();
      x_pos = x_pos + 6;
      delay(5000);
      display.clearDisplay();
      z = 1 ;
  }    
   delay(2000);

//##############################################

}

Und die Schaltung:

Da der Uno auch auf I2C mit 5 Volt arbeitet, ist das nicht sinnvoll.
Was für eine RTC verwendest du ? Bitte Link posten.
Alle RTC die ich bisher kenne, kommen auch mit 5Volt zurecht.
Den Level-Converter am Oled kannst du dir vermutlich sparen.

Und wie die Schaltung aussieht, verwendest du den Levelshifter nicht für das Oled, sondern für das RTC. Das solltest du mal prüfen.

Den Levelshifter verwende ich für den RTC, weil ja das OLED wie der Uno mit 5V arbeiten, der RTC aber laut Datenblatt mit 3,3V. Ich habe den RTC zunächst auch direkt an 5V betrieben, weil ich übersehen hatte, dass er eigentlich 3,3V braucht. Aber auch dabei ging das Display nicht.
Ich verwende dieses RTC-Modul:
https://www.az-delivery.de/products/ds3231-real-time-clock

Dann solltest du das im Text oben richtig stellen, da steht es anders.
Und das von dir verwendete RTC verwende ich direkt an 5 Volt, das funktioniert.
Zumindest die Datenleitungen (I2C) kannst du an 5 Volt betreiben, also ohne Levelshifter.
Das dein Oled nicht funktioniert, liegt vermutlich an der Verdrahtung.
Zeig mal ein Foto des Aufbaus.

Edit:
Mir ist grad aufgefallen, du hast vermutlich dein Oled falsch angeschlossen und SDA bzw. SCL vertauscht. Bei meinen 0,96" Oled (SSD1306) sind die I2C-Pins genau anders herum.

Das OLED ist korrekt angeschlossen, hier der Testaufbau:

im seriellen Monitor ist zu sehen, ständig die Meldung "Initializing SD card...initialization done" anzeigt wird.

initialisierung
Ich hab nicht herausgefunden, warum.

Dein Sketch kompiliert nicht wegen

Dann schalte die Warnungen ein:DATEI - VOREINSTELLUNGEN - AUSFÜHRLICHE AUSGABE WÄHREND [x] Kompilierung und COMPILER-WARNUNGEN: Alle

Und dann behebe die Probleme, die während des Compilieren unten angezeigt werden.
Und so wie es aussieht schmiert das ab, wenn die RTC initialisiert wird.

Und warum schickst du uns mit einer falschen Textinfo und einem falschen Schaltbild in eine verkehrte Richtung. Das solltest du auch mal berichtigen. Oder möchtest du, das andere auch diese Fehler machen ?

ich kann deinen Sketch nicht testen, da mir die Libraries fehlen.
Allerdings wie schon geschrieben wurde, da sind Fehler drin:

 if (z = 1) {
.....
if (z = 2) {

Sollte sicher heißen:

 if (z == 1) {
.....
if (z == 2) {

Ich schicke niemanden in eine falsche Richtung, damit unterstellst du mir Vorsatz :angry:
Wenn ich perfekt wäre brauchte ich Eure Hilfe nicht !
Das erste Schaltbild ist genau das, welches ich zu diesem Zeitpunkt aufgebaut hatte (passt auch zum Text). Ich hab dann auf Grund deiner Rückmeldung, dass alles mit 5V laufen kann und der Logigshifter entfallen kann , umgebaut.
OK, das mit Z=1 muß ja z==1; entsprechend bei z == 2 lauten, hab ich korrigiert. Aber es hat sich nichts geändert, weil das Programm nicht soweit läuft. Hab hinter dem Aufruf von RTC noch mal eine serielle Ausgabe vor dht.begin eingefügt, die auch ausgegeben wird, danach kommt keine serielle Ausgabe mehr. Also läuft das Programm nur bis dht.begin. Aber warum?

Nein, ganz sicher nicht.
Denn du hast auf dem Schaltbild, wie schon geschrieben, SDA und SCL am Oled vertauscht.
Und im Text schreibst du, du verwendest den Levelconverter für das Oled, was dann im Schaltbild auch nicht stimmt. Da ist er an der RTC angeschlossen.
Also bitte das berichtigen, damit andere diesen Fehler nicht machen.

Und da ich dich nicht kenne, kann ich das nicht beurteilen.

Weil du den nicht oder falsch angeschlossen hast.

Aber der eigentliche Fehler wurde dir schon genannt.
Das solltest du nicht einfach ignorieren.

Ok, die Berichtigungen sind gemacht, Fehler werden beim Kompilieren nicht mehr angezeigt.
Der DHT22 ist korrekt angeschlossen, genau so wie er angeschlossen ist läuft das Programm mit einem LCD-Display problemlos . D.h. ich habe im Prinzip das gleiche Programm nochmal für die Ausgabe auf einem LCD-Display erstellt. Nur bei der OLED-Version komme ich nicht weiter.

Wenn alles Funktioniert hat, erstmal Beispiele aus der Lib für den Display einspielen.
Die kleine Biester sind schon ziemlich zickig.

Ich habe das Display (0,96") mit Beispielen aus der Lib getestet, auch ein 1,3" Oled, beide haben funktioniert.

Dann solltest du mit einem funktionierenden Beispiel des Oled arbeiten und deinen übrigen Sketch Stück für Stüch da hinein bauen.
Und wichtig, zwischendurch immer prüfen, obs noch funktioniert.
So solltest du damit klar kommen.

In Post #6 hast du einen Hinweis bekommen, hast du das geprüft.
Zum testen mal die RTC komplett aus kommentieren.

siehe Post #8 !
....Hab hinter dem Aufruf von RTC noch mal eine serielle Ausgabe vor dht.begin eingefügt, die auch ausgegeben wird, danach kommt keine serielle Ausgabe mehr.

Das heißt, dass die Initialisierung von RTC noch funktionieren sollte..

Mit der Programmzusammenstellung hab ich es umgekehrt gemacht, den gut laufenden Sketch mit dem LCD-Display genommen (da funktionierten SD-Card,DHT22,RTC) , dann LCD-Komponenten herausgelöscht und OLED eingebaut.

Ich schreib das Programm jetzt nochmal Stück für Stück neu, mal sehen was geht. Kann etwas dauern, dann melde ich mich wieder mit dem Ergebnis.

Den seriellen Ausdruck hast du uns doch in Post #5 gezeigt.
Da sieht es aus, das die Ausgabe sich wiederholt, also der Controller resettet wird, weil mit der RTC ein Fehler ist.
Warum nimmst du die RTC wie schon geschrieben nicht mal raus aus dem Sketch.

Das hast du uns allerdings nicht gezeigt, nur die Wiederholung in Post #5.
Demnach muss es am Sensor liegen.

Also das ist ein ziemliches Durcheinander, ich komme da nicht mehr mit.
Du solltest mal eindeutige Angaben machen und korrekte Ausdrucke zeigen.
So geht es nicht.

Hallo,
hast Du schon mal einen i2c Scanner laufen lassen, um zu sehen ob beide Teile gefunden werden. Ich hab jetzt auf Anhieb das hier noch nicht gefunden.Dann alle Teile einzeln mit den Beispielen aus den Libs und der kompletten Hardware testen.
Heinz

Hallo,
ich habe jetzt nochmal Schritt für Schritt das Programm mit den Bauteilen getestet.
Ergebnis:
Das OLED-Display läuft mit dem DHT22 und dem RTC-Modul problemlos.
Auch kann das SD-Model hardwaremäßig angeschlossen werden. Sobald allerdings die Library SD.h eingebunden wird, geht nichts mehr.
Bei meinen Recherchen im Netz zu diesem Thema bin ich an einigen Stellen auch auf das Problem gestoßen, dass sich am Arduino SPI und I2C-Bauteile nicht immer vertragen. Einen Grund dafür habe ich nicht gefunden und daher auch noch keine Lösung. Bis hier erstmal danke für Eure Beiträge, ich werde weiter versuchen für das Problem eine Lösung zu finden.
Gruß wAlter

Wie genau meinst du das ?
Ich habe am Arduino schon I2C unc SPI Module gleichzeitig betrieben und kein Probleme festgestellt. Da solltest du mal genauer drauf eingehen.

Bin ich Blind oder fehlt wirklich die Initialisierung für den Reader

const int chipSelect = 4;

Richtigen Pin Bitte eintragen
Noch was

 if (!SD.begin(chipSelect)) {

Ich habe es so verstanden, das ich "chipSelect" nur verwenden muß , wenn ich z.B. am Arduino Uno nicht den Standart-Pin 10 verwende. Außerdem hat der Skletch ohne "chipSelect" mit dem LCD-Display funktioniert und die SD-Card wurde auch initialisiert.