I2C @ TCA9548A @ D1 Mini ESP8266 @ SSD1306 [128×64]

Hallo, ich habe mir einen TCA9548A I2C Multiplexer gekauft, um darüber von einem Wemos D1 Mini ESP8266 auf 6 x OLED Display SSD1306 128×64 zu muxen. Mit der recht einfachen Anleitung von https://www.instructables.com/id/Arduino-on-I2c-Multiplexer-Tca9548a-1 gelingt das auch soweit, leider jedoch nur mit der Auflösung 128x32 in der Adafruit_SSD1306.h. Bei der "richtigen" Auflösung friert der Sketch ein. Ich finde leider dazu keine Lösung. Gibt es vielleicht aus dem Forum dazu einen Hinweis? Ich würde mich sehr freuen :slight_smile:

Formidabel:
.....
Gibt es vielleicht aus dem Forum dazu einen Hinweis? Ich würde mich sehr freuen :slight_smile:

Na klar.
In Zeile 72 fehlt die Anweisung

noFrost=true;

... 42 ... so kann Das Nichts werden ...

Was die Kollegen etwas umständlich durch die Blume sagen möchten ist, Wie sollen wir das wissen wenn Du uns keine Infos bezüglich Sketch gibst.
Grüße Uwe

HotSystems:

noFrost=true;

:smiley: :smiley:

uwefed:
Was die Kollegen etwas umständlich durch die Blume sagen möchten ist, Wie sollen wir das wissen wenn Du uns keine Infos bezüglich Sketch gibst.
Grüße Uwe

Und das Hauptproblem ist:

Aus Datenschutzgründen "DSGVO" funktioniert leider meine Glaskugel nicht mehr, somit kann ich nicht sehen was der TO macht.

Die Info bezüglich des Sketches steckte natürlich im Link zur Anleitung aber in der Tat (danke für die zarten Hinweise) ist es selbstverständlich besser und auch höflicher, wenn ich einen entsprechenden Pastebin-Link setze :slight_smile:

https://pastebin.com/raw/fjrp97na

Und gleich noch mal als RAW:

