Mehrere Displays als Array anlegen

hi Leute, vielleicht kann mir jemand weiter helfen,
Ausgangslage:
4 OLED-Displays werden über einen I2CMultiplexer TCA9548A angesteuert.
Das klappt ganz gut - hier das Setup der Displays:

setTCAChannel(0);
Display_0.begin();
Display_0.setFont( u8g2_font_inr62_mn);

setTCAChannel(1);
Display_1.begin();
Display_1.setFont( u8g2_font_inr62_mn);

setTCAChannel(2);
Display_2.begin();
Display_2.setFont( u8g2_font_inr62_mn);

setTCAChannel(3);
Display_3.begin();
Display_3.setFont( u8g2_font_inr62_mn);

Ich möchte die Anzahl der Codezeilen verringern, da kam mir die Idee einer For-Schleife:
hab zuerst ein Stringarray erzeugt:

String disp = {"Display_0","Display_1","Display_2","Display_3"};

und dann im Setup diese For-Schleife gebaut:

for(byte i=0;i<4;i++)
{
setTCAChannel(i);
disp[i].begin();
disp[i].setFont( u8g2_font_inr62_mn);
}

das mag der Compiler gar nicht...
Fehlermeldung:
'class String' has no member named 'setFont'

ich möchte erreichen, dass beispielsweise im ersten Durchgang aus
disp[i].setFont( u8g2_font_inr62_mn);
wieder das wird
Display_0.setFont( u8g2_font_inr62_mn);

wenn ich das hinbekomme hätte es in weiterer Folge große Vorteile im weiteren Handling mit den OLEDs,
komme aus der Python-Ecke(Raspberry) und hab mit C++ wenig Erfahrung

bitte um eure Hilfe oder einen Denkanstoß, der mich weiter bringt
Vielen Dank im Voraus

zunächst mal bitte den Post lesbar machen und den Code in Codetags darstellen.

Und dann wäre es gut - wenn du einen vollständigen Sketch zeigen würdest ... evtl. auch ein Muster nur mit deiner OLED library und deinen 4 displays.

so aus dem bauch raus ... setFont auf das Display anwenden - und das sind keine Strings sondern Objekte einer anderen Klasse... --> siehe Tommy's Antwort.

1 Like

Du musst ein Array vom Typ des Displays machen.
Da der Rest des Codes und ein Link zur Lib fehlt, kann man nur so allgemein antworten.

Gruß Tommy

1 Like

Display_1 und "Display_1" haben rein gar nichts miteinander zu tun.
Das erste könnte eventuell ein Variablenname sein (der bei dir allerdings undefiniert ist)
Das zweite ist ein Text.

Das sind keine 4 Displays, sondern vier Strings.
Der Inhalt eines Strings ist nie ein Variablenname sondern irgendein ein Text.

1 Like

Ich rate:

U8G2_UC1701_DOGS102_1_4W_SW_SPI oledDisp[] = { U8G2_UC1701_DOGS102_1_4W_SW_SPI display_0(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 4, /* dc=*/ 9, /* reset=*/ 8);
                                               U8G2_UC1701_DOGS102_1_4W_SW_SPI display_1(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 5, /* dc=*/ 9, /* reset=*/ 8);
                                               U8G2_UC1701_DOGS102_1_4W_SW_SPI display_2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 6, /* dc=*/ 9, /* reset=*/ 8);
                                               U8G2_UC1701_DOGS102_1_4W_SW_SPI display_3(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
                                             };

// Im Setup
    for (byte i = 0; i < 4; i++)
{
  setTCAChannel(i);
  oledDisp[i].begin();
  oledDisp[i].setFont( u8g2_font_inr62_mn);
}

Und ja, es ist Absicht das ich SPI und nicht I2C genommen habe.

1 Like

dachte, wenn ich nur die wesentlichen Teile zeige, wirds übersichtlicher...
war wohl eine falsche Annahme, sorry...

hier der gesamte Testcode:

// dieses Prog. initialisiert vier I2C-OLEDs: SSD1306, 128x64 px , 0,96"
// verwendet wird dazu ein I2C-Multiplexer TCA9548A

