Ciao a tutti,ho scelto la sezione generale perchè non saprei indentificare il tipo di problema,se software oppure hardware.
Ho costruito un piccolo timer con arduino ed un display lcd 16x2 con lo zaino i2c.
Ho scritto la funzione che gestisce il conteggio alla rovescia e per gestire il display utilizzando la libreria LiquidCrystal_i2c.h ma col tempo mi sono accorto che dava problemi scrivendo caratteri strani sul display e dopo svariate ore che il display faceva visualizzare lo stesso dato impazziva lasciando lo schermo libero da caratteri ma lasciando la prima riga piena di quadratini come se si fosse alzato il contrasto . Dopo di che ho utilizzato la libreria hd77480(pare la più quotata per utilizzare il display i2c),il problema dei caratteri strani sembra essere scomparso ma ora ne è comparso uno nuovo , ovvero , durante l' esecuzione della funzione(quindi mando i dati al display) il display non fa vedere più nulla e se inclino la testa vedo una sorta di refresch molto lento che parte da destra verso sinistra , dove si accendono debolmente tutti i pixel del quadratino del lcd ma con un contrasto bassissimo senza che si noti nessun carattere precedentemente stampato.
Le connessioni sono solide dato che ho realizzato un pcb e le connessione è realizzata con le classiche strip che i trovano presso i negozi di elettronica.
Qualcuno ha avuto il mio stesso problema? è l'espansore sul display che è "fallato"? dovrei provare a fare una sorta di reflow dell zaino?
Cosa intendi per "zaino I2C"? La schedina di interfaccia che rende il display LCD (tipicamente parallelo) in un display I2C? Link al prodotto?
La libreria migliore (probabilmente in assoluto) per quei display LCD con interfaccia I2C è quella modificata dal utente "Testato" che trovi QUI e per la quale esiste, sul ns. forum, una discussione QUI ... è di questa che stai parlando?
La libreria è dotata di vari esempi ... se provi quelli hai lo stesso problema?
ciao Guglielmo , no la libreria che intendevo è questa scritta da bill parry GitHub - duinoWitchery/hd44780: Extensible hd44780 LCD library
quella da te postata non la conoscevo affatto.
Si per zaino intendo l espansore pfc 8574
Ora proverò ad utilizzare quella libreria per vedere se fa lo stesso difetto.
grazie
Prova quella che ti ho indicato, noi qui, nella sezione Italiana, la usiamo più o meno tutti ... è, come detto, probabilmente una delle migliori e più complete (datti una letta alla discussione di cui ti ho dato il link).
Scrivo perchè ho risolto il problema.Non dipendeva dalla libreria utilizzata ma dal fatto che ho aggiunto dei resisistori di pull up sul bus i2c ignorando che il modulino già le avesse on board.Quindi ho abbassato troppo la resistenza e captava dei disturbi . Ora funziona tutto quanto a dovere.
Grazie
Ciao,
mi sembra strano a meno che non ha messo dei resistori veramente bassi come valore, ad esempio se ci fossero 2x4,7KOhm in parallelo mi aspetto che funzioni lo stesso in quanto fa 2.35KOhm
Ciao jampag,in realtà ho iniziato con una resistore da 4,7 kOhm ma il display sembrava che mi facesse un "piacere" a farmi visualizzare le cose,era molto lento e poco reattivo nel scrivere le cose sul display,cosi sono sceso con la resistenza fino ad arrivare a 2.2kOhm (in pratica 1,4kOhm finale) pensando che era quello il problema,ma persisteva e l ho lasciato cosi.Ma evidentemente la resistenza era cosi bassa che venivano captati dei disturbi.
Comunque riguardo il display addormentato è una cosa random,ovvero un momento è reattivo poi passa ad essere meno reattivo per poi tornare normale.Il concetto di poca reattività per me coincide con il fatto che è lento nel cambiare il testo sul display , la procedura non è netta ma si avvicina ad una dissolvenza.
Giusto , questo è un piccolo esempio , un time delay che blocca l'interfacciamento per 5 minuti tra la consolle e l utente finale.In questo caso a volte i numeri che scorrono sono netti delle volte,sembra che ci sia un miscuglio tra il nuovo e il vecchio carattere
#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
#include <EEPROM.h>
//#include <SoftwareSerial.h>
hd44780_I2Cexp lcd (0x27); // specify a specific i2c address
void time_lock()
{
byte tempo [3] ; //riserviamo una array di 3 posti con profondità byte per memorizzare le ore i minuti e i secondi
byte colonna = 0 ; //variabile per la stampa dei dati compatta
bool time_lock = true ; //gestisce il ciclo while che conta i secodi,nel ciclo while il controlla della variabile è negata
unsigned long tempo_iniziale = 0 ;
unsigned long tempo_trascorso = 0 ;
//dovremmo fare un test per vedere se è attiva la funzione time lock,quindi andiamo a testare il valore della cella n 10
if (EEPROM.read(10) == false) //se il flag è settato su false uscire dalla funzione
{
return ;
}
//carichiamo il valore delle ore,minuti,secondi memorizzati nella eeprom nell array tempo[3]
for (byte i = 0 ; i < 4 ; i++) //incrementiamo la variabile i tre volte col valore 1
{
tempo[i] = EEPROM.read(i+11) ; //mettiamo nell array tempo il valore che è stato memorizzato precedentemente nella EEPROM
}
lcd.clear() ; //da sostituire
lcd.print("TIME-DELAY ATTIVO") ; //stampiamo la prima riga per far vedere cosa sta succedendo
lcd.setCursor(0, 1) ; //andiamo a scrivere sulla 2'riga
lcd.print(" : : ") ; //stampiamo la maschera per vedere il tempo
for (byte i = 0 ; i < 3 ; i++) //il ciclo deve fare tre giri incrementando l'indice dell'array tempo[]
{
lcd.setCursor(colonna,1) ; //settiamo il cursore(colonna,riga)
lcd.print(tempo[i],DEC) ; //stampiamo il valore dell array nella posizione del cursore
colonna = colonna + 3 ; //ci spostiamo di 3 spazi verso destra
}
colonna = 0 ; //resettiamo la variabile per la stampa compressa
//una volta che è stato stampato il tempo iniziale procediamo a sottrarre i secondi per il conto alla rovescia
tempo_iniziale = millis() ; //ci appuntiamo il tempo corrente
while (time_lock)
{
tempo_trascorso = millis() - tempo_iniziale ; //eseguiamo la differenza per identificare il tempo trascorso
if (tempo_trascorso >= 1000) //è passato un secondo?
{
tempo_iniziale = millis();
if (SS == 0) //i secondi sono arrivati a zero?
{
if (MM != 0) //i minuti sono diversi da zero?
{
MM = MM - 1 ; //dcrementiamo i minuti
SS = 59 ; //impostiamo i secondi a 59
}
else if (MM == 0 ) //se il minuti sono zero andiamo a controllare le ore
{
if (HH != 0) //le ore sono diverse da zero?
{
HH = HH - 1 ; //decrementiamo le ore
MM = 59 ; //settiamo i minuti a 59
SS = 59 ; //settiamo i secondi a 59
}
else if (HH == 0) //se i secondi sono zero,i minuti sono zero,le ore sono zero,il conteggio è terminato
{
time_lock = false ;
//dovremmo uscire dal blocco if principale
}
}
} //fine if (SS == 0)
else if (SS != 0 )
{
SS = SS - 1 ; //decrementiamo di 1 i secondi
}
} //fine if (tempo_trscorso >= 1000)
//qui dovremmo stampare il nuovo "orario"
lcd.setCursor(0,1);
if (HH < 10)
{
lcd.print("0") ;
lcd.setCursor(1,1);
}
lcd.print(HH,DEC) ;
lcd.setCursor(3,1);
if (MM < 10)
{
lcd.print("0");
lcd.setCursor(4,1);
}
lcd.print(MM,DEC) ;
lcd.setCursor(6,1) ;
if (SS < 10)
{
lcd.print("0");
lcd.setCursor(7,1) ;
}
lcd.print(SS,DEC) ;
/* for (byte i = 0 ; i < 3 ; i++) //il ciclo deve fare tre giri incrementando l'array tempo[]
{
lcd.setCursor(colonna,1) ; //settiamo il cursore(colonna,riga)
lcd.print(tempo[i],DEC) ; //stampiamo il valore dell array nella posizione del cursore
colonna = colonna + 3 ; //ci spostiamo di 3 spazi verso destra
Serial.println("a");
}
colonna = 0 ; //resettiamo la variabile per la stampa compressa*/
} //fine while (!time_lock)
//time lock terminato
} //fine void time_lock()
spero di aver copiato bene il programma per essere letto nel forum
Il codice non ho avuto tempo di analizzarlo correttamente, ti consiglio di scrivere sul display pochi caratteri al secondo altrimenti vedi tutto offuscato, soprattutto quando si usa male lcd.clear(). Fai delle prove semplici la IDE di Arduino mette a disposizione degli esempi "Liquid Cristal"che dovrai modificare per farli funzionare in i2c.
Ciao Jampag,si ho notato che lcd.clear fa dei bei danni.Ora non lo uso più ma scrivo dei spazi vuoti al posto della funzione lcd.clear e sembra andare meglio e soprattutto ho ristabilito il pull-up a 4,7 khom,da quel momento non ci sono stati più "inceppamenti".
grazie