OLED, libreria "U8glib.h" e testo lampeggiante

Sto mettendo a punto un codice che lavora su un piccolo display OLED che controllo con la libreria "U8glib.h"; il display impostato è U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
Sono riuscito a visualizzare tutto ciò che mi serve tranne lampeggiare tre volte una scritta.
Ho provato con il delay e con il millis ma non riesco.
Dove sbaglio? La porzione di codice è la seguente, dove la scritta "errore entrata" dovrebbe lampeggiare n volte.

void entryError()
{
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_helvR10);
    u8g.drawStr( 15, 25, "Tiro non valido");
    u8g.drawStr( 17, 45, "errore entrata");
   } while ( u8g.nextPage() );
}

Ciao. Modificare il valore dei ritardi a proprio piacimento

void entryError()
{
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_helvR10);
    u8g.drawStr( 15, 25, "Tiro non valido");
    u8g.drawStr( 17, 45, "errore entrata");
    delay (250);
    u8g.drawStr( 17, 45, "              ");
    delay (250);
   } while ( u8g.nextPage() );
}

Saluti

Ti ringrazio, ma, come ho precisato, ho già provato questo metodo con diversi valori di ritardo, utilizzando sia delay() che millis() e NON funziona. L'intera visualizzazione è rallentata ed il testo accenna appena un sorta di sovrascrittura.

@vince59 posta il codice che provavi con i delay() quello che adesso posti non può lampeggiare.

Ciao, ecco il codice. E' quello suggerito e che cmq avevo già provato da solo. Ho fatto più prove in modi diversi ma il delay fa una sorta di freeze e sovrapposizione di testo.
Leggendo in giro mi è sembrato di capire che sia un problema comune...sarà da cambiare libreria?

void entryError()
{
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_helvR10);
    u8g.drawStr( 15, 25, "Tiro non valido");
    u8g.drawStr( 17, 45, "errore entrata");
    delay(250);
    u8g.drawStr( 15, 45, "               ");
    delay(250);
    u8g.print("errore entrata");
    } while ( u8g.nextPage() );
}

Premetto che non conosco bene la libreria in questione, in genere uso la u8X8 che gestisce solo testo, ma mi pare di capire dopo firstPage() tu scrivi la pagina, che puoi verrà visualizzata con nextPage(). Se funziona così mi sa che non vedrai mai il lampeggio. Puoi provare così (non testato!):

void entryError()
{
  u8g.firstPage();
  u8g.setFont(u8g_font_helvR10);
  u8g.drawStr( 15, 25, "Tiro non valido");
  u8g.drawStr( 17, 45, "errore entrata");
  u8g.nextPage() );
  delay(250);
  u8g.firstPage();
  u8g.setFont(u8g_font_helvR10);
  u8g.drawStr( 15, 25, "Tiro non valido");
  u8g.nextPage() );
  delay(250);
  u8g.firstPage();
  u8g.setFont(u8g_font_helvR10);
  u8g.drawStr( 15, 25, "Tiro non valido");
  u8g.drawStr( 17, 45, "errore entrata");
  u8g.nextPage() );
}

(non credo di aver scritto un codice valido, ma spero si capisca l'intento)

Ciao, Ale.

Ciao, avevo trovato il "flusso" da suggerito in un esempio sul web e ci stavo lavorando avendo anche io compreso che forse bisognava "rigenerare" le pagine in sequenza.
All'atto pratico, se nidifico le pagine nella specifica funzione e la richiamo dall'evento "trigger", qualcosa non gira bene, se invece le nidifico nella prozione del trigger, il codice gira. Tuttavia trovo assurdo che bisogna ripetere la pagina n volte. Ho pensato ad un counter ma mi sembra davvero farraginoso.

Se non usi la grafica (linee, cerchi e simili) puoi provare ad usare la libreria U8x8, che fa parte del solito pacchetto della U8glib che stai usando. Questa, non usando un buffer, a parte il risparmio di memoria scrive direttamente sul display, quindi una sequenza come quella che hai postato dovrebbe funzionare secondo i tuoi intenti. Dai un'occhiata alla documentazione del link, ma credo che ha parte l'inizializzazione con una diversa classe il codice vada bene cosi com'è, eliminando le chiamate a firstPage() e nextPage().

Ciao, Ale.

Grazie...appena possibile provo...e vi aggiorno.

...provato a scaricare ed installare la libreria ma non la riconosce

... magari seguire il loro WiKi?

Guglielmo

caro Gug, come al solito sei illuminante...però ho la giustificazione....stavo sistemando il PC alla mia amica maestra...e montando un nuovo campanello al mio amico del piano di sopra :woozy_face: :crazy_face: :stuck_out_tongue_winking_eye:

PS: ho installato la libreria (del tutto compatibile con la precedente), ma non è cambiato nulla.

  • nidificato il codice nella porzione "trigger" interna al loop, gira con il delay senza problemi;
  • richiamando, invece, la specifica funzione esterna al main loop, il video freeza, sovrappone ecc.

Forse non era stato chiaro abbastanza prima, in realtà non c'era niente da scaricare ed installare, ce lo avevi già installato!

Ciao, Ale.

A questo punto non mi è molto chiaro cosa vorresti ottenere, in particolare : il lampeggio deve durare per un tempo determinato? Deve ripetersi tot volte e basta? Deve rimanere finchè non si prenme un pulsante?
Chiarito questo basta mettere nella funziona il codice giusto, e non vedo perchè non debba funzionare.

Ciao, Ale.

OK, riassumo. Nel display LCD ho un evento al verifcarsi del quale viene richiamata una specifica funzione che restituisce un messaggio sul display. Tale messaggio lampeggia n volte tramite un delay().
Tentando di replicare sul display OLED ho avuto il malfunzionamento lamentato, ovvero freeze e sovrapposizione a scatti della scritta. Sono riuscito ad ovviare SOLO utlizzando il delay() all'interno del blocco di codice dove ho l'evento trigger (main loop).
Quindi se metto il delay() nella specifica funzione...non va. Se lo metto nel main loop...va.
MI chiedevo il perchè. Spero di essere stato chiaro...
Cmq ho risolto utilizzando il delay() nel main loop tra le due funzioni specifiche richiamate per gestire il lampeggio.