Externes OLED an Heltec V3 über I2C anschließen

Hallo Clemens,

nachdem ich das HaniMandl Sketch Version 0.2.9 auf dem Heltec ESP32 V3 zum Laufen bekommen habe, möchte ich gerne hier auch das größere Display mit dem I2C Protokoll anschließen. Leider sind hier die OLED Pins leider nicht wie beim Heltec V2 rausgezogen worden. Meine Idee war die GPIOs 45 und 46 zu nutzen, aber das klappt leider nicht.
Hast Du ggf. eine Idee, was ich hier machen kann? Lieben Dank!

Welches Display hast du denn? Ist das Display aktuell auf SPI oder I2C eingestellt? Als ich den thread HaniMandl: ESP32 Dev Kit statt Heltec Wifi Kit 32 erstellt habe gab es quasi keine großen mit I2C default, sondern man müsste dafür SMD-Widerstände umlöten. Ggf. macht es mehr Sinn einen ESP ohne onboard OLED statt des Heltec zu verwenden.

Es ist das dollar tec display SSD_1309. Dieses habe ich als I2C durch Ein- bzw. Auslöten von Widerständen konfiguriert. Habe das Display auch mit einem UNO getestet - läuft.

Alternativ habe ich noch ein zweites da. Das ist noch im Fabrikzustand (SPI).

Hättest du garnicht machen müssen, SPI wäre auch gegangen, hast du hier schon mal geschaut:

Sonst in der Heltec Doku schauen welche I2C Ports der V3 hat und die ausgeführte I2C-Schnittstelle verwenden.

[edit] Hast du das ungelötete Display schon getestet? Bisher habe ich nur den nicht wirklich eindeutigen Aufdruck auf dem PCB als “Doku” gesehen und im Netz werden unterschiedliche Widerstandswerte bis hin zu Lötbrücken gehandelt, würde daher erst schauen, ob das Display mit einfachem Testcode läuft.

Danke für Deine schnelle Rückmeldung. Ja, ich hatte mir schon einmal das Video vom Bienen-Bastler angeschaut und bin damrüber auf die Idee mit dem größeren Display gekommen. Die Umsetzung gestaltet sich bei der Heltec V2 auch recht einfach, da hier die Displayanschlüsse auf die PINs gezogen wurden. Das ist bei der Version 3 nicht mehr so. Eigentlich könnte man jeden freien GPIO mit SPI / I²C nutzen (PINout). Das war dann mein Ansatz:

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 21, /* clock=*/ 19, /* data=*/ 20); Ohne Erfolg. :weary:

Zu Deiner Frage. Ich habe beide Displays mit einem UNO getestet. Eins mit SPI und das andere I²C verschaltet. Beide Male erfolgreich.

Ich fische da auch im Trüben. Sind deine pins als I2C irgendwo in der Doku zu finden? Ich habe gerade nichts auf der Heltec-Seite gefunden. In der pin mapping Datei pins_arduino.h unter C:\Users\[your-user-name]\AppData\Local\Arduino15\packages\Heltec-esp32\hardware\esp32\0.0.7\variants\wifi_kit_32_V3 stehen auch lustige Angaben:

static const uint8_t SDA = 21;
static const uint8_t SCL = 22;

allerdings wird GPIO21 dann weiter unten nochmal für den reset des OLEDs vergeben: static const uint8_t RST_OLED = 21; – vermutlich copy’n’waste von Version 2. :-/

In der Doku zum Heltec V3 steht dass GPIO19 und 20 mit dem “USB socket” verbunden sind, ggf. problematisch, andere versuchen?

Eine Doku zum constructor gibt es hier: u8g2setupcpp · olikraus/u8g2 Wiki · GitHub ggf. HW durch SW tauschen (selbst wenn es funktionieren würde, hätten wir das slow down-Problem)? Einmal F_2ND_HW probieren?

Vielleicht helfen Euch jene Tickets, inkl. entsprechender Diskussionen und Patches weiter?

