Ciao a tutti,
ho la necessità di catturare all'interno di variabili i dati provenienti da un modulo GPS.
Ho utilizzato la libreria TinyGPS e un suo programma di esempio (test_with_gps_device.pde), che però redireziona l'output direttamente sulla seriale (terminale) dopo aver prima parserizzato i dati.
In particolare non riesco ad estrarre valori float, come ad esempio le coordinate.
Mi spiego meglio.
La routine di lettura gpsdump(TinyGPS &gps) esegue le seguenti funzioni:
in particolare dalla funzione print_float(float val, float invalid, int len, int prec) desidero estrarre le coordinate.
static void print_float(float val, float invalid, int len, int prec)
{
char sz[32];
if (val == invalid)
{
strcpy(sz, "*******");
sz[len] = 0;
if (len > 0)
sz[len-1] = ' ';
for (int i=7; i<len; ++i)
sz[i] = ' ';
Serial.print(sz);
}
else
{
Serial.print(val, prec); //<-- <-- <--
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1);
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(" ");
}
feedgps();
}
Come posso estrarre da Serial.print(val, prec); il valore delle coordinate???
Devo forse trasformare la variabile val da float in testo? Ho provato ma con scarsi risultati.
Come avrete intuito conosco molto poco questo linguaggio.
Grazie in anticipo dell'aiuto!
Ciao Leo,
ti rigrazio ho risolto convertendo la variabile val da float a testo con la seguente funzione:
String ftoa(float number, uint8_t precision, uint8_t size)
{
//Prints val with number of decimal places determine by precision
//precision is a number from 0 to 6 indicating the desired decimial places
//example: printDouble(3.1415, 2); // prints 3.14 (two decimal places)
//Added rounding, size and overflow #
//ftoa(343.1453, 2, 10) -> " 343.15"
//ftoa(343.1453, 4, 7) -> "# "
String s = "";
// Negative
if (number < 0.0)
{
s = "-";
number = -number;
}
double rounding = 0.5;
for (uint8_t i = 0; i < precision; ++i) rounding /= 10.0;
number += rounding;
s += String(uint16_t(number)); // prints the integer part
if(precision > 0)
{
s += "."; // prints the decimal point
uint32_t frac;
uint32_t mult = 1;
uint8_t padding = precision -1;
while(precision--) mult *= 10;
frac = (number - uint16_t(number)) * mult;
uint32_t frac1 = frac;
while(frac1 /= 10) padding--;
while(padding--) s += "0";
s += String(frac,DEC) ; // prints the fractional part
}
if (size>0) // checks size
if (s.length()>size) return("#");
else while(s.length()<size) s = " "+s;
return s;
}
Questo è il punto dove viene richiamata:
static void print_float(float val, float invalid, int len, int prec)
{
char sz[32];
if (val == invalid)
{
strcpy(sz, "*******");
sz[len] = 0;
if (len > 0)
sz[len-1] = ' ';
for (int i=7; i<len; ++i)
sz[i] = ' ';
//Serial.print(sz);
datigps += String(sz);
}
else
{
//Serial.print(val, prec);
String temp = ftoa(val, prec, 10); //<-- <-- <-- Qui!
temp.trim();
datigps += temp;
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1);
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
{
//Serial.print(" ");
datigps += " ";
}
}
feedgps();
}