OLED Anbindung funktioniert nicht richtig

Hallo zusammen,

ich habe mir überlegt was für mein ESP32 Projekt am Besten wäre, um später im Standalone Betrieb als Interface zu dienen. Ich habe zuerst an einen Variante mit Webserver gedacht. Allerdings erscheint mir dafür der Programmieraufwand relativ hoch für das Ergebnis.

Zum Anderen habe ich hier noch OLED 128x64 rumfliegen. Die habe ich noch nicht benutzt also habe ich mal eins eingebunden. Das hat auf anhieb auch funktioniert.

Ich habe diese an GIPO 21, 22 angeschlossen und es wurde auch bereits Text angezeigt.

ALLERDINGS:

Das passiert leider nicht immer. Oft bleibt das OLED auch einfach schwarz. Obwohl es der gleiche Sketch ist, oder ich den Controller resette. Es scheint sich dann nicht mehr zu initialisieren. Ich frage mich nur wieso... Auch Beispielsweise den Text der normalerweise über den seriellen Monitor läuft auf dem Display wiederzugeben funktioniert aktuell bei mir noch nicht. Da müsste mir bitte einer mal helfen, wo jetzt das Problem liegen könnte...

Ich habe dieses Script in mein Projekt mit eingebunden.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  // Display static text
  display.println("Hello, world!");
  display.display(); 
  Serial.println("OLED Inizialisiert");
  delay(2000);
}

void loop() {
  
}

// Address 0x3D for 128x64 habe ich auch schon ausprobiert... keine Änderung.

Ich vermute, es fehlt das

Wire.begin();

im Setup. Evtl. sogar mit den Pin-Angaben die du verwendest.
Ob es tatsächlich daran liegt, kann ich nicht sicher sagen, da ich den Oled-Treiber nicht habe.

Kennst Du die Seiten von Fips, die machen es einem recht einfach. Eventuell hilfreich meine Anleitung: Einführung zu fipsok.de.

Das kann eigentlich nicht am Programm liegen. Bei meinen Projekten habe ich fast immer ein OLED angeschlossen. Allerdings haben die OLEDs mit I²C-Schnittstelle keinen Reset-Pin. Ist das Display "verwirrt", hilft eventuell Aus-Ein-Schalten.

Ich möchte Dir zu dieser Bibliothek raten:

Mit #define DEBUG OLED im Haupttab des ESP32-Programms verwende ich diese Funktion zur Anzeige:

#if defined(DEBUG) && (DEBUG == OLED)
#include <Wire.h>
#include <U8g2lib.h>

//U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);
#endif

void setup_OLED() {
#if defined(DEBUG) && (DEBUG == OLED)
  oled.begin();
#endif
}

void anzeigeOLED(const char * text) {
#if defined(DEBUG) && (DEBUG == OLED)
  const byte ZEILEMAX = 8;
  const byte SPALTEMAX = 22;
  static char buf[ZEILEMAX][SPALTEMAX] = {" ", " ", " ", " ", " ", " ", " ", " "};
  oled.clearBuffer();              // clear the internal memory
  oled.setFont(u8g2_font_6x12_tr); // choose a suitable font
  for (byte zeile = 0; zeile < ZEILEMAX; zeile++) {
    oled.setCursor(0, ((zeile + 1) * 8) - 1);
    for (byte spalte = 0; spalte < (SPALTEMAX - 1); spalte++) {
      if (zeile < (ZEILEMAX - 1)) {
        buf[zeile][spalte] = buf[zeile + 1][spalte];
        if (buf[zeile][spalte] == '\0') {
          break;
        }
      } else {
        buf[zeile][spalte] = text[spalte];
        buf[zeile][spalte + 1] = '\0';
        if (buf[zeile][spalte] == '\0') {
          break;
        }
      }
      oled.print(buf[zeile][spalte]);
    }
  }
  oled.sendBuffer();          // transfer internal memory to the display
#endif
}

Schieb mal ein

  display.display();

bzw. geht denn das Beispiel aus der SSD1306-Lib?

Danke zunächst für den Tipp mit dem WebServer. Ich schaue mir den Post auf jeden Fall bei Zeiten an.

Des weiteren habe ich es mit dem Wire.begin(); im Setup Teil mal ausprobiert. Das funktionierte nach dem compilen einmal kurz. Danach nicht mehr.

Es ist so wie ich sage. Das ist wirklich sporadisch. Mal taucht text auf mal nicht.

