convertire da string a int\float per lavorare sui dati.

buonasera,

sto realizzando un piccolo sistema con un gps, e ho bisogno di localizzare all'interno delle varie stringhe lette da seriale i dati che mi servono.
essendo i dati sempre lunghi uguali ho deciso di utilizzare la funzione substring.
Il mio problema ora è riuscire a passare dalla String a una variabile di tipo int o float, in modo che per esempio la latitudine dovrei moltiplicarla per 10 per spostare la virgola, però quando vado a leggere i dati int nel monitor seriale questi non corrispondono a quelli presenti in string, come posso risolvere?
vi do il codice (stavo facendo delle prove con l'orario)

#include <SoftwareSerial.h>


//pin 6 RX e pin 7 TX
SoftwareSerial mySerial(6, 7);
String NMEA;
String ora1;
float ora;


void setup() {
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
  
}

void loop() {
  if (mySerial.available()) {
    //leggo la prima riga
    char c = mySerial.read();
    if (c != '\n') {
      NMEA += c;
      //Serial.print(NMEA);
    }
    else {
      //printo solo la stringa che mi interessa
      if (NMEA.substring(0, 6) == "$GNRMC")
      {
       ora1= NMEA.substring(7, 16) ; 
         
        ora=atoi(ora1.c_str());

        Serial.println(ora);
       
          /*Serial.println(caso);
          if(conteggio==13){
            conteggio=0;
            Serial.println("");
          }*/
         
          
        }
        NMEA = "";
      }
      
      
      
    }
  }

Grazie in anticipo.

nocentini:
... Il mio problema ora è riuscire a passare dalla String a una variabile di tipo int o float ..... come posso risolvere?

... studiando la classe String() e tutti i suoi metodi. Ce ne sono difatti per effettuare la conversione di un oggetto String() nei vari formati numerici. :slight_smile:

Guglielmo

P.S.: Tu continua pure ad usare la classe String() ... però poi non ti lamentare se ti troverai di fronte a blocchi improvvisi del programma. Ti rammento che NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String()", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!

se sai come ottimizzare il mio codice mi faresti un grandissimo favore, non me ne intendo tanto..
questo è quello che sono riuscito a fare fino ad ora.

nocentini:
se sai come ottimizzare il mio codice mi faresti un grandissimo favore, non me ne intendo tanto..

Non si tratta di "ottimizzare", si tratta proprio di NON usare la classe Sring() e cambiare il codice ...

In pratica devi imparare ad usare le stringhe classiche del C ... ovvero semplici array di 'char' terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.

Ovvio che richiede un certo lavoro e ... un bel po' di studio su tutte le funzioni che <string.h> mette a disposizione ... ::slight_smile:

Guglielmo

P.S.: Comunque, intanto comincia a farlo funzionare così com'è usando i metodo della classe String() (che ormai stai usando) per fare le conversioni ... quando tutto funziona pensi all'eliminazione di String() ed al passaggio alle strighe classiche del 'C'.

nocentini:
Il mio problema ora è riuscire a passare dalla String a una variabile di tipo int o float, in modo che per esempio la latitudine dovrei moltiplicarla per 10 per spostare la virgola, però quando vado a leggere i dati int nel monitor seriale questi non corrispondono a quelli presenti in string

Come dico sempre, affrontare le cose per gradi. Intanto lascia per ora stare la seriale, fai un semplice sketch dove nella variabile NMEA metti direttamente una stringa ricevuta dal GPS e cerchi di interpretare quella, ossia dopo la prima virgola hai l'orario nel formato "hhmmss.sss", giusto?

Per cercare di fartici arrivare da solo (in questo modo si impara meglio e più velocemente...) vedi questo esempio (fai sempre piccoli sketch per sperimentare e capire una cosa per volta):

String NMEA;
String ora1;
float ora;

void setup() {
  Serial.begin(9600); 

  // Simulo l'input
  NMEA = "$GNRMC,054157.013,A,2307.1261,N,12016.4308,E,0.62,286.99,170415,,,A*77";
  
  // Qui avrò "054157.013"
  ora1 = NMEA.substring(7, 16);
  Serial.println(ora1);

  // Qui cerco di convertire in intero (?) la stringa "054157.013"
  // e la memorizzo in un float (??)
  Serial.println(atoi(ora1.c_str()));
  ora = atoi(ora1.c_str());
  // Dovrei ottenere il valore 54157: è così???
  Serial.println(ora);
}

void loop() {

}

Provalo e analizza cosa succede ad ogni passo.

Dovresti ottenere il valore 54157 invece scommettiamo che vedi -11379?
Per capirlo ti dò un aiutino: cosa fa la funzione "atoi()"?

PS: per cercare di capire ancora di più come funzionano certe cose, perché non ti iscrivi a Tinkercad Circuits dove c'è un buon emulatore di circuiti ed in particolare di Arduino, con tanto di debug, breakpoint, e visualizzazione del valore delle variabili?

ragazzi non sto capendo di cosa stiate parlando!!
sto facendo delle prove come mi avete consigliato, ho cercato la funzione atoi() ma non riesco a capire bene il funzionamento.
ho provato come ha detto Guglielmo la funzione toni() ma non so come dichiararla.
ora sto provando a usare gli array ma l'unica cosa che vedo sul monitor seriale sono una quantità infinita di numeri e simboli.
non so più dove sbattere la testa hahahaha

nocentini:
... ho provato come ha detto Guglielmo la funzione toni() ma non so come dichiararla.

Se provassi a studiare invece che fare prove a caso, sarebbe meglio! T'ho detto di studiarti la classe String() ... i metodi che ti servono sono già pronti li !

Guglielmo

nocentini:
ragazzi non sto capendo di cosa stiate parlando!!
sto facendo delle prove come mi avete consigliato, ho cercato la funzione atoi() ma non riesco a capire bene il funzionamento.

Per ora lascia stare la atoi ed anche gli "esperimenti" (come ha detto Guglielmo, prima di fare esperimenti bisognerebbe studiare...), ed ignora gli ultimi messaggi tra me e Guglielmo: per favore, fai ora la prova con il programmino che ti ho postato, e dammi il risultato ossia cosa vedi come output.
Poi ti spiego quello che è successo, così capisci meglio il tutto in modo graduale, e ci si arriverà per bene senza confonderti le idee.