2 Multiplexer & 9 OLED's

Hallo Zusammen,
ich kenne mich im Programmieren weitgehend aus, wenn nicht weiß ich wo ich suchen muß.
Mein Problem: Ich versuche für die Modellbahn eine Bahnhofsanzeige aufzubauen. Im Einsatz 2x Multiplexer von Sparkfun TCA9548A und 8x OLED 0,91 & 1x OLED 2,4. Die 8 kleinen Oled und ein Muxxer (0x70) dann ist alles ok. Sobald der 2. Muxxer (0x71) angeschlossen ist, fangen die Probleme an.
Das große Oled zählt die Displays hoch.

#include <SparkFun_I2C_Mux_Arduino_Library.h> 
#include <Wire.h>                             // Bibliothek für die I2C Funktionalität
#include "SSD1306Ascii.h"                     // Bibliothek für die Displays
#include "SSD1306AsciiWire.h"                 // Bibliothek für die Displays

#define I2C_ADDRESS 0x3C     

const int anzDisp = 9;

SSD1306AsciiWire oled;
SSD1306AsciiWire oled2;


QWIICMUX myMux[2];

void setup() {
  Serial.begin(115200);                      // started die serielle Kommunikation
  Wire.begin();                              // I2C Verbindung zum OLED
  Wire.setClock(400000L);                    // I2C Verbindung zum OLED
  
  //Muxer aktivieren
  if (myMux[0].begin(0x70, Wire) == false)
  {
    Serial.println("Mux not detected. Freezing...");
    while (1);     
  }
  Serial.println("Mux detected (1)");

  if (myMux[1].begin(0x71, Wire) == false)
  {
    Serial.println("Mux not detected. Freezing...");
    while (1);
  }
  Serial.println("Mux detected (2)");

  for (int i=0; i<anzDisp; i++)
  {
    if (i<8){
      myMux[0].setPort(i);
      oled.begin(&Adafruit128x32, I2C_ADDRESS);  // Start des OLEDs
    } else{
      myMux[1].setPort(i-8);  
      oled2.begin(&Adafruit128x64, I2C_ADDRESS);   // Start des OLEDs
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0; i < anzDisp;i++){
    if (i<8){
      myMux[0].setPort(i);
      oled.clear();
      oled.setFont(Callibri11);
      oled.setCursor(0 , 1); 
      oled.print("Display: ");
      oled.print(i);
      myMux[0].disablePort(i);
    } else{
      myMux[1].setPort(i-8);
      oled2.clear();
      oled2.setFont(Callibri11);
      oled2.setCursor(0 , 1); 
      oled2.print("Display: ");
      oled2.print(i);
      myMux[1].disablePort(i-8);
    }
    delay(500);
    Serial.print("Display ");
    Serial.println(i);
  }
  Serial.println(" ");
  delay(5000);
}

Ich habe schon verschiedene Programmierungen probiert. Es bleibt immer ähnlich. Test läuft auf einem UNO R3.

Ich Danke Euch im Voraus

Uwe

Warum brauchst Du für 8 Displays 2 Multiplexer? Der TCA9548A kann doch 8 I2C-Kanäle schalten.

Unabhängig davon: Hast Du beim 0x71 die Adressleitung umgelötet?

Gruß Tommy

Hallo Tommy,
Es sind insgesamt 9 oleds. Die Muxxer haben unterschiedliche Adressen, werden vom Scanner als solche erkannt. Die OLEDs haben alle die gleichen.
Gruss
Uwe

Das einzelne OLED hat die gleiche Adresse, wie die 8?
Wird der 2. Mux bereits im Setup nicht erkannt?

Gruß Tommy

Hallo Tommy,
Es wird alles korrekt erkannt. Alle OLED haben die gleiche Adresse. Die Muxxer funktionieren alleine. Habe mit unterschiedlichen Variablen gearbeitet, auch damit hatte ich keinen Erfolg.
Gruss
Uwe

Wenn Du die gestellten Fragen genauer beantworten würdest, wäre es besser.
Nochmal: In Deinem Code werden in Setup beide Mux angesprochen. Werden sie beide erkannt?

Gruß Tommy

Laut Post #3 ja.

Da war ich mir nicht sicher, ob er nicht evtl. die getrennten Sketche meint.
Weil, wenn sie im gemeinsamen Sketch erkannt werden, sollte der Rest auch funktionieren.

Gruß Tommy

Ok, ich bin da von einem gemeinsamen Sketch ausgegangen.
Von zwei Sketchen habe ich nichts gelesen....oder überlesen.

Eine Alternative wäre für das große Oled einen eigenen Controller. Die gibt es schon so preiswert. :wink:
Ich sehe da auch das Problem mit der Kabellänge für I2C zu den einzelnen Displays.

Welche Probleme es sind, hat uns der TO auch noch nicht mitgeteilt.
Was er unter Hochzählen der Displays versteht, ist mir auch noch nicht klar.

Gruß Tommy

Ja, stimmt. Ist etwas unverständlich.
Da ich bisher noch keinen Muxer benötigt habe, fehlt mir da auch die Idee.
Daher, warum kein weiterer Controller ?

Ich kann in dem Code auch keinen offensichtlichen Fehler sehen. Lediglich das myMux-Array kommt mir komisch vor. Da fehlt für mich die konkrete Initialisierung. Die wird mit begin gemacht.
Mal sehen, ob bei einer genaueren Beschreibung der "Probleme" durch den TO noch Erkenntnisse kommen.

Gruß Tommy

Ja, lassen wir uns mal überraschen. :wink:

Hallo Uwe
Wenn Du jeweils nur ein kleines OLED an jeden Muxxer anschließt funktioniets dann auch nicht?

Grüße Uwe

Ich denke nein, denn du kommst in den else-Zweig nur, wenn der Index i schon auf 8 steht - das ist das große Display.

Ich wurde das so versuchen.
Nur die 8 kleine was sind auf mux0 in der for Schleife initialisieren, den großen separat.
Da ich weder 9 Displays wie auch die Multiplexer, kann das nicht testen.

#include <SparkFun_I2C_Mux_Arduino_Library.h>
#include <Wire.h>                             // Bibliothek für die I2C Funktionalität
#include "SSD1306Ascii.h"                     // Bibliothek für die Displays
#include "SSD1306AsciiWire.h"                 // Bibliothek für die Displays

#define I2C_ADDRESS 0x3C

const int anzDisp = 8;

SSD1306AsciiWire oled;
SSD1306AsciiWire oled2;
QWIICMUX myMux[2];

void setup() {
  Serial.begin(115200);                      // started die serielle Kommunikation
  Wire.begin();                              // I2C Verbindung zum OLED
  Wire.setClock(400000L);                    // I2C Verbindung zum OLED

  //Muxer aktivieren
  if (myMux[0].begin(0x70, Wire) == false)
  {
    Serial.println("Mux not detected. Freezing...");
    while (1);
  }
  Serial.println("Mux detected (1)");

  if (myMux[1].begin(0x71, Wire) == false)
  {
    Serial.println("Mux not detected. Freezing...");
    while (1);
  }
  Serial.println("Mux detected (2)");

  for (int i = 0; i < anzDisp; i++)
  {
    myMux[0].setPort(i);
    oled.begin(&Adafruit128x32, I2C_ADDRESS);  // Start des OLEDs
  }

  myMux[1].setPort(0);
  oled2.begin(&Adafruit128x64, I2C_ADDRESS);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0; i < anzDisp; i++) {
    myMux[0].setPort(i);
    oled.clear();
    oled.setFont(Callibri11);
    oled.setCursor(0 , 1);
    oled.print("Display: ");
    oled.print(i);
    myMux[0].disablePort(i);
    Serial.print("Display ");
    Serial.println(i);
  }
  myMux[1].setPort(0);
  oled2.clear();
  oled2.setFont(Callibri11);
  oled2.setCursor(0 , 1);
  oled2.print("Display: ");
  oled2.print(9);
  myMux[1].disablePort(0);

  delay(500);
  Serial.println(" ");
  delay(5000);
}

