Ciao a tutti
gradirei riuscire a visualizzare sul display lcd il valore della misura della sonda pH (valore float)
compreso di segno - fisso a 5 caratteri fissi.
Mi spiego meglio con un esempio di quello che desidererei ottenere :
Valore reale -0,01 gradirei visualizzare -0,01
Valore reale -1,45 gradirei visualizzare -1,45
Valore reale 0,05 gradirei visualizzare 00,05
Valore reale 11,33 gradirei visualizzare 11,33
con sprintf non posso ottenere valori negativi, corretto ?
con dtostrf ottengo valori negativi perfetti ma il positivo sotto il valore 10 non mi visualizza lo zero davanti
c'è un modo per ottenere come sprintf %02d o %02u sempre due cifre con zero davanti se minore di 10 ?
Spero di aver spiegato bene cosa desidererei ottenere
Grazie in anticipo
con questo codice ho fatto varie prove ma non ottengo ciò che gradirei
void setup()
{
Serial.begin(115200);
}
void loop()
{
int index = 0;
float f = 0.01;
Serial.print("Original value: ");
Serial.println(f);
Mi sempra che sprintf() si comporti come printf(), quindi non hai problemi con numeri float negativi!
Il numero viene stampato correttamente tranne il caso dove vuoi due zeri davanti, prova a vedere se risolvi
cosi...
if(f>=0 && f<10){ // Aggiungo uno zero davanti
sprintf(str,"0%2f",f);
}else
sprintf(str,"%2f",f);
Ho modificato il codice postato perché "ho capito" che vuoi che mosti uno zero se il numero è minore di 10. Prima era f>0 && f<1 "solo se era zero aggiungeva un altro zero" ora invece aggiunge uno zero se la parte intera è minore di 10.
Infatti ho letto che "Arduino has a small limitation in sprintf function that does not print correctly float numbers ... that the float is always formatted a question mark '?'. There is a little trick to correctly print the float value using sprintf.
A better solution is to use the dtostrf function. It it is more flexible and works well also with negative numbers.
So che sprintf è identico a printf quindi per questo mi ero orientato su dtostrf dato che gradirei visualizzare su LCD un valore sempre a 5 caratteri sia in negativo che positivo compreso tra -9.99 e 14.00
-9.99 sono 5 caratteri
-1.99 sono 5 caratteri
02.46 sono 5 caratteri
14.00 sono 5 caratteri
Okay, capito.
Eventualmente, per usare solo sprintf, potresti mettere l'if per verifcare se il numero è negativo,
se negativo usi sprintf passandogli il valore -f (essendo negativo diventa positivo)
char str[10];
if (f >= 0 && f < 10) { // Aggiungo uno zero davanti
sprintf(str, "String value: %02d.%02d", (int)f, (int)(f * 100) % 100);
} else
sprintf(str, "String value: -%02d.%02d", -(int)f, -(int)(f * 100) % 100);
Serial.println(str);
P.S. riguardando la documentazione di sprintf, prova "% 02d.%02" come formato, effettivamente -8 sarebbe -08 ovvero 3 caratteri; mi pare puoi usare uno spazio per il segno (non provato su Arduino)
quindi: printf("% 02d.%02d\n",(int)f, abs((int)(f*100)%100) );
Original value: -1.99
String value: -⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
idem con prontf
Original value: 1.99
String value: 0⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
Original value: -1.99
penso che questa info sia vera
"A better solution is to use the dtostrf function. It it is more flexible and works well also with negative numbers."
Provato su Arduino IDE 1.8.7, core 1.23
effettivamente lo spazio non funziona molto... però non mi da quel casino che hai tu. Sbagli a sparare in buffer tutta la frasona. Ti obbliga a buffer da 50, rischi di uscire dalla memoria.
nid69ita:
P.S. fatte altre prove.
Mi pare se usi spazio, allora la dimensione %0xd deve tenere conto del carattere in più, ovvero % 03d
Innanzitutto GRAZIE per il tuo tempo e per le prove, veramente grazie.
Ho preso il tuo codice e tutto funzione alla grande, tranne che sui valori negativi sotto il valore 1.00
infatti se inserisco un valore compreso tra -0.01 e -0.99 sprintf ti restituisce il valore in positivo
Original value: -0.99
String value: 00.99
come inserisci il valore -1.00 tutto torna a funzionare alla grande
Original value: -1.00
String value: -01.00
Come dicevo penso che la strada corretta sia sprintf per i valori sotto 10 e dtostrf per i negativi e quelli sopra 10 cosi ho tutto corretto
Non so se è un bug di sprintf/printf o se è voluto, ma i float sono sempre complessi da gestire (almeno per me)