Display con I2C si accende solamente

Salve a tutti, ho provato a fare un progetto natalizio con arduino prendendo tutto da questo sito.
Ho seguito i procedimenti passo passo ed il progetto funziona, l’unica cosa è che ho il display con l’interfaccia i2c integrata e quando vado ad alimentare arduino si accende solamente lo schermo tutto blu, senza i testi delle canzoni.
Avete qualche idea?

Riporto anche il codice sotto

#include <RtttlPlayer.h>
#include <LiquidCrystal_I2C.h>

#define ENABLE_PIN 3
#define CHANGE_PIN 2
#define DEBOUNCE_DELAY 50
#define LED_DELAY 200
#define BUZZER_PIN 4
#define BACKLIGHT_PIN 5

int enableState = LOW;
int enableLastReading = LOW;
unsigned long enableTimestamp = 0;
bool enable = false;
int changeState = LOW;
int changeLastReading = LOW;
unsigned long changeTimestamp = 0;
char *songs[] = {
  "We Wish You a |Merry Christmas:d=4,o=5,b=170:d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,2g,d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,1g,d,g,g,g,2f#,f#,g,f#,e,2d,a,b,8a,8a,8g,8g,d6,d,d,e,a,f#,2g,1p",
  "Jingle Bells:d=4,o=5,b=170:b,b,b,p,b,b,b,p,b,d6,2g.,8a,2b.,8p,c6,c6,c6.,8c6,c6,b,b,8b,8b,b,a,a,b,2a,2d6,1p",
  "Silent Night:d=4,o=4,b=125:f#.,8g#,f#,d#.,p.,f#.,8g#,f#,d#.,p.,2c#6,c#6,a#.,p.,2b,b,f#.,p.,2g#,g#,b.,8a#,g#,f#.,8g#,f#,d#.,p.,2g#,g#,b.,8a#,g#,f#.,8g#,f#,d#.,p.,2c#6,c#6,e.6,8c#6,a#,2b.,2d#6,p.,b,f#,d#,f#.,8e,c#,b.4,1p",
  "Let it Snow:d=4,o=5,b=125:8c,8c,8c6,8c6,a#,a,g,f,2c,8c,16c,g.,8f,g.,8f,e,2c,d,8d6,8d6,c6,a#,a,2g.,8e.6,16d6,c6,8c.6,16a#,a,8a#.,16a,2f.,c,8c6,8c6,a#,a,g,f,2c,8c.,16c,g.,8f,g.,8f,e,2c,d,8d6,8d6,c6,a#,a,2g.,8e.6,16d6,c6,8c.6,16a#,a,8a.,16g,2f.1p"
};
int songsNumber = sizeof(songs)/sizeof(char *);
int songIndex = 0;
bool songChanged = true;
int led[] = { 12, 11, 10, 9, 8 };
unsigned long ledTimestamp = 0;

RtttlPlayer player(BUZZER_PIN);
LiquidCrystal_I2C lcd(0x3f, 16, 2);

void setup(){
  pinMode(ENABLE_PIN, INPUT);
  pinMode(CHANGE_PIN, INPUT);
  for(int i = 0; i < 5; i++){
    pinMode(led[i], OUTPUT);
  }
  randomSeed(analogRead(A0));
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(BACKLIGHT_PIN, OUTPUT);
}

void loop(){
  int enableInput = digitalRead(ENABLE_PIN);
  if(enableInput != enableLastReading){
    enableTimestamp = millis();
  }
  if((millis() - enableTimestamp) > DEBOUNCE_DELAY){
    if(enableInput != enableState && enableInput == HIGH){
      enable = !enable;
      songIndex = 0;
      songChanged = true;
      for(int i = 0; i < 5; i++){
        digitalWrite(led[i], LOW);
      }
      lcd.clear();
      analogWrite(BACKLIGHT_PIN, 0);
    }
    enableState = enableInput;
  }
  enableLastReading = enableInput;

  if(!enable){
    return;
  }

  int changeInput = digitalRead(CHANGE_PIN);
  if(changeInput != changeLastReading){
    changeTimestamp = millis();
  }
  if((millis() - changeTimestamp) > DEBOUNCE_DELAY){
    if(changeInput != changeState && changeInput == HIGH){
      songIndex = ++songIndex % songsNumber;
      songChanged = true;
    }
    changeState = changeInput;
  }
  changeLastReading = changeInput;

  if((millis() - ledTimestamp) > LED_DELAY){
    int randomNumber = random(0, 31);
    for(int i = 0; i < 5; i++){
      digitalWrite(led[i], randomNumber & 1);
      randomNumber >>= 1;
    }
    ledTimestamp = millis();
  }

  if(songChanged){
    player.play(songs[songIndex]);
    songChanged = false;
    lcd.clear();
    analogWrite(BACKLIGHT_PIN, 10);
    String songTitle = player.getSongTitle();
    int songTitleLength = songTitle.length();
    int row = 0;
    int column = 0;
    for(int i = 0; i < songTitleLength; i++){
      if(songTitle[i] != '|'){
        lcd.setCursor(column, row);
        lcd.print(songTitle[i]);
        column++;
      }else{
        row++;
        column = 0;
      }
    }
  }else{
    if(player.isPlaying()){
      player.update();
    }else{
      songIndex = ++songIndex % songsNumber;
      songChanged = true;
    }
  }
  delay(1);
}

