Gestion de 2 écrans OLED

Bonjour j'ai essayé cela pour afficher sur deux ecrans tq defini ci dessous:

Adafruit_SSD1306 EcranA(SCREN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 EcranD(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

cela ne marche pas

Si je supprime une de ces deux lignes (n'importe laquelle) cela fonctionne pour un ecran bien sur (n'importe lequel)!

// Adafruit_SSD1306 EcranA(SCREN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 EcranD(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Il semble que configurer deux écrans cela beugue??!!

Je bute la dessus!

Avez vous une idée de ce qu'il se passe?

Merci

ne postez pas vos questions sur votre config spécifique dans les tutos, j'ai déplacé votre post.


pouvez vous poster votre code et donner un schéma clair de vos branchements, alim, configuration matérielle etc... ?

(cf les recommandations listées dans "Les bonnes pratiques du Forum Francophone”)

Bonjour docteurfrite

Oui, ces SSD1306 sur bus i2C on la même adresse, ce qui rend impossible leur coexistence sur ce bus.
Pour "contourner" ça il existe le multiplexeur de bus le TCA9458 qui te permettrai d'en avoir jusqu'à 8 avec chaque multiplexeur.

Cordialement
jpbbricole

Alors je n'ai pas vraiment compris selon le tuto ces afficheurs donnent deux possibilités d'adresse et j'ai déplacé la résistance de 4,7k pour transformer une adresse de 0x3C en 0x3D.!

La solution donnée dans ce tuto ne s'applique alors?

Bonsoir docteurfrite

J'avais supposé que tes écrans ne le permettait pas :face_with_diagonal_mouth:
Alors, si tu as appliqué le tuto, mets ton programme en ligne que l'on puisse voire ce qui cloche.

Eventuellement lance le programme de scanner i2C pour voir si tes 2 adresses sont visibles.

A+
Cordialement
jpbbricole

Si, surement. Mais as-tu bien précisé les adresses des 2 écrans dans les begin() respectifs?
Le plus simple serait que tu colles ton code dans un message.

OK,

Je m'y remet demain au calme, et je poste du code si je bute toujours.

Dans le setup, ajoute :

  EcranA.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Adresse par défaut
  EcranD.begin(SSD1306_SWITCHCAPVCC, 0x3D); // Deuxième écran, jumper déplacé

Bon voici,
j'ai essayé toute la matinée sans succés
je met un code de travail qui présente les même symptômes que mon autre programme.

Auparavant je met mes précautions et constations.
1/ Pour chaque display (display1 et display2) j'ai mis ce que j'appelle des blocs de traitement (ils y en a en chaque section "setup" et en "loop")

2/ Bizarrement, si les blocs de traitement sont dans le même ordre par exemple Display1 avant Display2, alors Display1 est bien affiché sur l'ecran1.
2.1/ Si j'inverse dans les deux sections l'ordre Display2 avant Display1 alors display2 s'affiche sur l'écran2
2.2/ Si dans les sections "Setup" et "Loop" les blocs Display1 et Display2 ne sont pas dans le même ordre alors rien ne s'affiche.

Mes conclusions/
1/ le câblage et l'adressage des écrans Oled sont bons car je peux afficher séparément sur un écran ou l'autre.
2/ l'ordre de traitement des blocs a une influence alors même qu'ils sont semblables, seul les nominations Display1 ou Display2 sont interchangées.

Probleme de beug software?

toute aide sera la bienvenue, car étant assez novice je dois louper qlq chose

MERCI


#include <Adafruit_SSD1306.h>
#define OLED_RESET -1

Adafruit_SSD1306 Display1(OLED_RESET);
Adafruit_SSD1306 Display2(OLED_RESET);

void setup()   {
// bloc setup de Display2
  Display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  Display2.clearDisplay();
  Display2.display();  

// bloc setup de Display1
  Display1.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  Display1.clearDisplay();
  Display1.display();
}

void loop() {
// bloc traitement Display2
    Display2.setTextSize(2);
    Display2.setTextColor(WHITE, BLACK);
    Display2.setCursor(0, 0);
    Display2.println("Display 2");
    Display2.fillCircle(50, 30,  10, 1);
    Display2.display();
    Display2.clearDisplay();

// bloc traitement Display1  
   Display1.setTextSize(2);
    Display1.setTextColor(WHITE, BLACK);
    Display1.setCursor(0, 0 );
    Display1.println("Display 1");
    Display1.fillCircle(70, 40,  10, 1);
    Display1.display();
    Display1.clearDisplay();
  
}

En mettant les instructions

if(!EcranD.begin(SSD1306_SWITCHCAPVCC, EcranD_ADDRESS)) {
    Serial.println(F("Ecran Départs erreur"));
    for(;;); // stop

au lieu de

Display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);

J'ai les mêmes résultats/constats

Bonjour docteurfrite

Les 2 écrans connectés, que dit le scanner i2C

Oh la, je n'avais pas fait attention avant. La carte, c'est une UNO?
Il n'y a pas suffisamment de mémoire pour 2 écrans.
1 écran nécessite d'avoir un buffer de taille 128 * 64 /8 = 1024 octets.
Donc lorsque tu déclares un second écran il ne peut pas allouer de buffer car il n'y a plus assez de mémoire libre. begin() doit retourner False, je suppose, mais comme tu ne le testes pas tu n'en sais rien.

Il y a des librairies qui permettent de travailler sans buffer mais il n'y a alors plus de fonctions graphique, donc uniquement du texte.
Il y en a une qui permet de faire du graphique avec un buffer de petite taille mais alors le tracé se fait en plusieurs fois ce qui ralenti le rafraîchissement des écrans. Voir ici

il dit

"Scanning...
I2C device found at adress 0x3C !
I2C device found at adress 0x3D !
done"

OK,

je comprends.

C'est une nano que j'ai, bizarrement nul part dans les tutos je n'ai remarqué de propos concernant cette limitation buffer!

Bon je vais faire avec la librairie U8g2.

Sur youtube j'ai vu un exemple qui fonctionne, enfin j’espère.

Merci pour l'aide, je reviens pour donner des news avec U8g2.

MERCI

j'ai fait un essai avec U8g2,

cela marche avec un programme simple, mais j'ai un message qui me dit que la mémoire est faible et qu'il y a un risque d'instabilité.

je vais l'adapter à mon programme, et je verrai bien si au niveau mémoire cela passe.

Le cas échéant y a t-il une autre librairie utilisable plus modeste qui demande moins de ressource. je n'ai besoin que de texte (ASCII).

Merci

Bonjour docteurfrite

C'est tout bon!

Une fois compilé, il s'affiche:

Program size: 15264 bytes (used 47% of a 32256 byte maximum) (0,85 secs)
Minimum Memory Usage: 476 bytes (23% of a 2048 byte maximum)

Ca laisse un peu de place pour du code.

Je n'ai pas fait l'essai en vrai, en déplaçant la résistance, je n'en suis pas capable :woozy_face:
Par contre, en croisant les adresses dans le programme, je me rends compte que les 2 écrans fonctionnent.

Cordialement
jpbbricole

Il y a la librairie u8x8 qui est installé avec u8g2.

Le buffer n'est pas alloué à la compilation mais lorsqu'on appelle begin() dans le setup(). Donc il y a suffisamment de mémoire pour allouer le buffer du premier écran mais begin() échoue pour le second. Il suffit de tester ce que retourne begin() pour s'en convaincre.

Bonjour,

Je te conseille la librairie SSD1306Ascii Qui n'utilise pas de buffer.