Ciao a tutti, è normale che un testo se supera i 20 caratteri passa a alla terza riga?
Si tratta di un lcd 20x4 i2c con la libreria LiquidCrystal_I2C.h
Grazie
Ciao a tutti, è normale che un testo se supera i 20 caratteri passa a alla terza riga?
Si tratta di un lcd 20x4 i2c con la libreria LiquidCrystal_I2C.h
Grazie
>Sdreoos: Ciao, so che sei un vecchio utente del forum , ma ... NON riesco a trovare il tuo post di presentazione ... per cui, cortesemente, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo se puoi presentarti IN QUESTO THREAD (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 tutto il su citato REGOLAMENTO, che, nel fattempo, è stato piuttosto ampliato ... Grazie.
Guglielmo
Sdreoos:
Ciao a tutti, è normale che un testo se supera i 20 caratteri passa a alla terza riga?
Si è normale. In pratica è come se fosse un display da 2x40.
gpb01:
>Sdreoos: Ciao, so che sei un vecchio utente del forum, ma ... NON riesco a trovare il tuo post di presentazione ... per cui, cortesemente, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo se puoi presentarti IN QUESTO THREAD (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 tutto il su citato REGOLAMENTO, che, nel fattempo, è stato piuttosto ampliato ... Grazie.
Guglielmo
Ciao Guglielmo, provvedo subito. Grazie
cotestatnt:
Si è normale. In pratica è come se fosse un display da 2x40.
Ciao, non lo sapevo (è la prima volta che uso un lcd) ma immagino ci sia un modo per "mapparlo" nel setup (?)
Potresti allegarmi un esempio? Grazie
Sdreoos:
immagino ci sia un modo per "mapparlo" nel setup (?)
No, la mappatura è a livello del controller del display LCD (e non è nemmeno sempre come nell'immagine che ho linkato, a volte può essere leggermente diversa).
Quello che puoi fare è "gestire" la posizione del cursore riposizionandolo dove te lo aspetti quando scarrella, oppure evitare proprio questa situazione formattando in "modo rigido" il testo da printare (io userei questo approccio).
cotestatnt:
No, la mappatura è a livello del controller del display LCD (e non è nemmeno sempre come nell'immagine che ho linkato, a volte può essere leggermente diversa).
Quello che puoi fare è "gestire" la posizione del cursore riposizionandolo dove te lo aspetti quando scarrella, oppure evitare proprio questa situazione formattando in "modo rigido" il testo da printare (io userei questo approccio).
Urca ! Purtroppo le frasi sono "lette" random da una lista e quindi non posso distribuire le più lunghe "rigidamente" su più righe... ahimè credo che dovrò rinunciare a questo progetto...
Perché?... Tagli e vai a capo...
Datman:
Perché?... Tagli e vai a capo...
Buongiorno, hai un esempio? le frasi sono circa 100 alcune da pochi caratteri alcuni da 30 e più, come faccio a distribuire in "automatico" sulle righe in ordine dalla prima alla quarta? Grazie
Non potendo tagliare le parole a caso, devi necessariamente tagliare le frasi dividendole su più array di caratteri. Scegli un carattere come indicatore di fine della frase e poi, quando a leggere gli array, se in un array (=riga) non c'è l'indicatore di fine, leggi anche il successivo. Altrimenti, se una frase è composta da più righe, puoi mettere alla fine dell'array un numero che indica il numero di righe da cui è composta la frase. Se il numero non c'è (oppure è 1, scegli...) vuol dire che è composta da una sola riga.
Senza vedere il codice voglio supporre che tali stringhe siano stringhe classiche del C e non oggetti della classe String, in tal caso puoi usare le funzioni del C per gestire le stringhe, la cosa più semplice e standard che mi viene da suggerire (ci sarebbero altri modi ma presuppongono una conoscenza che forse non hai ancora acquisito nella gestione delle stringhe del C), hai una stringa in una variabile es.:
char daVisualizzare[81];
Scomponi la stringa in sotto stringhe da 20 caratteri ciascuna e stampi
int idx = 0;
while(idx<strlen(daStampare))
{
char subbuff[21]; //stringa temporanea di appoggio
strncpy( subbuff, &daStampare[idx], 20 ); //copia parte della stringa (20 caratteri) partendo dall'N-esimo carattere
subbuff[20] = '\0'; //Terminatore
//Qui devi stampare la sotto stringa sull'LCD posizionandoti sulla riga corretta di volta in volta
idx += 20; //Avanti di 20 caratteri fino alla fine della stringa da stampare
}
Codice non provato, magari ci sono errori e non considera stringhe la cui lunghezza supera la dimensione massima.
Vedendo il commento di @Datman se le tue stringhe sono frasi da tagliare in punti precisi allora viene ancora più facile perché puoi usare la funzione strtok per prelevare sotto stringhe divice da un terminatore che decidi tu basta inserirlo nella stringa principale Es. "Ciao\nseconda riga\nterza riga\nquarta\0"
Spiega mo bene
Da dove leggi
Fai un esempio di frase da dividere
E come andrebbe divisa
Un'altra possibile implementazione Circuit design LCD line break | Tinkercad
Tinkercad ha solo display da 16x2, ma il principio è lo stesso anche con quelli da 20x4
void printText(const char* text){
lcd.clear();
for(uint8_t i=0; i< strlen(text); i++){
lcd.print(text[i]);
switch (i) {
case 15:
lcd.setCursor(0, 1);
break;
default: break;
}
}
}
void loop() {
printText("Maggiore di 16 caratteri");
delay(3000);
printText("Una nuova stringa lunga lunga");
delay(3000);
}
Edit:
rimosso l'uso della povera classe String
Usando oggetti stringa?
Standardoil:
Usando oggetti stringa?
Ci può mettere anche un const char*, non cambia nulla in questo semplice esempio.
Proviamo così
void printText(char * text){
lcd.clear();
int i=0;
int r=0;
while(text[i]){
lcd.print(text[i++]);
if(!(i%15)){
lcd.setCursor(0, ++r);
}
}
}
void loop() {
printText("Maggiore di 16 caratteri");
delay(3000);
printText("Una nuova stringa lunga lunga");
delay(3000);
}
Preso dal post di cotestant
Dopo aver tolto gli oggetti stringa
Scritto da telefonino, controllate le maiuscole
Edit, ci siamo incrociati
Qui si che puoi usare char * non necessariamente const
Nel tuo non si poteva
Standardoil:
Nel tuo non si poteva
Perché no? Se apri il tinkercad che ho modificato, gira senza problemi. Si const non è necessario, ma io preferisco comunque usarlo se una funzione non deve modificare ciò che gli viene passato come in questo caso e ormai è diventata un'abitudine.
Chiaramente la tua versione è più completa visto che contempla in modo dinamico l'aggiornamento della riga (ma forse la sintassi è un po' ostica per i meno avvezzi)
Hai cambiato il tuo post
Io mi riferivo alla prima versione
cotestatnt:
Ci può mettere anche un const char*, non cambia nulla in questo semplice esempio.
E aggiungo:
Lo hai cambiato "dopo" aver scritto questo citato
Non barare sulle ore, altrimenti non siamo più amici
Mai che vadano, le faccine