Doppio Oled 2024

Buongiorno

Scusate se vi chiedo un aiuto su un argomento che avate già discusso:
( Doppio Oled.

Per realizzare un banco di controllo motore ho bisogno di gestire 2 schermi Oled SSD1306 indipendentemente.

Non posso utilizzare lo sketch compreso nel topic Doppio Oled in quanto se dichiaro lo schema come indicato

Adafruit_SSD1306 display1(-1);

con Adafruit SSD1306 v2.5.9 non ho la corretta dimensione del video.
Quindi ho dichiarato i displeys con il comando

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Tuttavia con il codice che ho scritto va sempre e solo un solo schermo.
Dal punto di vista hardware non ci sono problemi: 2 schermi distinti con indirizzi I2C 0x3C e 0x3D (in uno schemo ho modificato la posizione del jumper).
Se modifico il codice per fare andare solo il display 1 il programma gira correttamente (0x3D).
Se modifico il codice per fare andare solo il display 2 il programma gira correttamente (0x3C).

Se li attivo contemporaneamente va sempre e solo quello dichiarato per primo indirizzo 0x3D.

Qualcuno potrebbe analizzare il codice e farmi sapere cosa sto (sicuramente) sbagliando?

Grazie 1000 per l'aiuto.

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

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)

// Adafruit_SSD1306 display1(-1);
// Adafruit_SSD1306 display2(-1);

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup()   {                
  Serial.begin(9600);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display1.display();
  display2.display();
  delay(2000);
  
 
 
  }
  void loop() {
// Nota: nei tests con un singolo schermo devo disattivare le linee dell'altro schermo
  
// Scrivo "World" al centro dello schermo SSD1306 display 2 0x3D
   display1.clearDisplay();
   display1.setTextSize(2);
   display1.setTextColor(WHITE);
   display1.setCursor(30,30);
   display1.println("World");
   display1.display();
   delay(2000);
   display1.clearDisplay();
   display1.setTextSize(2);
   display1.setTextColor(WHITE);
   display1.setCursor(30,30);
   display1.println("2World2");
   display1.display();
   delay(5000);

// Scrivo "World" al centro dello schermo SSD1306 display 1 0x3C
   display2.clearDisplay();
   display2.setTextSize(2);
   display2.setTextColor(BLACK, WHITE);
   display2.setCursor(30,30);
   display2.println("Hello");  
   display2.display();
   delay(2000);
   display2.clearDisplay();
   display2.setTextSize(2);
   display2.setTextColor(BLACK, WHITE);
   display2.setCursor(30,30);
   display2.println("2HELLO2");
   display2.display();
   delay(5000);
}

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere solo in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.

Grazie.

Buongiorno, filofabbri.

Benvenuto nella sezione Italiana del forum :slight_smile:

Cortesemente, leggi attentamente il REGOLAMENTO di detta sezione:
[REGOLAMENTO] Come usare questa sezione del forum
(... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15)
e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione IN CODA ALL'APPOSITA DISCUSSIONE:
Presentazioni nuovi iscritti: fatevi conoscere da tutti! (Part 2)
spiegando bene quali esperienze hai in elettronica e in programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie
Gianluca

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento, nessuno ti risponderà (eventuali risposte, o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Ciao!
Scusami per non essermi presentato: non sono molto pratico di Forum in generale.
Oggi l'ho fatto. Potresti aiutarmi nel mio problema o indirizzarmi a qualcuno che possa farlo inoltrando il mio topic?
Grazie 1K. :robot:

Non hai detto che scheda stai usando, se ad esempio è un Arduino Uno o Nano non può funzionare. Prova a controllare cosa ritorna display.begin(), es:

Serial.print("Display 1 init : ");
Serial.println(display1.begin(SSD1306_SWITCHCAPVCC, 0x3D));
Serial.print("Display 2 init : ");
Serial.println(display2.begin(SSD1306_SWITCHCAPVCC, 0x3C));

Vedrai che il secondo stampa 0.
E, come dice la documentazione di Adafruit:

@return true on successful allocation/init, false otherwise.
            Well-behaved code should check the return value before
            proceeding.

Ciao, Ale.

Ciao ilguargua

Grazie per la risposta.
Io utilizzo Arduino Uno R3. Con questa scheda riesco a gestire 2 schermi?
Scusa la mia grande ignoranza di non sapere. Non ho capito cosa devo fare relativamente a quello che mi hai consigliato

Serial.print("Display 1 init : ");
Serial.println(display1.begin(SSD1306_SWITCHCAPVCC, 0x3D));
Serial.print("Display 2 init : ");
Serial.println(display2.begin(SSD1306_SWITCHCAPVCC, 0x3C));

Qual'è il resto del codice?

Grazie per la risposta e per la pazienza.

No, perlomeno non con la libreria che stai usando. Il perchè è semplice : quella libreria alloca 1Kb di memoria per lo schermo, l'Arduino Uno ha 2Kb di memoria RAM, quindi già utilizzando solo uno schermo sei al limite. Domanda: a te serve usare la grafica (linee, punti, poligoni, etc) o devi scrivere solo testo? Nella seconda ipotesi esistono librerie specifiche che non occupano tutta quella memoria, e con le queli potresti provare a gestire 2 schermi. Uso il condizionale perchè non ho mai provato personalmente.

Non c'è un resto del codice, se la seconda chiamata ti restituisce 0 significa che non ha potuto allocare la memoria necessaria, e quindi si limita a non funzionare.

Ciao, Ale.

@filofabbri: ... emmm ... hai presente il punto 16.1 del REGOLAMENTO?

Inoltre, secondo me, dovresti fermarti un attimo e dedicare un po' di tempo a studiare, perché, dalle domande che fai, emergono varie lacune :roll_eyes: ... sempre il punto 16.1 indica dei buoni pdf da scaricare ed un ottimo libro da acquistare ... vedrai che, dopo, molte cose ti saranno più chiare e sarai più produttivo :wink:

Guglielmo

1kB e 2kB. Chilobyte, non chilobit!
b minuscola=bit; B maiuscola=byte;
k minuscola=chilo; K maiuscola= Kelvin! :slightly_smiling_face:

... ammetto ... errore che faccio spessissimo anche io ... :roll_eyes:

Guglielmo

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.