Sind diese Werte [1] aus dem Patch Update pins_arduino.h · mellowmunki/arduino-esp32@647320e · GitHub vielleicht besser?

static const uint8_t LED_BUILTIN = 35; // was 25
static const uint8_t SDA = 36; //was 21
static const uint8_t SCL = 18; //was 22

static const uint8_t SS = 8; //was 5
static const uint8_t MOSI = 10; //was 23
static const uint8_t MISO = 11; //was 19
static const uint8_t SCK = 9; //was 18

static const uint8_t Vext = 36; //was 21
static const uint8_t LED = 35; //was 25
static const uint8_t RST_OLED = 21; // was 16

  1. Kopiert aus der zitierten Quelle – ohne Gewähr hinsichtlich Funktionalität oder Schäden. ↩︎

Ne, das ist auch Quatsch! Einige passen, anderer sind gar nicht ausgeführt. Nicht noch mehr Verwirrung … :-)

Gut, dann warten wir mal besser auf die nächste Version Arduino Core 2.0.7 oder höher.

Guten Abend,

Danke für die zahlreichen Hinweise. Mit dem folgendem Sketch habe ich versucht, über die Bibliothek Wire.h beide OLED Displays mit dem I2C Bus anzusprechen.

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2_1(U8G2_R0, /* reset=*/ 21, /* clock=*/ 18, /* data=*/ 17);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2_2(U8G2_R0, /* reset=*/ 21, /* clock=*/ 42, /* data=*/ 45);


void setup(void) {
    u8g2_2.setI2CAddress(0x3C * 2);
  u8g2_2.begin();
  u8g2_2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2_2.clearDisplay();
    u8g2_1.setI2CAddress(0x3D * 2);
  u8g2_1.begin();
  u8g2_1.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2_1.clearDisplay();
  delay(5000);  
}

void loop(void) {
  u8g2_1.clearDisplay();
  u8g2_1.clearBuffer();          // clear the internal memory
  u8g2_1.drawStr(10,20,"Display klein");  // write something to the internal memory
  u8g2_1.sendBuffer();          // transfer internal memory to the display

  
  u8g2_2.clearDisplay();
  u8g2_2.clearBuffer();          // clear the internal memory
  u8g2_2.drawStr(20,20,"Display gross!");  // write something to the internal memory
  u8g2_2.sendBuffer();          // transfer internal memory to the display
  delay(1000);  
}

Leider bleiben beide Displays noch dunkel… :weary:
Das Ganze zielt jetzt auf die Nutzung eines I2C Busses.

Hab’ die Tage schon mal nach einem OLED mit I2C bei mir gesucht aber nur welche mit SPI voreingestellt gefunden. Heute ist mir noch eingefallen, dass mein CurrentRanger ja auch ein OLED hat und das auch mit I2C läuft, also abmontiert und an den Heltec angeschlossen. Läuft als “second screen”! :-)

#include <Arduino.h>
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2_1(U8G2_R0, /* clock=*/ 26, /* data=*/ 48);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2_2(U8G2_R0, /* reset=*/ 21, /* clock=*/ 18, /* data=*/ 17);

void setup(void) {
  u8g2_1.begin();
  u8g2_2.begin();
}

void loop(void) {
  u8g2_1.clearBuffer();					// clear the internal memory
  u8g2_1.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
  u8g2_1.drawStr(0,10,"Hello World! - extern");	// write something to the internal memory
  u8g2_1.sendBuffer();					// transfer internal memory to the display

  u8g2_2.clearBuffer();          // clear the internal memory
  u8g2_2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  u8g2_2.drawStr(0,10,"Hello World! - onboard");  // write something to the internal memory
  u8g2_2.sendBuffer();          // transfer internal memory to the display

  delay(1000);  
}

Wie gesagt kursieren einige Anleitungen für die “Umlötung” der DollarTec-Displays von SPI zu I2C, ggf. ist jetzt bei dir auch ein Widerstand zu stark / zu schwach und daher will es nicht am Heltec, versuche gerne mal den code oben, ist das Standard-Beispiel aus der U8g2 lib erweitert auf 2 displays.

