Consiglio ottimizzazione codice

Buongiorno a tutti, ho da poco scritto questo codice che ha lo scopo di restituire un’ uscita (in questo caso una print) nel caso in cui la posizione geografica espressa da lonB e latB (longitudine e latitudine, obv) abbia una distanza minore di un determinato valore (in questo caso 1000m) da una delle posizioni presenti in un file .csv dove la sintassi è “latitudine, longitudine, numero_non_significativo”. I valori sono prelevati con parseFloat, come visibile, e inseriti nella funzione distance che ne calcola la distanza ma, a causa del numero di elementi del file .csv (22000 circa) impiega parecchio tempo per analizzarli tutti e in parecchi minuti non arriva neanche ai primi mille. Come dovrei fare​? C’è un altro modo per velocizzare il tutto? Vedo che i navigatori GPS impiegano frazioni di secondo per capire se sei vicino ad un determinato POI o Autovelox, come fanno? Vi ringrazio in anticipo e vi allego il codice.

tmp_23378-Autovelox1650109047.ino (2.12 KB)

Semplicemente hai sbagliato prodotto ...
... Arduino UNO non è adatto a fare certe cose ... è una semplice MCU a 8 bit, senza "floating-point unit" e quindi tutti i calcoli li deve fare via software e ... richiedono moltissimi cicli di clock.

Ma comunque, propri a causa della sua limitata precisione quando lavori con i "float" ...

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

... i calcoli con le coordinate GPS sono infattibili causa, appunto, la scarsissima precisione del risultato.

Per fare queste cose devi usare MCU a 32 bit e meglio se dotate di unità "floating-point".

Guglielmo

Buongiorno e grazie per la risposta. Volevo per curiosità provare con il mio Arduino se fosse possibile fare ciò è purtroppo ho scoperto di no :frowning: . La precisione, comunque, non era un problema in quanto il risultato era pressoché identico a quello ottenuto con altri software più precisi e potenti ma il problema era la velocità. Grazie comunque :frowning:

leobel96:
... La precisione, comunque, non era un problema in quanto il risultato era pressoché identico a quello ottenuto con altri software più precisi e potenti ma il problema era la velocità. ...

Sei capitato su casi particolari che probabilmente vengono bene anche con dei float a 32 bit, ma t'assicuro che, per applicazioni reali GPS ... non te ne fai assolutamente nulla ... gli errori sono del tutto inaccettabili :wink:

Guglielmo

Non avevo bisogno di precisioni elevate infatti, sarebbe stata una cosa del tutto amatoriale. Grazie comunque Guglielmo :slight_smile:

Eh lo so docsavage, ci avevo pensato, ma per scartare i falsi candidati dovrebbe comunque controllarli tutti per vedere quelli distanti ed è proprio la funzione parseFloat (che è quella che dovrebbe usare anche in questo caso) ad essere lenta. La funzione distance è applicata praticamente istantaneamente.

Allora docsavage, innanzitutto grazie per l'interessamento. Purtroppo le mie abilità di programmazione sono ristrette ad operazioni basilari e da autodidatta. Avevo provato a guardare funzioni come iostream, fstream, ostream,... senza capire effettivamente come applicarle e trasformare la loro uscita in un float. Purtroppo temo che, a causa della poca potenza dell' Arduino Uno non si riesca a fare di meglio. Il file comunque è questo (Dropbox - File Deleted). I campi utili come ho prima accennato sono il primo e il secondo che sono, rispettivamente, longitudine e latitudine.

Allora, scusa l'ignoranza, ma non ho capito in

for(i=0; cuscinetto[i+1]|=',';i++)

il |= cosa sta a significare e neanche cosa significa j=i+ nel for dopo.

Ah erano errori di battitura, capito. Comunque nei prossimi giorni proverò. Grazie mille per l'aiuto e alla prossima!!