lcd.blink su LCD I2C

Ho notato che su display che uso solitamente non posso utilizzare lcd.blink () per far apparire il cursore lampeggiante quando, che so, mi serve di cambiare un parametro sullo schermo. O, almeno, se guardo bene, qualcosa che va in giro per il display esiste, ma non si vede e cambia continuamente posizione. Se fermo il programma (intanto che trasferisco da Pc a Nano, per esempio), allora in quei pochi secondi il cursore si vede e lampeggia regolarmente. Ho girato per il web e sembra che sia un problema conosciuto.

Uso LCD 20x4 blu che connetto direttamente al classico PCF8574 connesso al SDA/SCL di un Nano, ma non penso che sia diverso con Micro o con UNO.

Conoscete qualche soluzione (naturalmente NON vale mettere un delay! ) o non ce ne sono ??

Sketch??? Ciao Uwe

Non ho messo nessuno sketch perchè lo fa su qualsiasi programma.

Certo, se prendete HELLO WORLD, dove la schermata è sul SETUP, non ha senso.

void loop()
{
   lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO ");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" FORUM - fm   ");     
  
  // Do a little animation by writing to the same location
  lcd.setCursor ( 14, 1 );
  lcd.print (char(2));
  delay (200);
  lcd.setCursor ( 14, 1 );
  lcd.print ( char(0));
  delay (200);
  lcd.blink ();
}

Su questo HELLO WORLD, modificato con il programma tutto su LOOP, già si può vedere lo "strano" sfarfallamento del cursore, ma qui abbiamo ben due delay (200). Se non abbiamo nessun delay, non si vede nulla, o meglio, a guardare bene si vede qualcosa che va in giro per il display...

Caspita! Nessuno che usa LCD collegati con I2C ??? Tutti a buttare via uscite ??? Strano !! Oppure nessuno che usa il cursore....

Non ne so molto di questa funzione dell'lcd però potrebbe essere che continuando a richiamarla ad ogni ciclo la fai andare in "conflitto" con se stessa, quindi dovresti provare a richiamarla solo quando necessario e non ad ogni ciclo. Questo potrebbe essere anche il motivo per cui quando fermi il programma funziona, perchè il loop non viene più eseguito e la blink va tranquilla!

Si, è esattamente ciò che pensavo. E allora un dubbio mi ha assalito: programmiamo male l'ouptut su LCD (noi tutti, dico) ?

Mi spiego: noi continuiamo a scrivere nel LOOP cose tipo

lcd.setCursor( 9, 3 ); lcd.print("sonda T/RH " );

che vengono eseguite ad ogni loop, mentre se ogni schermata dovesse essere chiamata, che so, con un void,

void schermata () {

lcd.setCursor( 9, 3 ); lcd.print("sonda T/RH " );

}

UNA sola volta, non ci sarebbe bisogno di richiamarla se i dati non fossero cambiati, e l'esecuzione del ciclo sarebbe più veloce (credo!)... In questo caso non dubito che il blink funzionerebbe... ma non è detto se abbiamo dati che cambiano in continuazione (tipo letture continue di una tensione)...

Invece pensavo che il blink fosse delegato al processore del LCD sollevando così lo Atmel...

Boh...