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.
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
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?
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.
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.
Ich sehe da auch das Problem mit der Kabellänge für I2C zu den einzelnen Displays.
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.
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.
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