Multiplexer TCA9548A + 2 oleds : HELP

Bonjour à tous,
Je débute dans la programmation, je n'ai aucune connaissance. Soyez indulgents si ma question peut paraitre stupide.
Je suis sur un projet d'afficheurs pour auto. Pour ce projet, je souhaiteras utiliser un Arduino Uno et afficher sur 2 ou 3 écrans OLED des valeurs lues par des capteurs.

En me documentant il semble que la solution soit de passer par un multiplexer.
Mon souci est que rien ne s'affiche sur mes écrans.

Je vous pose le code. Pourriez vous me dire ce qui ne va pas ? Merci

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Select I2C BUS
void TCA9548A(uint8_t bus)
{
  Wire.beginTransmission(0x70);  // TCA9548A address
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
  Serial.print(bus);
}
 
void setup() {
  Serial.begin(115200);

  // Start I2C communication with the Multiplexer
  Wire.begin();

  // Init OLED display on bus number 2
  TCA9548A(2);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();

  // Init OLED display on bus number 3
  TCA9548A(3);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));

    for(;;);
  } 
  // Clear the buffer
  display.clearDisplay();


  // Write to OLED on bus number 2
  TCA9548A(2);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("1");
  display.display(); 

  // Write to OLED on bus number 3
  TCA9548A(3);
  display.clearDisplay();
  display.setTextSize(8);
  display.setTextColor(WHITE);
  display.setCursor(45, 10);
  // Display static text
  display.println("2");
  display.display(); 
  
}
 
void loop()
{

}

Bonjour et bienvenue,

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et les appliquer.

Merci de donner des informations sur la matériel utilisé un lien vers les afficheurs serait bien.

Bonjour,
Ok, j'ai fait ma présentation. Désolé.
Concernant mon matériel j'ai :

Le branchement :

J'ai déjà réalisé les 2 programmes. Ils fonctionnent parfaitement.
J'aimerais les utiliser sur 2 écrans mais avec un seul micro contrôleur.
J'ai voulu essayer avec un programme "simple" pour tester si le multiplexeur fonctionne...et ça ne fonctionne pas malheureusement.

Je ne vois pas trop ce qui cloche dans ton code. La méthode setPort() de la librairie https://github.com/sparkfun/SparkFun_I2C_Mux_Arduino_Library/blob/master/src/SparkFun_I2C_Mux_Arduino_Library.cpp fait la même chose.

Mon commentaire vise plutôt à te faire comprendre une chose :
La librairie AdaFruit SSD1306 réserve une bonne quantité de mémoire pour son buffer écran. Si tu veux pouvoir contrôler deux écrans sans les effacer intégralement à chaque affichage, il te faut deux instances :

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Ce qui double la quantité de mémoire allouée. Or, avec une UNO, cela ne passera pas.
Mon conseil : si tu n'a pas d'objets graphiques à afficher, utilise plutôt la librairie SSD1306Ascii.

Dernier point : utiliser une UNO dans une voiture me paraît hautement hasardeux, compte tenu des vibrations, variations énormes de température, etc. Ce sont surtout les fils DUPONT qui vont te poser problème. Dans un environnement soumis à des contraintes sévères,, la soudure est indispensable.

Merci pour ton retour. Moi aussi je ne comprends pas trop ce qui pourrait clocher.
Penses-tu que ça ne pourrait être qu'une histoire de mémoire ?
Parce que j'ai essayé en ne branchant qu'un écran et j'ai le même problème.

J'ai fait un scan adresse I2C et le scan ne trouve rien.

Je vais essayer avec ta méthode ,merci pour ton conseil.
Quant à l'utilisation d'une Uno dans une voiture, j'ai prevu de faire un montage soudé avec mon propre design de PCB, le tout dans un boîtier en impression 3D. Tu penses que c'est l'Arduino qui pourrait ne pas être fiable ?

Non, seulement les connexions avec fil DUPONT.