/**
*  TCA9548A I2c Multiplexer Sketch voor 4 OLED display's
*  Basis sketch E.Heideveld 14-12-2018
*  For more info see
*  www.bertheideveld.eu
*  
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_Address 0x3C
Adafruit_SSD1306 oled(1);
#include "Wire.h"
#define TCAADDR 0x70

void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission(); 
}

void setup()
{
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
Wire.begin();
                    //Clear all the display's
tcaselect(0);
oled.begin();
oled.clearDisplay();
oled.display();
tcaselect(1);
oled.begin();
oled.clearDisplay();
oled.display();
tcaselect(2);
oled.begin();
oled.clearDisplay();
oled.display();
tcaselect(3);
oled.begin();
oled.clearDisplay();
oled.display();

tcaselect(0);                 // Display a start text.
oled.begin();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(20,0);
oled.println("4 Oled");
oled.setCursor(5,16);
oled.println("Display test.");
oled.display();

delay(3000);

}

void loop() 
{

tcaselect(0); // Text to Oled display 0
oled.begin();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(10,0);
oled.println("Display 0.");
oled.setCursor(4,11);
oled.println("Hello ");
oled.display();

tcaselect(1);//Text to Oled display 1
oled.begin();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.println("Display 1.");
oled.setCursor(18,16);
oled.println("WORLD!");
oled.display();

tcaselect(2);//Text to Oled display 2
oled.begin();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.println("Display 2.");
oled.setCursor(0,19);
oled.println("Knock");
oled.display();

tcaselect(3);//Text to Oled display 3
oled.begin();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.println("Display 3.");
oled.setTextSize(2); 
oled.setCursor(0,16);
oled.println("KNOCK!");
oled.setTextSize(1);
oled.display();
delay(10000); // Wait 10 sec.
}

Pastebin interessiert keinen.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Besten Dank für den Hinweis @ Tommy56. Done :slight_smile:

Schau mal in Deine Adafruit_SSD1306.h Zeile 27 ff.
Da musst Du etwas umkommentieren.

Gruß Tommy

Genau @ Adafruit_SSD1306.h - konkret definiert man dort die Auflösung: #define SSD1306_128_64

Und genau da geht das Problem los. Flashe ich den Sketch mit der #define SSD1306_128_32 läuft alles bestens. Flashe ich ihn mit der #define SSD1306_128_64 crashen die Displays. Der Sketch läuft weiter (die eingebauten Kontrollausgaben im Seriellen Monitor verraten mir das).

Hinweis: Ohne Umweg über den Muxer (wenn ich ein Display einzeln ansteuer mit einem anderen Testsketch) liefern sie die korrekte Auflösung von 128x64 ganz sauber.

Hast Du mal probiert nur 1 Display über den Multiplexer anzusteuern? Wie verhält es sich dann?

Evtl. mal ein kurzes delay vor der Ansteuerung. Nur als Test.

Gruß Tommy

Leider keine Besserung mit nur einem Kanal. Auch ein Delay(500) vor und nach der Channelauswahl
bzw ein yield() bringt nix. Busfrequenz habe ich auch schon geändert. Ebenfalls kein Erfolg.

Dann habe ich keine Idee mehr.

Gruß Tommy

Trotzdem besten Dank @ Thommy56 :slight_smile:

Formidabel:
Genau @ Adafruit_SSD1306.h - konkret definiert man dort die Auflösung: #define SSD1306_128_64

Und genau da geht das Problem los. Flashe ich den Sketch mit der #define SSD1306_128_32 läuft alles bestens. Flashe ich ihn mit der #define SSD1306_128_64 crashen die Displays. Der Sketch läuft weiter (die eingebauten Kontrollausgaben im Seriellen Monitor verraten mir das).

Dann geh mal Systematisch bei der Fehlersuche vor.
Z.B.:

wie äußert sich der crash der Displays? Was passiert genau? Weiter oben schreibst du "es friert der Sketch" ein. An welcher Stelle genau? Wie weit kommt der Sketch, wo kommt er nicht mehr hin?

Was siehst du im Seriellen Monitor ?- denn in deinem Sketch ist keine Ausgabe auf die Serielle.

Was steht im Datenblatt des TCA9548A bezüglich Zeitverhalten? Gibt es Wartezeite zu beachten, wie lange dauert das Umschalten? Richtig beschaltet? Link auf das Datenblatt?

Wodurch unterscheidet sich ein 32pixel Display vom 64pixel Display? Mach eine Codeanalyse der Library, was alles die Lib in diesem Fall anderes rausschickt.

Poste deinen Schaltplan und ein Echtfoto deines Aufbaus woraus wir jedes Kabel, jedes Modul erkennen können.

Dieses Post enthält mindesetens 9 Fragezeichen und eine Menge weiterer Todo's für dich.
Wenn du alle Informationen beinander hast, kann man vieleicht weiterhelfen.

edit:
auch würde ich mal über die Kommentare nachdenken:

// ONE of the following three lines must be #defined:
//#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
#define SSD1306_128_32   ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16  ///< DEPRECATED: old way to specify 96x16 screen
// This establishes the screen dimensions in old Adafruit_SSD1306 sketches
// (NEW CODE SHOULD IGNORE THIS, USE THE CONSTRUCTORS THAT ACCEPT WIDTH
// AND HEIGHT ARGUMENTS).

wenn da deprecated dabeisteht, dann gibt es sicher eine neuere Methode wie man die Display-Größe eigentlich definiert... mach dich auf die Suche und berichte.

Hallo,

aktualisiere mal Deine Lib und versuche das mal so, eventuell bingt es ja was. Erst mal nur ein Display und mit dem Monitor Serial.print() herausfinden wo es klemmt.

#include <SPI.h>
#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 


Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Heinz

Oh, jede Menge neue Anregungen. Vielen Dank, auch wenn ich davon nicht mal ansatzweise Ahnung habe. Ich werde mich einlesen und berichten.

Trotzdem noch zu den Fragen:

@ noiasca:
"wie äußert sich der crash der Displays?" Von meinen 6 testweise angeschlossenen Displays friert immer ein anderes scheinbar zufällig ein.

"Was passiert genau?" Das Display erledigt bis circa zur Mitte seinen Job in der korrekten Auflösung und friert danach in einem "Schnee" ein. Das sieht dann so aus:

!Wie weit kommt der Sketch, wo kommt er nicht mehr hin?"
Auf dem ESP8266 erfolgen trotzdem eingefügter Ausgabebefehle auf dem Seriellen Monitor keine Ausgaben. Auf einem Arduino Nano läuft der Sketch sauber durch bis ans Ende der Schleife, alle Kontrollausgaben werden sauber ausgegeben und die Schleife startet neu.

"denn in deinem Sketch ist keine Ausgabe auf die Serielle." Ich weiß. Diese sind nach jedem tcaselect(x) und am Ende der Schleife zusätzlich zur Kontrolle von mir eingefügt worden.

"Was steht im Datenblatt des TCA9548A bezüglich Zeitverhalten?" To do.

"Gibt es Wartezeite zu beachten, wie lange dauert das Umschalten?" To do.

"Richtig beschaltet?" Davon gehe ich aus.

Link auf das Datenblatt? Link: https://cdn-shop.adafruit.com/datasheets/tca9548a.pdf

"Wodurch unterscheidet sich ein 32pixel Display vom 64pixel Display?" Das kann ich nicht genau sagen, da ich nur die 64er Version habe aber ich werde versuchen das zu ergründen.

"Mach eine Codeanalyse der Library, was alles die Lib in diesem Fall anderes rausschickt." Das übersteigt meine aktuellen Fähigkeiten deutlich aber ich werde mich befleißigen.

"Poste deinen Schaltplan und ein Echtfoto deines Aufbaus woraus wir jedes Kabel, jedes Modul erkennen können." Ich hoffe, das genügt den Ansprüchen:

"wenn da deprecated dabeisteht, dann gibt es sicher eine neuere Methode wie man die Display-Größe eigentlich definiert... mach dich auf die Suche und berichte." Das hatte mich auch schon beschäftigt, wobei ich mich dann auch wundere, warum es überhaupt noch da steht (vermutlich aus Kompatibilitätsgründen) und nicht gleich die neue Methode angewandt wird aber gut, ich versuche mich einzulesen.

@ Rentner
LIB müsste die aktuellste sein. Der Code ist bekannt und bereits von mir getestet worden. Zwar fehlt noch die Definition von Oled aber auch mit werden die Displays leider nicht sauber angesteuert (zeigen das selbe Fehlverhalten). Die Ausgaben im Seriellen Monitor kommen alle sauber an wen der Arduino Nano den Sketch geflasgt bekommt. Wenn ich den Sketch auf den ESP8266 D1 Mini spiele, ist der Fehler der gleiche aber die Ausgaben im Seriellen Monitor passen nicht mehr.

Ich bin noch nicht ganz durch mit der Aufklärung aber mit einer "älteren" Library laufen die Displays jetzt tatsächlich in 128 x 64 über den Multiplexer (TCA9548). Wer ein ähnliches Problem hat, sollte sich mal unter https://www.instructables.com/id/OLED-I2C-Display-ArduinoNodeMCU-Tutorial/ die Bibliotheken anschauen oder mit einer aktuellen Adafruit_SSD1306-Versionen den Code entsprechend anpassen. Ich schaue mir das die Tage auch noch mal genauer an und poste ggf. hier noch mal die konkreten Anpassungen. Besten Dank an alle Helfer :slight_smile: