Go Down

Topic: Salvare i dati GPS su variabili. (Read 1 time) previous topic - next topic

alearc

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:

Code: [Select]
static void gpsdump(TinyGPS &gps)
{
 ...
 gps.f_get_position(&flat, &flon, &age);
 print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
 print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
 ...
}


in particolare dalla funzione print_float(float val, float invalid, int len, int prec) desidero estrarre le coordinate.

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

Alessandro

leo72

Chiamando questa funzione:
Code: [Select]
gps.f_get_position(&flat, &flon, &age);
dovresti avere i dati che cerchi in flat e flon.
A questo punto prova stampando questi valori sulla seriale:
Code: [Select]
static void gpsdump(TinyGPS &gps)
{
  ...
  gps.f_get_position(&flat, &flon, &age);
  Serial.println(flat, DEC);
  Serial.println(flon, DEC);
  ...
}

E guarda cosa ti esce

alearc

Ciao Leo,
ti rigrazio ho risolto convertendo la variabile val da float a testo con la seguente funzione:

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

Code: [Select]
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();
}


Grazie ancora e a presto.

Alessandro


Go Up