// ***************************************************
// Bibliotheken einbinden
// ***************************************************
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// ***************************************************
// OLEDs 0-3
// ***************************************************
U8G2_SSD1306_128X64_NONAME_F_HW_I2C Display_0(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C Display_1(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C Display_2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C Display_3(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// ***************************************************
// Multiplexer TCA9548A
// ***************************************************
#define I2C_ADDRESS  0x70
#define CH_0 0
#define CH_1 1
#define CH_2 2
#define CH_3 3

// die neue Idee: funktioniert nicht - leider....
String disp[] = {"Display_0","Display_1","Display_2","Display_3"};

// ***************************************************
// Setup
// ***************************************************
void setup(void)
{
  //TCA9548A
  Wire.begin();
  //OLED 0 - 3 initialisieren

  
  // alte Methode: funktioniert
  /*
  setTCAChannel(CH_0);
  Display_0.begin();
  Display_0.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

  setTCAChannel(CH_1);
  Display_1.begin();
  Display_1.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

  setTCAChannel(CH_2);
  Display_2.begin();
  Display_2.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

  setTCAChannel(CH_3);
  Display_3.begin();
  Display_3.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe 
  */

  for(byte i=0;i<4;i++)
  {
    setTCAChannel(i);
    disp[i].begin();
    disp[i].setFont( u8g2_font_inr62_mn);
  }
}

// ***************************************************
// loop: bleibt vorerst leer
// ***************************************************
void loop(void) 
{
  
}

// ***************************************************
// Funktionen
// ***************************************************

// Display auswählen
void setTCAChannel(byte nr)
{
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(1 << nr);
  Wire.endTransmission(); 
}type or paste code here

Na geht doch.

Versuche das:

// dieses Prog. initialisiert vier I2C-OLEDs: SSD1306, 128x64 px , 0,96"
// verwendet wird dazu ein I2C-Multiplexer TCA9548A

// ***************************************************
// Bibliotheken einbinden
// ***************************************************
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// ***************************************************
// OLEDs 0-3
// ***************************************************

U8G2_SSD1306_128X64_NONAME_F_HW_I2C oledDisp[] = { U8G2_SSD1306_128X64_NONAME_F_HW_I2C (U8G2_R0, /* reset=*/ U8X8_PIN_NONE),
                                                   U8G2_SSD1306_128X64_NONAME_F_HW_I2C (U8G2_R0, /* reset=*/ U8X8_PIN_NONE),
                                                   U8G2_SSD1306_128X64_NONAME_F_HW_I2C (U8G2_R0, /* reset=*/ U8X8_PIN_NONE),
                                                   U8G2_SSD1306_128X64_NONAME_F_HW_I2C (U8G2_R0, /* reset=*/ U8X8_PIN_NONE),
                                                 };

// ***************************************************
// Multiplexer TCA9548A
// ***************************************************
#define I2C_ADDRESS  0x70
#define CH_0 0
#define CH_1 1
#define CH_2 2
#define CH_3 3

// die neue Idee: funktioniert nicht - leider....
String disp[] = {"Display_0", "Display_1", "Display_2", "Display_3"};

// ***************************************************
// Setup
// ***************************************************
void setup(void)
{
  //TCA9548A
  Wire.begin();
  //OLED 0 - 3 initialisieren
  // alte Methode: funktioniert
  /*
    setTCAChannel(CH_0);
    Display_0.begin();
    Display_0.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

    setTCAChannel(CH_1);
    Display_1.begin();
    Display_1.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

    setTCAChannel(CH_2);
    Display_2.begin();
    Display_2.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe

    setTCAChannel(CH_3);
    Display_3.begin();
    Display_3.setFont( u8g2_font_inr62_mn); // 61 Pixel Höhe
  */
  for (byte i = 0; i < 4; i++)
  {
    setTCAChannel(i);
    oledDisp[i].begin();
    oledDisp[i].setFont( u8g2_font_inr62_mn);
  }
}

// ***************************************************
// loop: bleibt vorerst leer
// ***************************************************
void loop(void)
{
}

// ***************************************************
// Funktionen
// ***************************************************

// Display auswählen
void setTCAChannel(byte nr)
{
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(1 << nr);
  Wire.endTransmission();
}
1 Like

hey Mann, bin begeistert.
Setup: funzt einwandfrei
Loop: (hab die fehlenden Programmteile eingesetzt) ebenso.
2 Tage Verzweiflung haben sich in Freude verwandelt, dank deiner Hilfe.
Jetzt kann ich die OLEDs (ist nur ein kleiner Teil eines größeren Projekts:
ich baue eine Klappscheibenbox für Airsoft) endlich einfach ansprechen.
Weiterer Schritt: das Ganze in eine bestehende Klasse integrieren.

Tausend Dank

PS: wenn Problem gelöst, muss ich den Beitrag löschen/still legen?

Herzerl drücken, was dir geholfen hat
Solution markieren, was es dann schlussendlich war

Thread so lassen wie er ist.

1 Like

Danke für's Feedback!
Ich würde gerne, das Du den Betreff in Deinem Ausgangspost änderst:
Vorschlag: mehrere Displays als Array anlegen - oder so ähnlich.
Viel Spass dabei!