Problema con lcd 16x02

Salve a tutti, avrei un problema con l'uso di un display 16x02 che non riesco proprio far funzionare.
Sono abbastanza decente con le saldature anche se sicuramente non un esperto, ma ho controllato con il tester e non ci sono cortocircuiti.
In pratica ho provato con sia un codice fatto da me, sia il classico codice "Hello world", ma all'accensione del display compaiono dei quadrati bianchi e nonostante il tentativo di reset non succede nulla.
Il potenziometro funziona correttamente per il contrasto.
Ho provato con due Arduino diversi ma il problema rimane lo stesso...sapreste aiutarmi?

#include <LiquidCrystal.h>
#define RS 12
#define EN 11
#define D4 5
#define D5 4
#define D6 3
#define D7 2
#define PULSANTE 6
#define NFRASI 10

LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

char frasi[NFRASI][16] = {
  "",
  "A<3",
  "B",
  "C",
  "D",
  "E",
  "F",
  "G",
  "H",
  "I",
};

char visFrase = 0;
char old_visFrase = 0;
char old_button;

void setup() {
  lcd.begin(16, 2);
  pinMode(PULSANTE, INPUT);
}

void loop() {
  char button = digitalRead(PULSANTE);

  if (button == LOW && old_button == HIGH)
  {
    visFrase++;
    if (visFrase > NFRASI - 1) visFrase = 0;
  }
  old_button = button;

  if (visFrase != old_visFrase)
  {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(frasi[visFrase]);
    old_visFrase = visFrase;
  }
}

I collegamenti sono stati seguiti alla lettera e come ho detto prima, li ho verificati tutti con il tester, grazie in anticipo per le vostre risposte!

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

Forse i nomi D4 D5 ecc vanno in conflitto con qualche costante predefinita?
Prova a far precedere tutto quello che riguarda l'LCD dal prefisso LCD_ (può essere anche PIPPO_, ma è giusto per dare un prefisso sensato con il suo utilizzo).

Per il resto ottimo l'uso delle variabili 'old_visfrase' e 'old_button' per rilevare gli eventi e lasciare il loop libero di girare.

Niente da fare, continua a non funzionare

I collegamenti nel disegno sembrano giusti.
Per la mia sveglia ho definito le "frasi" nel modo seguente:

const char* gioSett[7] = { "LUN", "MAR", "MER", "GIO",
                           "VEN", "SAB", "DOM"         };

Lato software non so aiutarti, ma lato hardware, quel tipo di display ha sempre avuto dei problemi di stabilita' rispetto ai segnali di controllo, (E, RS, RW e D, ma soprattutto l'Enable E, specie quando vengono collegati tramite cavi) ... potresti fare una prova per vedere se magari dipende da quello invece che dal software (e anche se non fosse, al limite ti sei levato il problema), mettendo in serie a questi pin una R da 100 ohm, e fra ogni pin e GND un condensatorino da 10n (saldati sul display, se possibile)

Anche se di solito i disturbi dati da questi pin sono diversi (caratteri strani o a caso), non si sa mai :wink: ... inoltre controllerei le connessioni, se mancano i segnali di controllo o non fanno contatto bene (basta un falso contatto nella breadboard), nulla viene trasferito dal micro al display.

ciao
io sono passato alla cominicazione I2C meno fili meno problemi, le trovi si ebay a poco

Io ho sempre usato la connessione parallela senza problemi. Ho usato l'I2C solo quando sono stato costretto per mancanza di pin disponibili, per esempio per accendere 17 LED collegati a matrice più encoder e segnali in ingresso.
Sicuramente i collegamenti devono essere corti.
RW puoi ponticellarlo a GND sullo stesso LCD.
Prova questo semplice programmino:

#include <LiquidCrystal.h>
//                Rs En D4 D5 D6 D7
LiquidCrystal lcd(12,11, 5, 4, 3, 2);

void setup()
{
lcd.begin(16, 2);
lcd.print("Funziona!");
}

void loop()
{
}