visualizzazione lcd 16x2 o 20x4 non sempre corretta

Chiedo se anche a voi capita di vedere il vostro LCD stampare caratteri strani tipo " / " o lettere diverse da quelle scritte nello sketch.

Per dire questo l'ho constatato quando uso lo stesso arduino per le prove..diciamo che dopo un centinaio di caricamenti circa sembrano spuntare questi problemi.

Non è problema di spazi vuoti o cose così perchè uso sempre print che scrive solo la stringa e riempio sempre la stringa di 16 o 20 caratteri. Quindi la riga dell'lcd è sempre completa di tutti gli spazi.

Ma mi capita (come ora che ho concluso il programma e volevo assemblare il mio progetto) che nella prima riga dove lo sketch recita cosi:

lcd.setCursor(0,0);
         lcd.print ("   IN  ATTESA   ");

il mio lcd visualizza: " / IN ATTESA "

oppure ancora più eclatante..in un sotto menù invece della parola "DATI" mi scrive "DOTI"...
Il problema non si era mai presentato prima negli altri caricamenti dello sketch..solo negli ultimi 3 caricamenti dove ho aggiustato qualche variabile mi ha dato queste problematiche.

Ma nel totale lo sketch non occupa gran che:
""Lo sketch usa 8.994 byte (29%) dello spazio disponibile per i programmi. Il massimo è 30.720 byte.
Le variabili globali usano 823 byte (40%) di memoria dinamica, lasciando altri 1.225 byte liberi per le variabili locali. Il massimo è 2.048 byte.""

che sia un problema di memoria dell'atmega? magari riscritto troppe volte? ma la memoria non può essere riscritta sulle 100mila volte? :o

Non credo sia un problema software, ma hardware.

Se hai un altro LCD prova a sostituirlo: alle volte è il controller che è difettoso.

Può anche dipendere dall'alimentazione "rumorosa".

Prima di fare altre ipotesi facci vedere uno schema e lo sketch.

hem lo sketch sono 500 righe…cmnq penso sia un errore di compilazione…ovvero questo programma era già attivo in un dispositivo…tutto funzionante. Ho dovuto fare alcune modifiche, allora per le prove ho usato un’altro arduino. Una volta corretto lo sketch, l’ultimo caricamento nell’arduino di prova mi ha dato questo problema nella visualizzazione dell’lcd (premetto che ho modificato solo variabili di gestione del programma, non le stringhe visualizzzioni lcd). Comunque vedere uno “/” non mi crea problemi, anche se mi da fastidio. Pensando fosse un problema dell’atmel, ho eseguito il caricamento anche nell’arduino in funzione e guarda caso lo stesso “/” mi è uscito anche lì! Quindi escludo un problema di processore, ma mi oriento a sto punto sulla compilazione…perche se scrivo il seguente codice:

lcd.setCursor(0,0);
         lcd.print ("   IN  ATTESA   ");

mi aspetto quanto scritto…e non caratteri inventati a caso.
Alimentazione ben stabilizzata…e poi provato esattamente con due arduino e lcd differenti, quindi escludo la parte hardware.

Ho provato anche a fare la prova del 9, cambiando completamente la stringa…Quel carrattere niente da fare, non vuole cambiare e rimane “/”! Però quando entro nei diversi sotto menu e quindi cambiano le visualizzazioni, tutto funziona bene…quando il programma ritorna a lavorare su quel ciclo e deve visualizzare quella stringa…torna fuori / (che tra l’altro non l’ho mai utilizzato in nessun sotto menù).

uso la libreria:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
perche avendo utilizzato tutti i pin digitali, uso A4 e A5 per la comunicazione dell’lcd con integrato PCF8574, ma ripeto…prima nessun problema…poi dopo aver modificato alcune varibili di lavoro…si è presentato il problema…
Suggerimenti?

500 righe sono tante e potrebbe essere un problema di memoria RAM.

Comincia con usare la funzione F() nei print di costanti (es. lcd.print (F(" IN ATTESA "));

trovato il problema…a caso…vorrei chiedere a voi se riuscite a capire perchè:

if ((A==0)&&(on<300)) {                                   
         lcd.setCursor(0,0);
         lcd.print("   IN  ATTESA   ");         //in questa stringa mi viene dato l'errore sull'lcd
         lcd.setCursor(0,1);
         lcd.print("      MENU      ");  }


if ((on>800)&&(pulizia<300)&&(A==0)) { 
 PRG_STD ();                                       //questa funzione mi attiva e spegne le uscite digitali in tempistiche da me impostate
  }                                                 
  
/*
Il prossimo controllo l'ho inserito perchè se mi esce dalla funzione PRG_STD perchè l'ingresso on viene messo a 0Volt, non voglio che l'uscita [p] mi rimanga bassa..quindi faccio il controllo e la metto HIGH.
però siccome come if è simile al primo ho pensato ci potesse essere interferenza...difatti è cosi!
l'ho provato ad escludere e il crattere / è sparito!! Come mai??
*/


//if (((on<300)||((on>800)&&(pulizia>800)))&&(state==LOW))
//    digitalWrite (p,HIGH); //se viene mandato consenso esterno quando un'elettrovalvola è attivata, la spegne

cyberhs:
500 righe sono tante e potrebbe essere un problema di memoria RAM.

Comincia con usare la funzione F() nei print di costanti (es. lcd.print (F(" IN ATTESA "));

fatto e il problema è sparito! lo messo in tutti i print dove scrivo la stessa cosa..in pratica salva la stringa nella memoria flash dove la variabile non può subire modifiche, giusto? cosi libero ram?

Grazie cyberhs!

La funzione F serve a trasferire nella memoria Flash le sole costanti (non le variabili) che saranno recuperate da questa durante l'esecuzione del programma.

In questo modo c'è un risparmio di memoria RAM, preziosa per le variabili.