Schermo LCD I2C malfunzionante?

Ciao a tutti,
sto cercando di far funzionare uno schermo LCD I2C che mi sta dando un bel po’ di problemi.
L’ho provato con mille librerie diverse sia su un clone cinese di arduino uno, sia su un WeMos D1.

Alla fine sembra che il risultato meno tragico lo dia la libreria New LiquidCrystal.
Caricando l’esempio HelloWorld_i2c (e mettendo l’indirizzo giusto: 0x3F) il risultato è questo: video

Con questo codice invece riesco a vedere la scritta

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  lcd.begin(16,2);   // initializing the LCD 16 x 2
  lcd.setBacklightPin(3,POSITIVE); // Enable or Turn On the backlight 
  lcd.setBacklight(HIGH);
  
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("test");
  lcd.setCursor(0, 1);
  lcd.print("-----");
}
 
void loop() {
}

È come se lui visualizzasse una scritta statica senza problemi ma appena deve aggiornare lo schermo desse di matto.

Questa è una prova dichiarando una variabile ed incrementandola ogni due secondi: video

Qui cose indecifrabili: video

Secondo voi sono io che sbaglio qualcosa o è lo schermo?
Grazie mille dell’aiuto.
Fosco

Il primo errore che vedo è che hai postato il codice funzionante e non quello bacato, quindi se vuoi ti possiamo suggerire come bacare quel software per renderlo non funzionante come l'altro :wink:

Hai ragione, scusa.
Questo è l'hello world della libreria: HelloWorld_i2c
Ho dovuto linkartelo perché se provo ad incollare il codice il forum è convinto che io stia facendo un attacco hacker.

Nell'hello world ho modificato solamente la riga dell'indirizzo dello schermo da così

LiquidCrystal_I2C lcd(0x38);

a così (visto che funzionava nel caso di testo statico)

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

questo è il risultato: video
che diventa così se modifico il contrasto dell'lcd: video
Grazie!

Non ho a mente la libreria per cui faccio la domanda a te, perchè non hai semplicemente sostituito l'indirizzo e hai aggiunto anche tutti quei parametri?
Da dove li hai presi?
Hai provato senza ?
Solo con

LiquidCrystal_I2C lcd(0x3F);

Dove hai trovato la libreria?
Perchè quella che ho io non ha un costruttore con tutti quei parametri, ne ha solo 3, oltre all'indirizzo vuole numero di colonne e righe del display.

Quindi da me si dichiara così:

LiquidCrystal_I2C lcd(0x3F,16,2);

La tua non saprei...

La libreria è questa.
Sinceramente ho fatto talmente tante prove che non mi ricordo come mai ho messo anche quei parametri, sicuramente però funzionano nel codice del testo statico e quindi li ho provato ad inserire anche qui.
In ogni caso ho provato sia a mettere solamente 0x3F che l'indirizzo ed il numero di righe e colonne ma il risultato non era migliore.

Ho guardato un po' meglio il link dell'hello world che hai linkato.
Tu l'hai copiato pari pari?
Quel codice lavora con un set di 8 caratteri ridefiniti (non ho analizzato esattamente che caratteri dovrebbero uscire) e sul loop ogni 200mS aggiorna il display pescando caratteri a caso.
Quindi 5 volte al secondo aggiorna le due righe del display.
L'effetto che vedi tu mi sa che è proprio quello voluto.
A naso, vedendo il video, direi che sono dei caratteri con le linee orizzontali in 8 versioni leggermente differenti per dare questo senso di movimento o sfarfallio.

In definitiva, è un hello world un po' cervellotico ma mi pare che ti stia proprio funzionando come previsto.

