string -> double con sei cifre decimali

ciao a tutti,
ho il problema di dover convertire un numero che estraggo da una stringa tramite il comando "substring", assegnandolo a una variabile di tipo double con 6 cifre decimali (trattasi di latitudine/longitudine).

Tramite il comando toDouble(), come noto, mi approssima alla seconda...

come potrei fare? grazie

Innanzitutto evita l'uso della classe String che su MCU di classe Arduino porta a problemi con la memoria ecc. ecc. ormai è un tema ricorrente sul forum cerca e trovi centinaia di topic che sconsigliano l'uso ed il perché, estrai quindi i valori e usa come destinazione un array di char (stringhe classiche del C) e usa la funzione atof

attraverso la string ci devo passare perché ho il valore scritto su una SD in formato testo.

Non mi è chiara una cosa: se io converto VAL = VALORE.toDouble();

in VAL mi ritrovo due sole cifre decimali? dalla documentazione
(toDouble() - Arduino Reference) direi di si, ma se la stampo sulla seriale

Serial.println(VAL, 6);

vedo sei cifre decimali!

lcursi:
attraverso la string ci devo passare perché ho il valore scritto su una SD in formato testo.

:o :o :o ... e quindi ? ? ? Non puoi usare le "stringhe" classiche del 'C' invece che la classe "String" ?

Guglielmo

lcursi:
attraverso la string ci devo passare perché ho il valore scritto su una SD in formato testo.

Non mi è chiara una cosa: se io converto VAL = VALORE.toDouble();

in VAL mi ritrovo due sole cifre decimali? dalla documentazione
(toDouble() - Arduino Reference) direi di si, ma se la stampo sulla seriale

Serial.println(VAL, 6);

vedo sei cifre decimali!

il metodo toDouble della classe string arrotonda a due decimali, quando lo vai a stampare ne vedi 6 ma sono cifre casuali che non corrispondono al reale valore convertito.
Come detto anche da Guglielmo leggi la SD con stringhe classiche del C e poi applica la funzione che ti ho suggerito

Tanto per saperlo, cosa stai facendo?

scusate ma non mi torna.
Il valore di partenza è 10.345678, memorizzato dentro una stringa più lunga nella scheda SD.
Lo estraggo con substring e lo archivio dentro LAT1 (String).
converto LAT1 in double

LAT1_DOUBLE = LAT1.toDouble();
a questo punto dovrebbe essere arrotondato a 10.35

se però lo stampo con Serial.println(LAT1_DOUBLE, 6);
mi ritorna ESATTAMENTE 10.345678, non credo sia un caso..,.

STANDARDOIL: un GPS per softair. Io devo passare le coordinate di un nuovo waypoint tramite schede SD che si trovano lungo il percorso (o che vengono rivelate in determinate posizioni).

Interessante....
E il calcolo della distanza?

Probabilmente c'e' un errore nel reference oppure la libreria è stata modificata ed il reference non è aggiornato

Nella WString.cpp si legge:

double String::toDouble(void) const
{ if (buffer) return atof(buffer);
  return 0;
}

Quindi usa la atof() e quindi nessun arrotondamento

per il calcolo della distanza c'è una funzione apposta nella libreria TinyGPS, che però accetta appunto i valori in double. Da qui tutta la questione :slight_smile:

La domanda era perché, non come

nid69ita:
Probabilmente c'e' un errore nel reference oppure la libreria è stata modificata ed il reference non è aggiornato

Guarda questo è l'esempio che ho scritto al volo:

String SDstring = "LAT1:45.123456;LAT2:10.345678";
int iLAT1,fLAT1;
String LAT1;
double LAT1_VAL;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
iLAT1 = SDstring.indexOf("LAT2:");
LAT1 = SDstring.substring(iLAT1+5,iLAT1+14);
LAT1_VAL = LAT1.toDouble();

Serial.println(LAT1_VAL, 6);
delay(1500);
}

sul monitor seriale vedo 10.345678

Standardoil:
La domanda era perché, non come

eh non era chiaro..
la distanza serva a far "succedere cose" quando ti avvicini. Infatti la distanza non sarà visibile all'utente...

lcursi:
sul monitor seriale vedo 10.345678

Alla luce di quanto riportato da nid la libreria è stata aggiornata quindi è corretto che tu veda tale valore, così com'è non viene più arrotondato. Resta il consiglio di NON usare la classe String

Grazie

lcursi:
Guarda questo è l'esempio che ho scritto al volo:

Visto ed inutile ripostarlo. Ti ho detto che hai ragione e probabilmente il reference non è aggiornato o è errato.

Ma di che modello di Arduino stiamo parlando ? ? ?

Guglielmo

Io ho controllato e postato dal WString.cpp del Core degli Avr