Go Down

Topic: Aggiornamento incoerente della varibile scritta nell'LCD (Read 672 times) previous topic - next topic

_pier

Salve a tutti,
espongo un problema che sembra assai banale ma che non riesco a risolvere.
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).
Naturalmente il tutto è assegnato ad un variabile (tipo unsigned int).
Tale varibile la vorrei stampare in uno schermo LCD (16x4) che ho collegato in I2C.
La varibile assume 16 valori, 10 a singola cifra (0,1,2,3,4,5,6,7,8,9) e 6 a cifra doppia (10,11,12,13,14,15).
Quando la variabile assume valori in cifra singola nessun problema nell'LCD, ma se la variabile assume un valore a doppia cifra e poi torna ad un valore a singola cifra, la cifra delle decine rimane stampata, creando confusione in chi legge l'LCD.

ESEMPIO, se in successione la variabile assume i seguenti valori:
valore variabile: 9     =    valore in LCD: 9
valore variabile: 14   =    valore in LCD: 14
valore variabile: 2     =    valore in LCD: 12

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

Non so se mi sono spiegato sufficientemente.
Se qualcuno ha colto il mio problema, potrebbe aiutarmi?
Grazie in anticipo,
Pier

fabpolli

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

Standardoil

Che strano, avrei piuttosto pensato rimanesse 24 invece che 12....
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Patrick_M

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
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

docdoc

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.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

uwefed

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

Silente

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?

geco87

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

Code: [Select]


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(" ");}
 

_pier

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:
Code: [Select]

#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??

docdoc

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?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

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

fabpolli

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ì:

Code: [Select]

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

nid69ita

@_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
my name is IGOR, not AIGOR

docdoc

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:

Code: [Select]
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... ;)
Inoltre io lo allineerei a destra, ossia farei così:

Code: [Select]
  char msg[17];
  sprintf(msg, "[Spostamento:%3d]", Sfasamento);
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

fabpolli

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... ;)
Hai perfettamente ragione ho sbagliato a contare...  :smiley-confuse:
Lo schermo è 20x4 se non erro quindi ci sta :)

Go Up