Comandare display LCD con i2c

Salve a tutti, sono nuovo..

Volevo chiedervi se per cortesia mi potreste dare una mano con il problema che ho.

Voglio pilotare un display LCD 16x2 con un schedina, fornita insieme ad esso, così detta I2C.
Cercando in internet ho trovato diverse guide, con diverse librerie (, ma nessuna di queste ha funzionato. Sul display rimane sempre la prima riga con quadrati colorati. Fissa, non si schioda di lì.
Ho provato a cambiare codice e libreri ma nulla non riesco a smuovere la situzione.

ps: tutto rigorosamente cinese.. :slight_smile:

l'LCD è: QAPASS 1602A
Arduino UNO
sull'I2c non ce scritto nulla..

Chiedo il vostro aiuto per risolvere.
Grazie a tutti :wink:

Buonasera e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Se ci fai vedere il tuo codice (mettilo racchiuso tra i tag mi raccomando) e ci dici come hai connesso il display possiamo aiutarti...

Questo è il codice che utilizzo:

//Include le librerie
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
// Imposta l'indirizzo del display a 0x27 per 16 caratteri per 2 linee
LiquidCrystal_I2C lcd(0x27,16,2);  
void setup()
{
  lcd.init();// inizializza il display
  lcd.backlight();//accende la retroilluminazione
}
void loop()
{
  // Scrittura dei testi sul display
  lcd.setCursor(0, 0);
  lcd.print("1234567812345678");
  delay (1000);
  lcd.setCursor(0, 1);
  lcd.print("ABCDEFGHILMNOPQR");
  delay (1000);
  lcd.setCursor(0, 0);
  lcd.print("8765432187654321");
  delay (1000);
  lcd.setCursor(0, 1);
  lcd.print("8888888888888888"); 
  delay (1000);
}

Mi da questo errore:

Programma_test:8: error: 'class LiquidCrystal_I2C' has no member named 'init'

   lcd.init();// inizializza il display

       ^

exit status 1
'class LiquidCrystal_I2C' has no member named 'init'

L'ho collegato in questo modo

beh, l'errore parla chiaro, direi... non puoi usare l'istruzione lcd.init(); perché il metodo init non esiste...
forse hai preso il codice di una libreria diversa da quella che usi.

io uso questa:
https://bitbucket.org/fmalpartida/new-liquidcrystal/overview

con questo codice:

//includo la libreria per la gestione del display LCD
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

// DISPLAY LCD I2C
// set the LCD address to 0x27
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);


void setup() {
  // inizializzo LCD
  lcd.begin(16,2);
  // attivo la retro-illuminazione
  lcd.setBacklightPin(3,POSITIVE);  
  lcd.setBacklight(HIGH);
  lcd.home (); // go home

  // scrivo un messaggio di attesa
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("ABCDEFGHILMNOPQ");
  lcd.setCursor(0,1);
  lcd.print("abcdefghilmnopq");

}

e non ho problemi...

Barkhausen:
Mi da questo errore:

Programma_test:8: error: 'class LiquidCrystal_I2C' has no member named 'init'

lcd.init();// inizializza il display

^

exit status 1
'class LiquidCrystal_I2C' has no member named 'init'

L'inizializzazione, con la LiquidCrystal_I2C , si fa con il metodo "begin", d'altronde tra gli esempi c'è questo HelloWorld:

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

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
	// initialize the LCD
	lcd.begin();

	// Turn on the blacklight and print a message.
	lcd.backlight();
	lcd.print("Hello, world!");
}

void loop()
{
	// Do nothing here...
}

Se non hai questo esempio credo tu abbia una libreria vecchia (io ho questa) o un pacchetto difettoso o è stata installata male...

fratt:
beh, l'errore parla chiaro, direi... non puoi usare l'istruzione lcd.init(); perché il metodo init non esiste...
forse hai preso il codice di una libreria diversa da quella che usi.

io uso questa:
https://bitbucket.org/fmalpartida/new-liquidcrystal/overview

con questo codice:

//includo la libreria per la gestione del display LCD

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

// DISPLAY LCD I2C
// set the LCD address to 0x27
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);

void setup() {
  // inizializzo LCD
  lcd.begin(16,2);
  // attivo la retro-illuminazione
  lcd.setBacklightPin(3,POSITIVE); 
  lcd.setBacklight(HIGH);
  lcd.home (); // go home

// scrivo un messaggio di attesa
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("ABCDEFGHILMNOPQ");
  lcd.setCursor(0,1);
  lcd.print("abcdefghilmnopq");

}




e non ho problemi...

Purtroppo mi da questo errore... (ho scaricato quella libreria e reinstallato Arduino e rimosso tutte le librerie vecchie)

