LCD GDM1602H strano comportamento

Ciao a tutti,
é da qualche ora ormai che sto sbattendo su un fessissimo lcd 16X2 fatto da xiamen ocular.
riscontro 2 comportamenti strani:
con il seguente codice di prova:

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int ledPin = 13;		    // LED connected to digital pin 13
int recvPin=0;
int wait=1000;
int val=0;
void setup()
{
  // Print a message to the LCD.
  
   pinMode(ledPin, OUTPUT);	// sets the digital pin as output
  Serial.begin(9600);
  lcd.print("  ...Loading...");
}

void loop()
{
  
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(wait);			// waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(wait);			// waits for a second
  lcd.clear();
  val=analogRead(recvPin);
  Serial.print("Value:");
  lcd.print("Value:");
  Serial.println(val);
  lcd.setCursor(0,1);
  lcd.print(val);
}

la prima riga viene visualizzata correttamente.
la seconda riga non viene visualizzata, e questo è il primo problema…
se aggiungo al setup la riga lcd.begin(16,2); non funziona più nulla ed il display rimane buio, e qesto è il secondo :).
che diavolo può essere?
edit:
il datasheet del display
http://www.adrirobot.it/datasheet/LCD/PDF/GDM1602H_1.pdf

BrainBooster: che diavolo può essere?

Un problema legato a come deve essere usata la memoria del display che non corrisponde a come la usa la libreria.

When 1-line display mode (N=LOW), DDRAM address is form “00H” to “4FH” In 2-line display mode (N=High), DDRAM address in the 1st line form “00H” to “27H”, and DDRAM address in the 2nd line is GDM1602H from “40H” to “67H”.

ma avevo letto da qualche parte che era compatibile con l’hd44780 :cold_sweat: e quindi pensavo anche con liquidcrystal…
quindi dovrei modificare la libreria per correggere gli indirizzamenti?

BrainBooster: ma avevo letto da qualche parte che era compatibile con l'hd44780 :cold_sweat: e quindi pensavo anche con liquidcrystal...

La "fregatura" con questi display è che la compatibilità si ferma ai segnali di controllo e i comandi standard, per tutto il resto ogni produttore fa come gli pare. Il tuo display ha due modalità di gestione della memoria, la prima, " 1-line display mode (N=LOW)”, non è compatibile con lo standard HD44780, la seconda, " 2-line display mode (N=High)", è compatibile con lo standard, quasi sicuramente il tuo display si avvia con la prima modalità. Fai un esperimento, scrivi di seguito 80 caratteri, cioè tutta la memoria, senza eseguire nessun salto cursore, se ti si riempie anche la seconda riga allora il problema è proprio nell'indirizzamento della memoria.

no, riempie solo la prima riga :( nonostante lo stringone

BrainBooster:
no, riempie solo la prima riga :frowning: nonostante lo stringone

Allora il problema sta da un’altra parte, e non escludo che sia difettoso il display perché inviando 80 caratteri devono per forza di cose riempirsi tutte le righe.

dici che posso usare la libreria di peter fleury con arduino?

Mi sono ricordato di avere nel cassetto un display 16x2 della Xiamen, l'ho collegato ad Arduino e con il programma esempio "hello world" funziona perfettamente, nella prima riga appare "hello world", nella seconda riga il conteggio dei secondi dall'avvio. Ho provato il tuo programma e mi funziona, però la "lcd.begin(16, 2);" è indispensabile perché setta il modo memoria per le due, o quattro, righe, senza mi scrive solo sulla prima riga e mai sulla seconda anche riempendo la memoria. Se con la "lcd.begin(16, 2);" non ti appare nulla sul display vuol dire che c'è un reale problema con il tuo display, per sicurezza prova con l'esempio hello world e collega i fili come descritto nell'header.

dici di collegarlo come quello dell'esempio?

BrainBooster: dici di collegarlo come quello dell'esempio?

In teoria non dovrebbe cambiare nulla come l'hai collegato tu, il fatto stesso stesso che ti appare la scritta vuol dire che i segnali dati e di controllo arrivano correttamente, però per scrupolo usa la connessione indicata nell'esempio, devi solo spostare un filo e mettere a GND R/W. Io la prova l'ho fatta con la connessione suggerita nell'esempio, al tuo software ho solo modificato la riga di setup delle connessioni in accordo a quella dell'esempio.

...fatto risultato: se lascio lcd.begin il display non nostra nulla se lo tolgo vedo solo la prima riga. ho provato anche l'esempio serial display ed ho gli stessi risultati :( .....eppure quando regolo il contrasto vedo che si anneriscono anche i rettangoli della seconda riga....

BrainBooster: se lascio lcd.begin il display non nostra nulla se lo tolgo vedo solo la prima riga.

Mi sa tanto che il tuo display ha qualche problema hardware.

.....eppure quando regolo il contrasto vedo che si anneriscono anche i rettangoli della seconda riga....

Questo è normale perché il contrasto agisce sulla polarizzazione del lcd, variandolo passi dal vedere tutti pixel quasi completamente neri, e non visualizzi più nulla, fino a far sparire completamente la scritta.

conosci qualche modo per fare diagnostica sulla seconda riga?
… qualche comando diretto o qualcosa i simile che bypassi la libreria?

BrainBooster: .. qualche comando diretto o qualcosa i simile che bypassi la libreria?

Il modo più semplice è riempire il buffer della memoria video, ovvero scrivere di continuo 80 caratteri, in questo modo devono riempirsi per forza di cose tutte le righe del display. La ""lcd.begin(16, 2)" è indispensabile perché setta il flag N del display in modo da adattarlo dalla singola riga, default all'accensione, al multirighe, ho controllato il sorgente della libreria e fa proprio questo, cioè la libreria tiene già conto di questo comando. Dato che a me un display identico al tuo funziona senza problemi la cosa più ovvia a cui pensare è che il tuo display è difettoso, credo di poter escludere un problema di collegamenti visto che almeno sulla prima riga riesci a scrivere, se c'era una connessione sbagliata ti rimaneva vuoto.

come dicevo prima con l'esempio serial display ho provato a mandare stringhe di 80 caratteri ed oltre che sembrano generare una specie di buffer overflow sul contrller, che costringe al reset :( però sempre senza usare lcd.begin ....inizio anch'io a pensare che sia scassato =( p.s. come si vede dal codice, sto comandando il display a 4bit ... se può fare qualche differenza

confermo :( è scassato. ne ho provato un'altro sempre hd44780compatibile e funziona correttamente. Grazie astrobeed per averci provato :)

BrainBooster: sto comandando il display a 4bit ... se può fare qualche differenza

Solo sulla velocità di trasmissione. Altrimenti non ti avrebbe visualizzato niente neanche sulla prima riga.