lcd 20x4 i2c salta una riga

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 :smiley: , 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. :slight_smile:

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 :smiley: , 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. :slight_smile:

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 :astonished: ! 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. :slight_smile:
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