Ceci est anormal, il devrait trouver au minimum le TCA9548A. Vérifie ton câblage entre TCA9548A et ARDUINO.

Voilà mon câblage :
Arduino 5v --> vin du Tca9548
Arduino A5 --> SCL du Tca9548
Arduino A4 --> SDO du Tca9548
Arduino GND --> GND du Tca9548

A0, A1, A2 du Tca9548 sur GND pour avoir l'adresse 0x70

Rien ne s'affiche

Si je shunte le Tca9548 en branchant SCL et SDA de l'écran sur l'arduino ça fonctionne

Je pense que l'arduino ne voit pas le Multiplexer.

J'en ai commandé un autre, un Adafruit cette fois ci, et voir si le problème ne vient pas de ceux que j'ai actuellement

Moi je commencerais par souder correctement les broches sur les modules avant de les incriminer.
image

C'était pour faire le switch entre le montage avec et sans multiplexeur.
J'ai testé la continuité au multimètre et c'était bon.

Sinon le montage est comme ça.

Dans ton code

Sur ton montage l'écran est sur le canal 7 on dirait

image

Au passage, si tu n'as que 2 écrans le multiplexeur n'est pas nécessaire car les écrans peuvent être configurés pour répondre sur 2 adresses possibles 0x78 et 0x7A

Oui sur canal 7 parce que depuis la publication du code, j'ai essayé plusieurs sorties et d'autres modules. Mais je modifiais le code pour pointer sur les bonnes sorties pendant les tests

Je sais pour les 2 écrans , et la résistance à changer pour passer de C à D.
Mais comme l'objectif final est d'avoir 3 écrans c'est pour ça que j'avais opté pour cette solution.

Merci de ton aide !

Bon, avec un TCA9548A de chez Adafruit, toujours le souci.
C'est juste incroyable. Même en prenant l'exemple de branchement / code sur le site d'Adafruit : Arduino Wiring & Test | Adafruit TCA9548A 1-to-8 I2C Multiplexer Breakout | Adafruit Learning System

#include "Wire.h"

#define TCAADDR 0x70

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


// standard Arduino setup()
void setup()
{
    while (!Serial);
    delay(1000);

    Wire.begin();
    
    Serial.begin(115200);
    Serial.println("\nTCAScanner ready!");
    
    for (uint8_t t=0; t<8; t++) {
      tcaselect(t);
      Serial.print("TCA Port #"); Serial.println(t);

      for (uint8_t addr = 0; addr<=127; addr++) {
        if (addr == TCAADDR) continue;

        Wire.beginTransmission(addr);
        if (!Wire.endTransmission()) {
          Serial.print("Found I2C 0x");  Serial.println(addr,HEX);
        }
      }
    }
    Serial.println("\ndone");
}

void loop() 
{
}

Le scan ne trouve pas d'adresse I2C
i2c

J'avoue ne plus savoir que faire... si jamais un expert pouvait m'aider.

Si je fais un test avec juste le microcontrôleur et 1 écran OLED, un scan I2C, il me trouve l'adresse

I2C_oled

Si je fais un test avec juste le microcontrôleur et le multiplexeur il me trouve pas d'adresse

I2C_Multiplexer

J'ai essayé avec un autre microcontrôleur, même souci.

Commence déjà par charger I2cScanner pour voir s'il trouve le TCA.

Je viens d'éditer mon message précédent pour ajouter cette manip.
Il ne trouve pas le TCA mais il trouve l'OLED

Chez moi il trouve le TCA et un aficheur.

Le souci pourrait venir des Microcontrôleurs ? Parce que franchement, le code vient de chez Adafruit et le câblage ça m'étonnerait que je me sois trompé, il y a 4 fils à brancher.

Cette photo, c'est celle de la manip en vrai ou c'est encore un pseudo montage pour nous faire voir?

Bonjour,

Sur tes photos on dirait que le module TCA9548A n'est pas soudé.

Non c'est le montage en vrai.
Faut-il absolument que le TCA soit soudé pour les tests ?