Jetzt müsstest du nur noch herausfinden, wie wir das SW-Display auf HW umstellen können, ich denke mit SW wird der Bildaufbau zu langsam sein und bremst so die Waage aus.

1 Like

Hallo Clemens,
erst einmal vielen Dank für Deine Unterstützung. Da mir das Thema Display keine Ruhe gelassen hat, habe ich die Schaltung von Freddy mit dem ESP32 WROOM aufgebaut, Das Display - umgebaut auf I2C - funktioniert, jedoch blinkt es, was sehr nervt. Das Phänomen ist leider unabhängig vom verwendeten Sketch. Habe jetzt auch ein weiteres mod. Display angehangen. Gleiches Spiel… Zum Thema Widerstände. Ich habe hier jeweils 4K7 eingelötet.

Habe gerade Deinen Sketch gestartet. Hier zeigt sich leider wieder selbiges Bild, Das onboard Display läuft und das große Display hüllt sich in Schweigen. Mache für heute erst einmal Schluss…

Damals habe ich keine Doku zum OLED gefunden, ist hier jetzt auch ein anderes, aber vielleicht hilft es weiter:

https://www.diymore.cc/collections/display-module/products/2-42-inch-12864-oled-display-module-iic-i2c-spi-serial-for-arduino-c51-stm32-green-white-blue-yellow

As for IIC communication, it is necessary to move the resistor on R4 to R3, and R5 is soldered with 0 ohm resistor.

Vielleicht sind 4k7 auf allen Positionen zu viel …

Guten Morgen, da brat mir doch einer einen Storch. Plötzlich läuft das zweite Display - ohne Flackern. Fehleranalyse hat ergeben, wird der Laptop vom Netz getrennt und erreicht einen gewissen Ladestand, reicht die Betriebsspannung nicht mehr für das große Display.

20230205_082735

Der Tag startet nicht nur sonnig, sondern auch sehr erfolgreich. Sketch modifiziert, onboard Display am Heltec ausgeschaltet und nur das externe im Betrieb. :grinning: Danke Clemens!!!

20230205_083540

2 Likes

Das externe display läuft jetzt mit HW oder SW im constructor? Falls SW, stelle im code den debug level einmal auf 4 ein und schaue welche round trip time dann im Seriellen Monitor angezeigt wir. Wenns, wie bei mir mit dem onboard, 600 ms sind wird es vermutlich nichts mit einer präzisen, sprich kontinuierlich schnellen Messung während des Abfüllens und wir müssen schauen, wie und auf welche HW Pina wir umstellen können.

Ja, es läuft mit SW im constructor.

Wo genau stelle ich den debug level ein?

Einfach den Kommentar-Syntax // rausnehmen, ggf. zu 4 ändern wenn du den master branch hast.

So, anbei der Auszug aus dem SerMon

image

Reicht Dir das, oder brauchst Du mehr Infos?

Leider, wie befürchtet, zu langsam, dein code braucht mit SW-Ansprache über die U8g2

Dauer 515

also 515 ms, etwas besser als die bei mir gemessenen 630 ms mit SW und onboard OLED, aber lange nicht im Bereich der 180 ms, die wir mit dem alten board oder mit der HW-Initialisierung bei der V3 und onboard OLED haben, siehe Kann ich auch das Heltec "WiFi Kit 32" in der neuen Version V3 verwenden? - #39 by clemens

Das Problem ist, der Honig läuft kontinuierlich aus dem Hahn und der HaniMandl regelt nur wenn er einen Messwert hat. Bei einer halben Sekunde kann schon einiges an Honig im Glas sein bevor der Servo die Möglichkeit hat zu reagieren. “Normal” misst der HaniMandl 5x in der Sekunde, deiner nur 2x in der Sekunde. Das wird vermutlich auf die Genauigkeit gehen. Wir sollten also auch hier nochmal ran …

2 Likes