Hallo Zusammen,
das Endprodukt soll sein:
Muxxer 0 stellt die Bahnhofsanzeige dar.

  • Hier wird jeweils nur die entsprechende Anzeige "Display #" angezeigt
    Muxxer 1 soll gesamten Fahrplan bzw evtl andere Anzeigen darstellen
  • Hier wird "Display 0 - 8" dargestellt/hochgezählt

Das ganze ist nur ein Probeaufbau. Um solche Fehler zu eliminieren. Ich ging davon aus, das ich jeden Muxxer/Port entsprechend ansteuern kann und er nur das darstellt das dem Muxxer/Port gesagt wurde.

myMux[0].setPort(i);

Muxxer_1 Port_0 zeigt die Werte von Muxxer_0 Port(0-7)
Ich hoffe das ich den Fehler einigermaßen darstellen konnte.
Wie gesagt mit einem Muxxer & 8 OLED kein Problem. das ganze ist mit QWIIC Kabel versehen. Die einzelnen Module habe ich einzeln getestet. Erst beim gemeinsamen Einsatz kommt es zu Problemen.

Gruß
Uwe

Und warum nimmst du nicht für das einzelne, große Oled einen eigenen Controller?
Es gibt da sehr klein, angefangen vom ATTINY85, Arduino pro mini, oder eine ESP32-C3 super mini. Da sparst du dir den Muxxer.

Ich hab ein Fehler in der for schleife du hast 8 Displays die for schleife wird bis bis 9 laufen i = 0 bis 8 gibt 9 durchläufe, must -1 dazu schreiben am Telefon das Ändern biringt mich um :smile:

Hmm... wenn du von Port 0:7 (mux:port) auf Port 1:0 wechselst bleibt 0:7 aktiv. Bau da noch ein disablePort() ein.