Meine Anschlussmöglichkeiten sind nur VCC / GND / SCL / SDA

Ja, möglich das irgendwo noch die Pin Belegung fehlt. Aber komisch das trotzdem der Text mal auftaucht und mal wieder nicht. Ich denke das müsste in der Wire.h irgendwo geregelt sein? Ist nur eine Vermutung.

Vermutlich hast du in deinem Aufbau ein Hardwareproblem bzw. Wackelkontakt. Prüfe mal alle deine Kabel und Steckverbindungen.
Wenn es einmal kurz funktioniert, wird es kein Programmfehler sein.

Wie betreibst du dein Projekt mit Spannung ?

Naja ist alles mit den üblichen schönen bunten Pin Steckverbindungen gesteckt. Habe ich soweit alles kontrolliert. Sollte so passen. Vielleicht ein defektes Display?

Aktuell ist der ESP32 an ein USB Hub mit externer Stromversorgung angeschlossen. Ich habe auch schon gedacht das es die Stromversorgung ist. Da müssten 1,5A drauf möglich sein. Ich habe auch 3 Slots die 2,5A liefern. Hat aber am Problem auch nichts geändert.

Die Spannung wird vom Board auf ein Steckboard weitergeleitet. Also ich nutze die Spannung von den Pins vom ESP32 direkt.

AHA...

Aber ich glaube deine Vermutung mit dem Wackelkontakt scheint sich zu bestätigen. Jedenfalls liegt das Display grade so, das die Schrift dauerhaft angezeigt wird. wenn ich das Display jetzt bewege, verschwindet der Text... Auch dauerhaft.

Ich tippe auf Wackelkontakt oder kalte Lötstelle. Manche meiner Kabel hatten auch schon einen Kabelbruch, seitdem messe ich alle nach Kauf durch.

Na dann bist du dem Problem ja schon näher gekommen.
Vorsichtig alles Abtasten und das mit der kalten Lötstellen wurde ja auch schon geschrieben.

Ja... Ist wohl ein Wackler. Irgendwo... Ich kann nicht genau bestimmen wo muss ich wohl die Kabel tauschen. Komisch nur, das ein reset erforderlich ist, bis erneut wieder etwas auf dem Display auftaucht, nachdem der Kontakt abgebrochen wurde.

Es kann auch an I²C liegen, der Bus ist nicht sooo resistent gegen Fehler.

Dann tausche ich später mal die Kabel aus und würde dann nochmal schreiben, ob das Besserung gebracht hat.

Noch eine Frage. Im obrigen Beispiel ist der Text nur im Setup an das Display übergeben.

Wie kann ich im Loop weiteren Text übergeben? Welche Parameter sind mindestens notwendig, damit das Display mit Text ausgibt. Und wie verhält sich der Command ```
display.setCursor(0, 10);

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  Serial.println("OLED Inizialisiert");
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  // Display static text
  display.println("Hello, world!");
  display.display(); 
  delay(2000);
}

void loop() {
  display.clearDisplay();
  display.setCursor(0, 10);
  display.print("Millis: ");
  display.println(millis());
  display.display(); 
  delay(1000);
}

Damit setzt du die Anfangsposition des Textes.
Probiere einfach mal etwas mit den Zahlen.

  1. Zahl für die Spalte, 2.Zahl für die Reihe.

Alles klar war wirklich ein Kabelbruch oder sowas. Geht auf jeden Fall jetzt! =)

Wie überschreibe ich denn Text? Oder wie sorge ich dafür, das Text an der gleichen Stelle überschrieben wird? Wenn ich Beispielsweise den Cursor an die gleiche Stelle setze und anderen Text überschreibe, wird da kauderwelsch draus. Ist der Text übereinander.

Das ist wie bei allen anderen Displays die selbe Verfahrensweise.
Entweder die komplette Zeile (nicht das Display(!)) löschen und neu schreiben.
Oder die Werte genau auf eine feste Länge begrenzen und nur den Bereich den die Länge belegt neu schreiben - mit auffüllen von Leerzeichen / 0len.

Eine bessere Bibliothek verwenden, siehe #3!

Ich unterstütze die Info von agmue.
Andere Libraries sind deutlich leistungsfähiger. Da kannst du neuen Text direkt reinschreiben.

Danke, werde ich mir morgen mal ansehen und versuchen einzubinden.