Problema con OLed SSD1306

Salve a tutti
avrei necessità di mostrare su un display SSD1306 un centinaio di frasi , in forma statica ( quindi senza scorrimenti verticali od orizzontali ).
Al momento,la scelta della frase da stampare è casuale, il secondo step del progetto consiste nel mostrare le frasi in base a stimoli esterni( se riesco a risolvere questa parte).
Ho iniziato creando un arrey di 60 celle è scrivendo in ogni cella una frase , ho poi scritto la parte relativa alla decisione della frase da stampare e ho stampato il tutto nel monitor seriale. Il risultato è quello desiderato.
A questo punto ho implementato la parte relativa alla scrittura del display,( ho provato il display con dei programmi di prova e funziona) risultato display nero .
Ho inserito delle stampe sul monitor seriale per vedere dove si bloccava il programma niente. Visto che avevo la certezza che il programma per decidere la frase funzionava ( prima prova fatta ) la parte relativa al display funzionava ( invece di stampare una cella dell’arrey ho messo un testo fisso ) ho provato a ridurre le celle dell’arrey , e inizia a funzionare , se uso 6 celle funziona .
La compilazione non mi da errori e neanche il caricamento .

Lo sketch usa 15264 byte (47%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 1232 byte (60%) di memoria dinamica, lasciando altri 816 byte liberi per le variabili locali. Il massimo è 2048 byte.

Uso Arduino UNO e l’ambiente 1.8.12
Vi allego il codice , nel caso che qualcuno riesca a darmi qualche consiglio . Inizialmente pensavo a un problema di memoria, però , guardando le percentuali di utilizzo della memoria non mi sembra la causa.

/*  oled SSD1306 128Hx64V  
     *  Addres I2C = 0x3C 
     *  ArduinoUno SCL=A5  SDA=A4
     *  Se uso 128x32 modificare Adafruit_SSD1306.h
     *  caratteri per riga Size1=21/Size2=10/Size3=7/Size4=5/Size5=4
     */
   #include <Wire.h>
   #include <Adafruit_GFX.h>
   #include <Adafruit_SSD1306.h>
   #define OLED_RESET 4
   Adafruit_SSD1306 display(OLED_RESET);
     
   String tabella[60];
      
       void setup()   {
            // Assegno i valori alle string dell'arrey
            tabella[0] = "Non fermarti alla     prima soluzione.";        
            tabella[1] = "Sara'un buon momento per fare nuovi progetti.";
            tabella[2] = "Controlla il tuo     carattere."; 
            tabella[3] = "Lascia che le cose   evolvano per conto        loro.";
            tabella[4] = "Considera gli effetti dei tuoi modi di    fare";
            tabella[5] = "Buttati.";
            tabella[6] = "Gli esiti potrebbero  essere sorprendenti.";
            tabella[7] = "Guarda dove metti i   piedi.";
            tabella[8] = "Non abbandonare la   tua spontaneita' per  amore del successo.";
            tabella[9] = "Gli adulti crescono  per tornare bambini.";
            tabella[10] = "Gioisci per piccole    cose.";
            tabella[11] = "Meglio aspettare.";
            tabella[12] = "Troppe scelte possono costituire un        ostacolo.";
            tabella[13] = "E' dura ";
            tabella[14] = "Gliela puoi fare "; 
            tabella[15] = "Non fermarti alla     prima soluzione.";        
            tabella[16] = "Sara'un buon momento per fare nuovi progetti.";
            tabella[17] = "Controlla il tuo     carattere."; 
            tabella[18] = "Lascia che le cose   evolvano per conto        loro.";
            tabella[19] = "Considera gli effetti dei tuoi modi di    fare";
            tabella[20] = "Buttati.";
            tabella[21] = "Gli esiti potrebbero  essere sorprendenti.";
            tabella[22] = "Guarda dove metti i   piedi.";
            tabella[23] = "Non abbandonare la   tua spontaneita' per  amore del successo.";
            tabella[24] = "Gli adulti crescono  per tornare bambini.";
            tabella[25] = "Gioisci per piccole    cose.";
            tabella[26] = "Meglio aspettare.";
            tabella[27] = "Troppe scelte possono costituire un        ostacolo.";
            tabella[28] = "E' dura ";
            tabella[29] = "Gliela puoi fare "; 
            tabella[30] = "Non fermarti alla     prima soluzione.";        
            tabella[31] = "Sara'un buon momento per fare nuovi progetti.";
            tabella[32] = "Controlla il tuo     carattere."; 
            tabella[33] = "Lascia che le cose   evolvano per conto        loro.";
            tabella[34] = "Considera gli effetti dei tuoi modi di    fare";
            tabella[35] = "Buttati.";
            tabella[36] = "Gli esiti potrebbero  essere sorprendenti.";
            tabella[37] = "Guarda dove metti i   piedi.";
            tabella[38] = "Non abbandonare la   tua spontaneita' per  amore del successo.";
            tabella[39] = "Gli adulti crescono  per tornare bambini.";
            tabella[40] = "Gioisci per piccole    cose.";
            tabella[41] = "Meglio aspettare.";
            tabella[42] = "Troppe scelte possono costituire un        ostacolo.";
            tabella[43] = "E' dura ";
            tabella[44] = "Gliela puoi fare "; 
            tabella[45] = "Non fermarti alla     prima soluzione.";        
            tabella[46] = "Sara'un buon momento per fare nuovi progetti.";
            tabella[47] = "Controlla il tuo     carattere."; 
            tabella[48] = "Lascia che le cose   evolvano per conto        loro.";
            tabella[49] = "Considera gli effetti dei tuoi modi di    fare";
            tabella[50] = "Buttati.";
            tabella[51] = "Gli esiti potrebbero  essere sorprendenti.";
            tabella[52] = "Guarda dove metti i   piedi.";
            tabella[53] = "Non abbandonare la   tua spontaneita' per  amore del successo.";
            tabella[54] = "Gli adulti crescono  per tornare bambini.";
            tabella[55] = "Gioisci per piccole    cose.";
            tabella[56] = "Meglio aspettare.";
            tabella[57] = "Troppe scelte possono costituire un        ostacolo.";
            tabella[58] = "E' dura ";
            tabella[59] = "Gliela puoi fare "; 
            tabella[60] = "Non fermarti alla     prima soluzione.";  
            display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inizializzo I2C
            display.clearDisplay();                     // pulisco il display  
            display.setTextColor(WHITE);                // setto il colore bianco , il display è monocolore   
            display.setTextSize(1);                     // setto la grandezza del carattere    
              }  
       
       void loop() { 
                  
            int valore=map(random(372),0,372,0,60);     // mappo un numero random da 0 a 14 , il numero delle posizioni dell'arrey
            display.setCursor(0,0);                     // decido il pixel di origine 
            display.print(tabella[valore]);             // invio il contenuto della tabella indicizzata da valore
            display.display();                          // scrivo il display
            delay(1000);                                // aspetto per dare modo di leggere 
            display.clearDisplay();                     // cancello il display       
             }

Aloha Bernie

Ci sono sempre dei problemi usando la classe String.

Ciao Savoriano
Ho provato anche usando "if else" e "switch...case" però il risultato non cambia .
Quale potrebbe essere un altra forma per discriminare tra un centinaio di opzioni ?
Qualche idea ?

Puoi usare un array di char a 2 dimensioni.

char tabella [] [65] = {"Stringa1", "Stringa2", ..........};

Oppure un array di puntatori

char *tabella[] = {"Stringa1", "Stringa2", ..........};

La seconda occupa meno spazio dato che la prima gli array di char hanno un valore fisso che dipende dalla lunghezza della tua srtinga più lunga (+ o meno 65).

Se hai problemi di spazio in memoria sdram puoi usare PROGMEM.

Guarda questo

OK, grazie , adesso provo .
Ma secondo te , perchè anche usando "if..else" e "switch...case" il programma si inchioda e non funziona ?
uso eccessivo di memoria?

perché l'arduino non gestisce bene le Strings, se ho capito bene la classe String non pulisce la memoria che usa.

ho provato come suggerito da savoriano

char *tabella[] = {"Stringa1", "Stringa2", ..........};

senza le chiamate al display funziona , anche se sono al 83% della memoria dinamica , con le chiamate al display , nessun segno di vita .

Non so più cosa provare . Forse ho raggiunto il limite di arduino e dovrei utilizzare qualcosa di più performante ?

Posta il nuovo sketch

Ciao nid69ita
questo è il nuovo sketch

       #include <Wire.h>
       #include <Adafruit_GFX.h>
       #include <Adafruit_SSD1306.h>
       #define OLED_RESET 4
       Adafruit_SSD1306 display(OLED_RESET);
       
    char * myStrings[] = {  "Frase 1","Frase 2","Frase 3","Frase 4","Frase 5","Frase 6","Frase 7","Frase 8","Frase 9","Frase 10",
                            "Frase 11","Frase 12","Frase 13","Frase 14","Frase 15","Frase 16","Frase 17","Frase 18","Frase 19","Frase 20",
                            "Frase 21","Frase 22","Frase 23","Frase 24","Frase 25","Frase 26","Frase 27","Frase 28","Frase 29","Frase 30",
                            "Frase 31","Frase 32","Frase 33","Frase 34","Frase 35","Frase 36","Frase 37","Frase 38","Frase 39","Frase 40",
                            "Frase 41","Frase 42","Frase 43","Frase 44","Frase 45","Frase 46","Frase 47","Frase 48","Frase 49","Frase 50",
                            "Frase 51","Frase 52","Frase 53","Frase 54","Frase 55","Frase 56","Frase 57","Frase 58","Frase 59","Frase 60",};
                           
                               
    void setup() {
      Serial.begin(9600);
        display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
          display.clearDisplay();  
            display.setTextColor(WHITE);  
              display.setTextSize(1); 
    }
    
    void loop() {
      for (int i = 0; i < 60; i++) {
       display.setCursor(0,0);
       display.print(myStrings[i]);
       Serial.println(myStrings[i]);
       display.display(); 
       delay(1000);
       display.clearDisplay();
        
        
      }
    }

Commentando tutte le righe relative al display nel monitor seriale funziona tutto bene, come tolgo il commento alle righe del display , si blocca tutto , anche il monitor seriale .

Aloha

Visto che usi solo il testo potresti provare la libreria U8x8, rispetto alla Adafruit non usa un buffer, quindi hai già molta più memoria a disposizione. Segui ed applica inoltre il link che ti è stato indicato riguardo l'uso della PROGMEM.

Ciao, Ale.

Ciao ,
usando OLED_I2C rinky dink ottieni quello che vuoi…

#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL); // Remember to add the RESET pin if your display requires it...

extern uint8_t SmallFont[];
char * myStrings[] = {  "Frase 1","Frase 2","Frase 3","Frase 4","Frase 5","Frase 6","Frase 7","Frase 8","Frase 9","Frase 10",
                            "Frase 11","Frase 12","Frase 13","Frase 14","Frase 15","Frase 16","Frase 17","Frase 18","Frase 19","Frase 20",
                            "Frase 21","Frase 22","Frase 23","Frase 24","Frase 25","Frase 26","Frase 27","Frase 28","Frase 29","Frase 30",
                            "Frase 31","Frase 32","Frase 33","Frase 34","Frase 35","Frase 36","Frase 37","Frase 38","Frase 39","Frase 40",
                            "Frase 41","Frase 42","Frase 43","Frase 44","Frase 45","Frase 46","Frase 47","Frase 48","Frase 49","Frase 50",
                            "Frase 51","Frase 52","Frase 53","Frase 54","Frase 55","Frase 56","Frase 57","Frase 58","Frase 59","Frase 60",};
                           
void setup()
{
  if(!myOLED.begin(SSD1306_128X64))
    while(1);   // In case the library failed to allocate enough RAM for the display buffer...
    Serial.begin(9600);
  myOLED.setFont(SmallFont);
}

void loop()
{
  for (int i = 0; i < 60; i++) {
       myOLED.print(myStrings[i],CENTER,0);
       Serial.println(myStrings[i]);
       myOLED.update();
       delay(1000);
       myOLED.clrScr();
  
}
}

Grazie joeled

Purtroppo funziona solo se i caratteri da scrivere sono pochi , io devo scrivere delle frasi anche da 30 o più caratteri.