Devi verificare quale sia l'indirizzo I2C della board. Tu nel codice hai 0x3f:

LiquidCrystal_I2C lcd(0x3f, 16, 2);

Se è basato sul PCF8574A ha di default quell'indirizzo, ma dato che non ti funziona credo che tu abbia il PCF8574 quindi l'indirizzo di default è 0x27 come puoi leggere QUI.
Per cui prova a cambiare quell'istruzione in:

LiquidCrystal_I2C lcd(0x27, 16, 2);

Grazie docdoc, hai inconsciamente risolto un mio dubbio.
Qualche giorno fa ho provato due interfacce I2C diverse (prima di questo post avrei detto che erano identiche) e la prima ho dovuto inizializzarla con l'indirizzo 0x27 mentre la seconda non mi funzionava e ho impostato l'indirizzo 0x3f.

All'inizio pensavo ci fosse un corto sui 3 jumper saldabili che modificano l'indirizzo.

Comunque l'indirizzo l'ho trovato empiricamente con uno scan autocostruito.
Di fatto ho fatto un loop da 0 a 127 e per ogni valore provo

  Wire.beginTransmission(address);
  byte error = Wire.endTransmission();

e intercetto l'errore.
address è il valore del loop.
error = 0 si ha per indirizzo dove un device ha risposto alla trasmissione con successo, quindi per gli indirizzi cui corrisponde un device.

Poi, ho trovato un altro problema, su uno dei due moduli avevo un jumper che metteva in corto i due pin dal lato del led.
Era il primo modulo che ho provato e non ho avuto problemi.
Metto l'immagine per mostrare il jumper che mette in corto i 2 pin.

Il secondo modulo che ho provato non aveva il jumper e non mi funzionava, si illuminava malissimo e si vedevano le scritte sbiadite e sfocate tenui tenui mettendo al massimo la luminosità.
Ho cortocircuitato ed ha funzionato tutto.

Prova a vedere se anche tu sei incappato in uno di questi due problemi.

Poi, ho visto che uno dei due pin finisce sul pin 5 di arduino ma non ho letto bene il codice per capire a cosa serve, forse per fare qualche effetto anche con la luminosità del display, comunque puoi provare mettendo in corto i pin per vedere se il problema è quello e poi ricollegare il tutto per farlo funzionare come nel sito che hai postato.

ciao

P.S.
Ovviamente hai già provato a regolare la luminosità con il potenziometro, giusto?

maubarzi:
Il secondo modulo che ho provato non aveva il jumper e non mi funzionava, si illuminava malissimo e si vedevano le scritte sbiadite e sfocate tenui tenui mettendo al massimo la luminosità.
Ho cortocircuitato ed ha funzionato tutto.

Certo, quello è il jumper che comanda la retroilluminazione. Ma senza jumper non dovrebbe "illuminarsi malissimo" ma non illuminarsi affatto, però le scritte si devono vedere, anche se con difficoltà.

Poi, ho visto che uno dei due pin finisce sul pin 5 di arduino ma non ho letto bene il codice per capire a cosa serve, forse per fare qualche effetto anche con la luminosità del display

Si, si fa così per poter controllare da codice l'accensione (o intensità) della retroilluminazione.

Ovviamente hai già provato a regolare la luminosità con il potenziometro, giusto?

Il potenziometro regola il contrasto, non la luminosità.

Grazie per le giuste precisazioni

Vero anche il discorso del jumper, io senza vedevo malissimo, intravvedevo solo le scritte.

docdoc:
Il potenziometro regola il contrasto, non la luminosità.

si, ho sbagliato parola, infatti dice che si accende ma non si legge nulla e questo può dipendere dal contrasto.
Un nabbo come me, la prima volta c'è cascato con tutte le scarpe.

maubarzi:
Un nabbo come me, la prima volta c'è cascato con tutte le scarpe.

Siamo tutti nabbi in qualcosa, non preoccuparti.. :slight_smile: Anche chi è ferratissimo in elettronica magari è nabbo in programmazione o il contrario, per cui siamo qui nel forum tutti per imparare e per aiutare gli altri.

maubarzi:
Grazie per le giuste precisazioni

Vero anche il discorso del jumper, io senza vedevo malissimo, intravvedevo solo le scritte.

Il display BLU non è come quello giallo: è sicuramente più carino, blu notte, ma senza retroilluminazione è molto difficile leggerlo.