Datman:
Perché lo "sponsorizzi", allora?Che fa di tanto buono (e utile) rispetto alla LiquidCrystal? Il caffè?
Perché è quella che su I2C è stata riveduta e corretta e da meno problemi di tutte.
Guglielmo
Datman:
Perché lo "sponsorizzi", allora?Che fa di tanto buono (e utile) rispetto alla LiquidCrystal? Il caffè?
Perché è quella che su I2C è stata riveduta e corretta e da meno problemi di tutte.
Guglielmo
Se dovrò andare su I2C (tempo fa acquistai qualche display I2C, sia LCD che LED) lo terrò presente. Grazie ![]()
gpb01:
Perché è quella che su I2C è stata riveduta e corretta e da meno problemi di tutte.Guglielmo
Assolutamente vero. La libreria di Testato non mi ha mai dato problemi mentre le altre hanno sempre qualcosa...
Datman:
Se dovrò andare su I2C (tempo fa acquistai qualche display I2C, sia LCD che LED) lo terrò presente. Grazie
Ho visto le foto delle tue apparecchiature (interessanti) ma se avessi usato I2C ti saresti risparmiato tanti canali e tanti, ma proprio tanti, problemi.
se avessi usato I2C ti saresti risparmiato tanti canali e tanti, ma proprio tanti, problemi.
Perché mai, di grazia? ![]()
Anzi, mi sono divertito a multiplexare l'uscita per un LED e l'ingresso per il partitore per la lettura della tensione della batteria sullo stesso pin! ![]()
Mah... Ho provato a inserire lcd.cursor() (solo per fare una prova) in void visualSecondi(long S) ma, anziché apparire nella riga superiore, appare in quella inferiore, in posizione (13,1)...
if(Ti==TMAX+10)
{
if(dstdPerc<=prec && cpm>0 && cp>20)
{
suonoFine=1;
while(PIND&0x20) {if(millis()%2000>1000) tone(7,1000); else noTone(7);} // Finché non viene premeuto l'encoder fa Biiip - Biiip - Biiip...
noTone(7); while(!(PIND&0x20)); delay (300); // Premuto l'encoder, si tacita e attende che venga lasciato il pulsante.
while(PIND&0x20); // Attende di essere premuto di nuovo per cambiare la visualizzazione.
delay(200);
if(Disp==1)
{
Rad=uSvph; lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); printRad(); lcd.setCursor(6,1); lcd.write(byte(2)); lcd.write(byte(5)); lcd.write(byte(6));
lcd.setCursor(9,0); lcd.print('+'); visualSecondi(temposecondi); // micro Sv /h
}
else scriveDstd();
while(!(PIND&0x20)) {delay(200);} // Attende che venga lasciato l'encoder
while(PIND&0x20) {delay(200);} // Attende una nuova pressione dell'encoder per azzerare.
delay(200);
Azzera();
if(!Disp){lcd.setCursor(6,1); lcd.write(byte(2)); lcd.write(byte(5)); lcd.write(byte(6));} // Se è impostato per visualizzare i uSv/h, lo riscrive.
}
}
tempo+=1;
if(Ti<TMAX && tempo>Ti) tempo=Ti;
temposecondi+=1;
if(Ti<TMAX && temposecondi>Ti) temposecondi-=Ti;
// lcd.setCursor(14,1); if(int(((millis()-millisZero)/1000))%2) lcd.print(":"); else lcd.print(" "); // Fa lampeggiare ":"
// Al posto dei : lampeggianti scrivo il nome della sonda attiva: A o B (v. sopra).
piloLED();
// Se la batteria è scarica, fa lampeggiare la retroilluminazione:
byte resto=millis()%2000; if(Vb<676 && resto!=restoPrecedente) {digitalWrite(A0,!digitalRead(A0)); restoPrecedente=resto;}
} // END una volta al secondo
} // END loop
// --------------------------------------------------------------------------------------------------------------
void visualSecondi(long S)
{lcd.cursor();
if(S<0) S=0;
ore=int(S/3600);
minuti=int((S%3600)/60);
secondi=(S%3600)%60;
if (S<60) {lcd.print(" "); printSecondi(); lcd.print('s');}
else if (S<3600) {printMinuti(); lcd.print('m'); printSecondi(); lcd.print('s');}
else {printOre(); lcd.print('h'); printMinuti(); lcd.print('m');}
}
non è che questa
lcd.setCursor(9,0); lcd.print('+'); visualSecondi(temposecondi);
sommata a questa
if (S<60) {lcd.print(" "); printSecondi(); lcd.print('s');}
ti sposti il cursore al primo carattere della seconda riga?
Il cursore dovrebbe apparire sulla riga del tempo (secondi o minuti e secondi o ore e minuti)...
Datman:
Il cursore dovrebbe apparire sulla riga del tempo (secondi o minuti e secondi o ore e minuti)...
Si ma lcd.cursor(), stando al reference :
"Display the LCD cursor: an underscore (line) at the position to which the next character will be written."
Quindi dato che tu dopo il lcd.cursor() fai una serie di lcd.print() ti si sposta alla fine di ciò che scrivi.
Prova a mettere lcd.cursor() alla FINE di visualSecondi e non all'inizio.
Non riesco a capire se il funzionamento è statico o dinamico, se il trattino viene messo in una posizione fissa o si posiziona continuamente dopo l'ultimo carattere scritto... E' così?
ciao...l'underscore si posizione nello stesso punto del cursor...cioè dove dovresti scrivere il carattere...per esempio se parti dalla posizione 0 di una riga (nulla scritto) l'US sarà alla posizione 0....se scrivi un carattere, quindi posizione 0 piena e cursore automaticamente spostato su posizione 1, che è libera, l'US sarà sulla posizione 1.
se guardi il mio esempio, dove scrivo a random caratteri e do conferme random, ma il cursore rimane sempre nella posizione dove sto scrivendo, non faccio altro che una serie di setCursor() tenendo memorizzate le conferme sul carattere inserito.
Capisco. ![]()
Grazie
Datman:
Non riesco a capire se il funzionamento è statico o dinamico, se il trattino viene messo in una posizione fissa o si posiziona continuamente dopo l'ultimo carattere scritto... E' così?
Eh si, come dicevo "...dopo il lcd.cursor() fai una serie di lcd.print() ti si sposta alla fine di ciò che scrivi".
Il trattino sta SEMPRE dove fai setCursor e si sposta ad ogni print().
Il blink(), invece, rimane sul carattere selezionato?
Dal reference:
blink()
Description
Display the blinking LCD cursor. If used in combination with the cursor() function, the result will depend on the particular display.
Uhmm... ? ? ?
Datman:
Il blink(), invece, rimane sul carattere selezionato?
Non ho ora sottomano un LCD, ma credo che con quel comando dici solo se vuoi che il cursore sia lampeggiante o fisso, ovunque esso sia.
Qui dice "block-style cursor":
Ma perché le informazioni sono sempre all'osso, incomplete e fumose???... ![]()
Datman:
Qui dice "block-style cursor":
https://www.arduino.cc/en/Tutorial/LiquidCrystalBlinkMa perché le informazioni sono sempre all'osso, incomplete e fumose???...
Tutto corretto, tutto bello, ma tanto il blocchetto che lampeggia...non lampeggia!
E non ci sono santi.
E siccome sanno che NON lampeggia, come ho detto poco più su, nel tutorial fanno una lcd.print nel SETUP (capito? così non c'è il refresh video e la riga non viene più scritta), e poi fanno il blink nel VOID.
Sicuramente anche voi le vostre schermate le mettete nel SETUP, vero?.....
Mah !!!
Sono finalmente riuscito a fare una prova e da quel che vedo funziona.
Avevo un codice provvisorio che refreshava il contenuto del display a tempo perchè non avevo ancora scritto la logica definitiva per refreshare solo quando cambia qualcosa.
Ovviamente il mio refresh, essendo rapido, andava a creare casino con il blink e quindi sfarfallava tutto alla velocità della luce.
Rallentando il mio tempo di refresh e lasciando quindi fare al blink è andato tutto a posto.
Ho semplicemente scritto lcd.blink() all'inizio del mio codice che scrive sul display e alla fine della scrittura ho riposizionato il cursore nel punto che volevo far lampeggiare.
Il mio è un display 16x2
quindi scrivendo sempre tutti e 32 i caratteri, se non riposiziono il cursore, "lampeggia fuori schermo"
Per fare la prova ho scritto:
lcd.blink();
... codice che scrive tutto quello che mi serve sull'LCD
lcd.setCursor(2, 1);
lcd.print("#");
lcd.setCursor(2, 1);
Quindi ho messo il cancelletto come terzo carattere della seconda riga e riposizionato il cursore sopra.
Non ci crederete ma ... lampeggia!
steve-cr:
Sicuramente anche voi le vostre schermate le mettete nel SETUP, vero?.....
Ovvio, dentro un while(true) ![]()
EDIT:
Comunque mi piace di più come avevo fatto io, cioè scrivendo in modo alternato il valore e blank a cicli di un secondo, quindi mezzo secondo blank e mezzo secondo valore.
Per due motivi:
EDIT 2:
Anche
lcd.cursor();
lcd.noCursor();
funzionano
Con queste due mi esce la sottolineatura dove c'è il cursore.
EDIT 3:
Io sto usando
#include <LiquidCrystal_I2C.h>
perchè il mio display ha l'interfaccia I2C
Bravo! Grazie ![]()
Sarebbe bello se esistesse un "Blank" temporaneo per un carattere: tolto il "Blank", riappare il carattere che c'era. Temo, però, che il display non abbia una funzione simile.