Ma la libreria che usi è "New LiquidCrystal" ma esattamente qual è (in genere almeno l'autore e versione..) e da dove l'hai scaricata?
Perché ad esempio ne vedo una su BitBucket, di "fmalpartida" ma è vecchissima (per dire, gli sketch hanno ancora estensione PDE!!). Inoltre l'inizializzazione con tutti quei parametri l'ho vista solo nelle versioni di LCD collegati direttamente con tutti i pin... L'inizializzazione per I2C necessita solo dell'indirizzo (nel tuo caso 0x3F) e del numero di colonne e righe, es.:
LiquidCrystal_I2C lcd(0x27, 16, 2);

Io uso quella che trovi su GitHub, di fdebrabander, prova quella e lascia perdere le librerie vecchie di 7 anni... :wink:

Non riesco proprio a capire cosa stia succedendo a questo schermo.
Ho cambiato libreria come suggerito da docdoc, ho provato l’hello world della libreria che mi ha linkato ed ha funzionato. Ho modificato l’hello world facendo aggiornare lo schermo con una variabile che incrementava ogni secondo e veniva stampata a schermo ed ha funzionato, poi ho fatto questo sketch:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

unsigned long secondi;

void setup() {
  lcd.begin();
  lcd.backlight();
  lcd.print("Sono acceso da:");
  lcd.setCursor ( 1, 15 );
  lcd.print ("s");
}

void loop() {
  secondi = millis() / 1000;
  lcd.setCursor ( 1, 1 );
  lcd.print (secondi);
  delay (1000);
}

e funzionava ma non si vedeva bene a schermo, allora ho modificato il contrasto con il cacciavite dal potenziometro dell’I2C ed il risultato è questo: video
Non riesco più a visualizzare lo sketch (che sicuramente funzionava prima di modificare il contrasto).
Avete idea di cosa possa essere?
Grazie

foscone:
e funzionava ma non si vedeva bene a schermo, allora ho modificato il contrasto con il cacciavite dal potenziometro dell'I2C ed il risultato è questo:
Non riesco più a visualizzare lo sketch (che sicuramente funzionava prima di modificare il contrasto).
Avete idea di cosa possa essere?

Modificare il contrasto non può cambiare i caratteri visualizzati, per cui per ora propendo per qualche problema hardware, un contatto fasullo o una saldatura, o cose del genere.

Ci puoi fare una foto ravvicinata (ed a fuoco) sia dei contatti tra schermo e interfaccia I2C, e poi dei cavi che hai usato per collegare l'LCD, e postare qui le foto?

Ecco le foto, ho fatto il possibile per farle a fuoco, meglio purtroppo non riesco a fare: https://photos.app.goo.gl/viCuWuREGJjqGpzWA

Hai uno schermo con annessa una scheda per pilotarlo in I2C per cui ti funzioneranno solo le librerie che usano I2C.

zoomx:
Hai uno schermo con annessa una scheda per pilotarlo in I2C per cui ti funzioneranno solo le librerie che usano I2C.

Chiaro, non mi pare di aver usato librerie che non supportassero I2C.

docdoc:
Ci puoi fare una foto ravvicinata (ed a fuoco) sia dei contatti tra schermo e interfaccia I2C, e poi dei cavi che hai usato per collegare l'LCD, e postare qui le foto?

docdoc si capisce qualcosa dalle foto?

foscone:
docdoc si capisce qualcosa dalle foto?

Mah non mi sembra nulla di strano, giusto le prime 4 saldature da sinistra e la penultima mi sembrano un poco “sospette”. Se te la cavi col saldatore (ossia lo sai usare e sai come non bruciare le piste :wink: ) al posto tuo proverei a ribatterle un poco, aggiungendo un poco di stagno “fresco” dopo averci messo un filo di flussante sulle piazzole scoperte.

Verifica pure che i cavi Dupont che usi siano buoni e non ossidati, magari prova a cambiarli per sicurezza con altri e dicci se risolvi.

Se non andasse, allora ti direi di prendere un altro display nuovo (se ti piace lavorare con Arduino, sono molto utili quasi per qualsiasi progetto :wink: io ad esempio in laboratorio ne ho un paio in più…) esempio da QUI che è uno dei miei fornitori italiani preferiti su eBay. Oppure io trovo anche molto utile QUESTO shield che oltre ad essere, appunto, uno shield quindi facile da collegare, integra anche un comodo tastierino (ma occhio ai pin usati)

Al post 7 hai messo un codice che funzionava.
Hai riprovato? Cioè dopo aver avuto il problema hai provato a resettare e far ripartire tutto per vedere se tornava a posto?

Il sospetto resta sui collegamenti.
Dalle foto, le saldature non sono perfette ma non saltano all’occhio particolari problemi. Diciamo che se fossero migliori si potrebbero escludere in modo certo come problema, così un minimo di dubbio resta.

Suggerirei di ripartire da un codice funzionante, anche solo nel setup e per pochi secondi, e di fare test intensivi su quello.
Quello del post 7 potrebbe andare bene.
Fallo partire e vedi se funzione e dopo quanto smette di funzionare.
Fai più prove per rilevare anomalie statistiche.
Quando inizia a dare problemi, continua a toccarlo per vedere se i problemi restano stabili oppure cambiano nel tempo. Cioè se si evidenzia un comportamento costante, come ad es. lo scorrere regolare dei caratteri strani del tuo video, oppure una variazione del tipo che i caratteri strani aumentano o cambiano dopo un po’.

Se il setup funziona, il display funziona e c’è qualcosa che interviene successivamente.
Comunque, fai un test alla volta, senza cambiare troppo il codice e posta qui i risultati che li analizziamo assieme con calma.
Mi raccomando, codice ed effetti devono essere allineati, qui sul forum, capita spesso che la gente postano a caso e si ottengano effetti che non corrispondono al codice postato, impedendo analisi sensate.
Ad es. se sul codice si stampa “Ciao!” e sul display esce “ciao.” è palese che non c’è corrispondenza… capito cosa intendo?

Quando lampeggia la retroilluminazione è quasi sempre colpa dell'indirizzo. Magari lo hai cambiato usando un altro codice.
Vedi di scoprire quale è l'indirizzo del tuo display con qualche I2C scanner perché potrebbe essere un 27F e non un 03F.
Poi io uso la libreria di TESTATO e non ho mai avuto problemi.

steve-cr:
Quando lampeggia la retroilluminazione è quasi sempre colpa dell’indirizzo. Magari lo hai cambiato usando un altro codice.
Vedi di scoprire quale è l’indirizzo del tuo display con qualche I2C scanner perché potrebbe essere un 27F e non un 03F.

Si vede dalla foto che le tre piazzole A0 A1 e A2 sono aperte ed il chip è PCF8574AT quindi l’indirizzo è sicuramente 0x3F.

Io mi tengo sempre questa immagine come reference:

PS: steve, ma che indirizzo è “27F”? :wink:

Alcune schede non hanno come indirizzo 0x3F ma 0x27
Steve ha solo digitato male andando a memoria, mi sa, ma intendeva 0x27.

Mi sa che dipenda dal cip inserito nella scheda I2C adapter, il PCF8574 dovrebbe avere 0x27 il PCF8574A dovrebbe avere 0x3F.
Quello montato, se non ho visto male è l'A, quindi 0x3F.
Vedi qui
Comunque, se il testo statico lo stampava, non può essere un problema di indirizzo.

maubarzi:
Mi sa che dipenda dal cip inserito nella scheda I2C adapter, il PCF8574 dovrebbe avere 0x27 il PCF8574A dovrebbe avere 0x3F.
Quello montato, se non ho visto male è l'A, quindi 0x3F.

Esatto, è quello che ho scritto anche io nel mio precedente post #15 (postando pure la tabellina, così uno se la salva ed evita ulteriori dubbi)... :wink:

Scusami, ma con questo caldo avevo visto solo la prima colonna, a guardare meglio c'era già tutto li.
sorry

Scusate se non sto rispondendo ma non ho molto tempo, cerco di fare le prove che mi avete suggerito nel fine settimana e posto tutti i risultati.
Grazie per la grande mano che mi state dando!