C:\Users\eliab\AppData\Local\Temp\ccGN0gWA.ltrans0.ltrans.o: In function `main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Ma lo vedi cosa ti dice il compilatore ?

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

... ovvero che manca la funzione void loop() nel tuo programma (funzione che è obbligatoria assieme alla void setup()).

Metti l'intero programma così si può vedere cosa hai scritto (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

gpb01:
Ma lo vedi cosa ti dice il compilatore ?

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

... ovvero che manca la funzione void loop() nel tuo programma (funzione che è obbligatoria assieme alla void setup()).

Metti l'intero programma così si può vedere cosa hai scritto (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

Ho utilizzato il codice di fratt poco sopra e ho notato che mancava il void loop..
aggiunto quello lo compila ma mi da un diverso errrore:

Arduino:1.8.2 (Windows 10), Scheda:"Arduino/Genuino Uno"

Lo sketch usa 3388 byte (10%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 258 byte (12%) di memoria dinamica, lasciando altri 1790 byte liberi per le variabili locali. Il massimo è 2048 byte.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x4e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x4e
Problema di caricamento sulla scheda. Guarda http://www.arduino.cc/en/Guide/Troubleshooting#upload per suggerimenti

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Quello è tutt'altro problema ... "Problema di caricamento sulla scheda" ... il codice è stato compilato correttamente, ma l'IDE NON riesce a parlare con Arduino UNO per caricarcelo ... ::slight_smile:

Hai selezionato la giusta porta COMx: ? E' un Arduno UNO originale o un clone ? Hai provato a cambiare il cavi USB ?

Guglielmo

gpb01:
Quello è tutt'altro problema ... "Problema di caricamento sulla scheda" ... il codice è stato compilato correttamente, ma l'IDE NON riesce a parlare con Arduino UNO per caricarcelo ... ::slight_smile:

Hai selezionato la giusta porta COMx: ? E' un Arduno UNO originale o un clone ? Hai provato a cambiare il cavi USB ?

Guglielmo

Allora dopo tentativi sono riuscito a caricare il codice su arduino questo:

//includo la libreria per la gestione del display LCD
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

// DISPLAY LCD I2C
// set the LCD address to 0x27
LiquidCrystal_I2C  lcd(0x22,2,1,0,4,5,6,7);


void setup() {
  // inizializzo LCD
  lcd.begin(16,2);
  // attivo la retro-illuminazione
  lcd.setBacklightPin(3,POSITIVE);  
  lcd.setBacklight(HIGH);
  lcd.home (); // go home

  // scrivo un messaggio di attesa
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("ABCDEFGHILMNOPQ");
  lcd.setCursor(0,1);
  lcd.print("abcdefghilmnopq");

}

void loop() {
  // put your main code here, to run repeatedly:

}

Purtroppo non cambia assolutamente niente.. non da nessun tipo di errore, completa il caricamento ma non si smuove il display..

Arduino è un clone cinese e pure il display e l'I2C.. ma mi sembra strano che dipenda da quello..

Sicuro che l'indirizzo IIC del tuo display sia 0x22 e non 0x27?
Poi perché aggiungi la linreria LCD.h?
E infine perché hai tutti quei parametri? Devi definire l'oggetto lcd come ti avevo scritto, ossia

LiquidCrystal_I2C lcd(0x27, 16, 2);

docdoc:
Sicuro che l'indirizzo IIC del tuo display sia 0x22 e non 0x27?
Poi perché aggiungi la linreria LCD.h?
E infine perché hai tutti quei parametri? Devi definire l'oggetto lcd come ti avevo scritto, ossia

LiquidCrystal_I2C lcd(0x27, 16, 2);

Ho fatto come mi hai detto, e il programma lo compila e carica (ho usato la libreria che mi hai detto e il codice quello dell esempio hello world).
Purtroppo non succede niente... caricato è caricato sicuramente, ma lcd rimane uguale 1righa tutta nera e seconda vuota.
Cosa puo essere? Indirizzo sbagliato? Ho provato con 0x27 e 0x20 ma niente..

Lo sai che per controllare a che indirizzo è l' LCD c'è un apposito sketch ?
http://playground.arduino.cc/Main/I2cScanner

Barkhausen:
Purtroppo non succede niente... caricato è caricato sicuramente, ma lcd rimane uguale 1righa tutta nera e seconda vuota.

Una riga nera e una bianca comunque mi sembra strano...
Per tagliare la testa al toro, prova a seguire passo-passo le cose descritte QUI, è un articolo del "solito" Mauro Alfieri, dove trovi tutte le informazioni su quei display, incluso come determinare l'indirizzo.
Se neanche così ti funziona, temo che sia guasto o il display o la basetta di interfaccia I2C.
Facci sapere.

Altro link che io consiglio sempre è questo:

https://arduino-info.wikispaces.com/LCD-Blue-I2C

Prova TUTTE le soluzioni proposte lì.

lcd.init(); è tipico della libreria fornita da osoyoo e funziona anche con i display LCD che non sono suoi. Ti consiglio di usare la sua libreria invece delle altre perché il costruttore è molto più semplice.

Forse ho individuato il problema... la basetta I2C non viene trovata, infatti con il programma per identificare l'indirizzo mi dice che non è stato trovato nessun dispositivo

Scanning...
No I2C devices found

credo che a questo punto sia necessario collegarlo alla vecchia maniera o acquistare un'altra basetta I2C..

Ma che indirizzo hai settato con i pin A0 A1 A2 ?

Barkhausen:
Forse ho individuato il problema... la basetta I2C non viene trovata

Ripeto, che ti mostri una riga nera e una bianca mi sembra strano e non mi sembra che una interfaccia I2C difettosa possa fare questo.
Prova a seguire le cose descritte nella pagina che ti ho indicato (QUESTA), e facci sapere.
Io ne ho sati svariati di display cinesi come il tuo, alcuni anche acquistando separatamente l'adattatore I2C che ho saldato io, e mai avuto questi problemi.