Aggiornamento incoerente della varibile scritta nell'LCD

Così alla cieca ti dico che il problema deriva dal posizionamento del cursore cull'lcd quando stampi i valori, se posti il codice ti arriveranno risposte più precise

Che strano, avrei piuttosto pensato rimanesse 24 invece che 12....

molto semplicemente posizioni il cursore e scrivi 2 spazi vuoti (così cancelli quello che c'era sotto) quindi riposizioni il cursore e scrivi il tuo numero

_pier:
Nell'ultimo caso la variabile è passata a due, ma LCD non "cancella" la cifra della decina scritta precedentemente quando la varibile era 14.

Il problema mi sembra così semplice che non so se ho capito...
Se tu devi mostrare un valore che può avere una o due cifre, devi mostrarlo sempre con il numero massimo di caratteri. Quindi se minore di 10 devi scrivere prima uno spazio (o uno zero) e poi il valore.
Se sai fare una "if()", è una riga di codice.

_pier:
Leggo il valore di un potenziometro (da 0 a 1024) e lo "rimappo", con la funzione map(), all'interno di un intervallo molto più ristretto(0-15).

No, analogRead legge valori da 0 a 1023 non 1024
Ciao Uwe

Devo ammettere che non comprendo il problema.
Sembra che fino a che stampi numeri a una cifra va bene, fino a che stampi numeri a due cifre va bene, se passi da una cifra a due cifre va bene, mentre se passi da due cifre a una cifra ottieni stampato un numero che ha per decine le decine del precedente numero a due cifre, mentre per unità la cifra nuova. Non dovrebbe essere il contrario? Nel senso, non dovrei avere le unità della vecchia cifra, ma alle decine la nuova?
Perché se io ho due spazi, e mi posiziono sul primo, e ci scrivo (esempio) 9 ottengo
'9' ' '
perché il programma non sa che lo voglio a due cifre, quindi lo scrive dalla prima.
Se ora mi riposiziono sulla prima scrivendo 12 ottengo
'1' '2'
perché il programma scrive le cifre in ordine a partire dalla posizione più alta (decine) che va nella posizione in cui si trova (la prima).
Il punto è che se ora mi rimetto sulla prima e scrivo 5, per quella logica dovrei avere
'5' '2'
perché il programma scrive il 5 sulla prima. Poi il numero è finito, quindi non cancella il 2 precedente, derivante dal 12. Numero che rimarrà fino a che non scrivo di nuovo un numero a due cifre.
Me lo spiegate?

il tuo medesimo problema l'ho avuto anche io, credo che ci sia un sistema per formattare variabili di tipo numerico da visualizzare su display, ma io ho adottato questo stratagemma
ipotizzando che vado a scrivere alla cordinata x,y per valori <10 imposto la cordinata di scrittura x= x+1 e scrivo due spazi mentre con valori <100 imposto la cordinata di scrittura x= x+2 e scrivo uno spazio

lcd.setCursor(0, 0);
lcd.print(max_potenza);

if ((max_potenza)<10){lcd.setCursor(1, 0);lcd.print("  ");}
if ((max_potenza)<100){lcd.setCursor(2, 0);lcd.print(" ");}

Ciao a tutti,
mi scuso per il ritardo ma ho avuto problemi che mi hanno tenuto lontano dal Pc.
Ho scritto una inesattezza che Uwe ha subito puntualizzato, grazie. Grazie anche a chi ha chiuso un occhio ed è andato oltre!

Il codice è questo:

#include <LiquidCrystal_I2C.h> 

 
LiquidCrystal_I2C schermo(0x27, 20, 4); 
int unsigned LetturaSfasamento = 0;
int Sfasamento = 0;

void setup() {

  
}

void loop() {

  LetturaSfasamento = analogRead(A0);
  Sfasamento = map(LetturaSfasamento,0,1023,-15,15);

  
   schermo.setCursor(0,0);
   schermo.print("Spostamento:"); 
   schermo.print(Sfasamento); 
   
  
}

Ho fato un copia incolla di un codice molto più ampio. Ma in sostanza il problema accade con questo codice.
Sono pronto ad inginocchiarmi sui sassi, dov'è lo strafalcione?
Sarà mica quell'unsigned che da fastidio??

_pier:
Sfasamento = map(LetturaSfasamento,0,1023,-15,15);

Ma in sostanza il problema accade con questo codice.
Sono pronto ad inginocchiarmi sui sassi, dov'è lo strafalcione?
Sarà mica quell'unsigned che da fastidio??

Eh beh direi che se la variabile è unsigned come pretendi di metterci valori tra -15 e 15?
Togli "unsigned" e questo primo problema è superato, poi quale altro problema riscontri esattamente?

docdoc:
Eh beh direi che se la variabile è unsigned come pretendi di metterci valori tra -15 e 15?
Togli "unsigned" e questo primo problema è superato, poi quale altro problema riscontri esattamente?

Sfasamento è int non unsigned int

Da come è stato impostato il codice mi verrebbe da dire che dovresti vedere il codice come diceva @Standardoil nel post #2, comunque puoi provare così:

char msg[21];
sprintf(msg, “Spostamento: %-7d”, Sfasamento);
schermo.setCursor(0,0);
schermo.print(msg);

@_pier secondo me quel pezzo di codice NON ha il problema che indichi tu al primo post.
Al massimo può avere il problema se stampi 14 e poi 2 ma vedresti 24 ovvero il due va sull'1 perché Arduino dal codice non lo sà che prima c'erano 2 cifre.

La cifra è tra -15 e 15, quindi 3 posizioni. invece di -7d bastano -3d
Poi banalmente, puoi anche fare
schermo.print(Sfasamento); schermo.print(" "); // 2 spazi al fondo

fabpolli:
Sfasamento è int non unsigned int

Ah si scusa.
Analogamente a quanto detto prima, se devi visualizzare un valore comprensivo di segno tra -15 e 15 devi prevedere sempre 3 caratteri, non fare solo la print().
Per farla "a mano" in modo semplice una cosa del genere quindi:

void printSfasamento(int s) {
  if ( s< 0 ) {
    schermo.print("-");
    s*= -1; // lo riporta positivo
  } else {
    schermo.print(" ");
  }
  if ( s< 10 )
    schermo.print("0"); // o " "
  schermo.print(s);
}

Anche il suggerimento di fab polli è valido ovviamente, ma occhio che la stringa "Spostamento: " è di 13 caratteri, su un LCD da 16 non puoi metterne altri 7... :wink:
Inoltre io lo allineerei a destra, ossia farei così:

  char msg[17];
  sprintf(msg, "[Spostamento:%3d]", Sfasamento);

docdoc:
Anche il suggerimento di fab polli è valido ovviamente, ma occhio che la stringa "Spostamento: " è di 13 caratteri, su un LCD da 16 non puoi metterne altri 7... :wink:

Hai perfettamente ragione ho sbagliato a contare... :confused:
Lo schermo è 20x4 se non erro quindi ci sta :slight_smile:

fabpolli:
Lo schermo è 20x4 se non erro quindi ci sta :slight_smile:

Hm, veramente io nel suo post leggo:

Tale varibile la vorrei stampare in uno schermo LCD (16x4) che ho collegato in I2C.

Si ma nel codice che ha postato al messaggio #8 c'è

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C schermo(0x27, 20, 4);

Quindi ha sbagliato a scrivere (o non sa cosa ha attaccato realmente) ed è giusto il codice oppure ha scritto giusto (e sa cosa ha attaccato realmente) e ha sbagliato a scrivere il codice (forse sarebbe meglio dire "copiaincollatoilcodice")

io credo che il problema "dimensione" sia ampiamente "sovradimensionato", scusate il gioco di parole
econdo me se legge sia una che due cifre, che il display sia da 20, 16 o millemila, "comunque" è sufficente per contenere le scritte, non trovate?

Standardoil:
io credo che il problema "dimensione" sia ampiamente "sovradimensionato", scusate il gioco di parole
econdo me se legge sia una che due cifre, che il display sia da 20, 16 o millemila, "comunque" è sufficente per contenere le scritte, non trovate?

Si ma il fatto è scaturito dalla mia formattazioen della sprintf che aggiungeva 7 caratteri in più alle due cifre e alla stringa impostata dall'utente, in 16x2 non ci sta in 20x4 si tutto li... :slight_smile:

Beh, comunque aspettiamo feedback dall'OP, vediamo se ha risolto.