Gps heading convertire gradi in lettere?

Ciao a tutti, ho un GPS che mi rilascia un dato heading (head) in gradi e vorrei trasformarlo in una lettura sul display in lettere. pensavo di dividere i 360 gradi della bussola in 16 settori e riportarli sul display convertiti in lettere, ad esempio N Ne nE E
ho provato in vari modi ma non sono riuscito, ho provato ad usare char ma non so se sia corretto, non lo so usare.
adesso ho lasciato il codice con le // nelle parti aggiunte dove ho fatto le prove.
per favore potete aiutarmi a capire dove sbaglio?
il dato heading e tutto il GPS funziona benissimo se lo lascio così com’è adesso e carico lo sketch, nelle prove che ho fatto cercando di trasformare i gradi head in settori descritti con una lettera è sempre rimasto a 0.0
allego il codice e vi ringrazio se avrete voglia di darmi una mano.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
const int cs_sd = 2;
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
File myFile;
float odo;
float Speed;
float alt;
float Sat;
float Dist;
float maxs = 0;
float Am = 0;
float head;
//char(N);//aggiunta
//char(Ne);// aggiunta
NeoGPS::Location_t    lastLoc, base;
bool stScan = true;
bool                  lastLocOK = false;
static const int RXPin = 5, TXPin = 4;
static const uint32_t GPSBaud = 9600;
NeoSWSerial gpsPort(RXPin, TXPin);
const int SHOW_INTERVAL = 1;
const int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; // speed limit value
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPSBaud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.clear();
  oled.setCursor(23, 2);
  oled.println("LOGGER GPS");
  delay(2000);
  oled.clear();
  if (!SD.begin(cs_sd)) {
    oled.clear();
    oled.setCursor(60, 2);
    oled.print("SD");

    delay(10000);
    oled.clear();
    return;
  }
  oled.setCursor(60, 2);
  oled.print("OK");
  delay(2000);
  oled.clear();
  File data = SD.open("log.csv", FILE_WRITE);
  data.println("");
  data.println("D  H  La  Lo  A  Am  Km  D  V" );
  data.close();
}
void loop() {
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    if ( Speed > maxs)
      maxs = Speed;
    if (fix.valid.heading )
      head = (fix.heading() );

    //{if ( (head >= 270 && head <= 90));//aggiunta
    // head = char (N);//aggiunta
    //if ( (head >= 90 && head <= 270));//aggiunta
    //head = char (Ne);}// aggiunta


    if (fix.valid.satellites )
      Sat = (fix.satellites );
    if (fix.valid.altitude)
      alt = (fix.altitude ());
    if ( alt > Am)
      Am = alt;
    if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
      digitalWrite( LED_PIN, HIGH );
    } else {
      digitalWrite( LED_PIN, LOW );
    }
    if (fix.valid.location) {
      if (lastLocOK) {
        odo += fix.location.DistanceKm( lastLoc );
        Speed = (fix.speed_kph());
      }
      lastLoc   = fix.location;
      lastLocOK = true;
      if (stScan) {
        stScan = false;
        base   = fix.location;
      } else {
        Dist = ( fix.location.DistanceKm( base ) );
      }
    }
    if (show == 0) {
#define MAX_CHARS 24
      char displayBufffer[MAX_CHARS];
      oled.setCursor(0, 0);
      snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 0);
      snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 4);
      snprintf(displayBufffer, MAX_CHARS, "Am:%2d.%1d", (int)Am, (int)(Am * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Sa:%1d", (int)Sat, (int)(Sat * 100) % 100);

      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    if (fix.dateTime);
    String Temps = String(fix.dateTime.hours ) + (":") + (fix.dateTime.minutes);
    String Date = String(fix.dateTime.day ) + ("/") + (fix.dateTime.month);
    File data = SD.open("log.csv", FILE_WRITE);
    data.println(Date + ("  ") + Temps + ("  ") + String(fix.latitude(), 6) + ("  ") + String(fix.longitude(), 6) + ("  ") + (alt) + ("  ") + (Am) + ("  ") + (odo) + ("  ") + (Dist) + ("  ") + (Speed));
    data.close();
  }
}

Cortesemente edita il tuo post e sistema il codice … assicurati di averlo correttamente indentato nell’IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all’intero del IDE). Per maggiori informazioni … punto 17.2 del REGOLAMENTO . Grazie.

Guglielmo

fatto grazie.

ho provato a cambiare qualcosa ma continuo a vedere sempre i gradi numerici.
per favore potreste suggerirmi dove sbaglio?
ho delimitato le nuove aggiunte di codice ma non stanno funzionando.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
const int cs_sd = 2;
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
File myFile;
float odo;
float Speed;
float alt;
float Sat;
float Dist;
float maxs = 0;
float Am = 0;
float head;
//aggiunta--------//
char(N);
char(Ne);
char(E);
char (Se);
char (S);
char (So);
char (O);
char (No);
// fine aggiunta -------//
NeoGPS::Location_t    lastLoc, base;
bool stScan = true;
bool                  lastLocOK = false;
static const int RXPin = 5, TXPin = 4;
static const uint32_t GPSBaud = 9600;
NeoSWSerial gpsPort(RXPin, TXPin);
const int SHOW_INTERVAL = 1;
const int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; // speed limit value
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPSBaud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.clear();
  oled.setCursor(23, 2);
  oled.println("LOGGER GPS");
  delay(2000);
  oled.clear();
  if (!SD.begin(cs_sd)) {
    oled.clear();
    oled.setCursor(60, 2);
    oled.print("SD");

    delay(10000);
    oled.clear();
    return;
  }
  oled.setCursor(60, 2);
  oled.print("OK");
  delay(2000);
  oled.clear();
  File data = SD.open("log.csv", FILE_WRITE);
  data.println("");
  data.println("D  H  La  Lo  A  Am  Km  D  V" );
  data.close();
}
void loop() {
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    if ( Speed > maxs)
      maxs = Speed;
    if (fix.valid.heading )
      head = (fix.heading() );

    // ------- inizio aggiunta------------- //

    if ((head > 345 && head < 360) || (head > 0 && head < 15)) {
      head = char ((N));
    }

    if (head > 25 && head < 55) {
      head = (char (Ne));
    }
    if (head > 80 && head < 100) {
      head = (char (E));
    }
    if (head > 120 && head < 140) {
      head = (char (Se));
    }
    if (head > 165 && head < 195) {
      head = (char (S));
    }
    if (head > 210 && head < 235) {
      head = (char (So));
    }
    if (head > 260 && head < 280) {
      head = (char (O));
    }
    if (head > 310 && head < 330) {
      head = (char (No));
    }
    //-------fine aggiunta -------------  //


    if (fix.valid.satellites )
      Sat = (fix.satellites );
    if (fix.valid.altitude)
      alt = (fix.altitude ());
    if ( alt > Am)
      Am = alt;
    if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
      digitalWrite( LED_PIN, HIGH );
    } else {
      digitalWrite( LED_PIN, LOW );
    }
    if (fix.valid.location) {
      if (lastLocOK) {
        odo += fix.location.DistanceKm( lastLoc );
        Speed = (fix.speed_kph());
      }
      lastLoc   = fix.location;
      lastLocOK = true;
      if (stScan) {
        stScan = false;
        base   = fix.location;
      } else {
        Dist = ( fix.location.DistanceKm( base ) );
      }
    }
    if (show == 0) {
#define MAX_CHARS 24
      char displayBufffer[MAX_CHARS];
      oled.setCursor(0, 0);
      snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 0);
      snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 4);
      snprintf(displayBufffer, MAX_CHARS, "Am:%2d.%1d", (int)Am, (int)(Am * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Sa:%1d", (int)Sat, (int)(Sat * 100) % 100);

      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    if (fix.dateTime);
    String Temps = String(fix.dateTime.hours ) + (":") + (fix.dateTime.minutes);
    String Date = String(fix.dateTime.day ) + ("/") + (fix.dateTime.month);
    File data = SD.open("log.csv", FILE_WRITE);
    data.println(Date + ("  ") + Temps + ("  ") + String(fix.latitude(), 6) + ("  ") + String(fix.longitude(), 6) + ("  ") + (alt) + ("  ") + (Am) + ("  ") + (odo) + ("  ") + (Dist) + ("  ") + (Speed));
    data.close();
  }
}

mi chiedo se sia sbagliata la stringa che scrive il dato sul display essendo adesso delle lettere

snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);

Guarda che stai programmando in C/C++ NON in basic dove le variabili una volta sono una cosa ed un’altra un’altra cosa … il C/C++ è piuttosto rigido e … leggendo il tuo programma ho idea che ti manchino proprio le basi del linguaggio (hai scritto cose che non hanno alcun senso compiuto).

Il mio suggerimento è PRIMA di studiare BENE prima il linguaggio, la sua sintassi e la sua semantica e POI riprendere in mando il tuo programma in modo molto più produttivo.

Tanto per capirci … cose come:

char(N);
char(Ne);
char(E);
...

NON hanno alcun senso pratico, poi, se dichiari:

float head;

NON puoi cercare di fare:

head = (char (E));

… che comunque è una sintassi sbagliata !

Insomma … c’è da fare parecchio, studiare il C/C++, le funzioni della <string.h> per manipolare le stringhe di caratteri, ecc. ecc. … :roll_eyes:

Guglielmo

La serie di IF può anche andare bene (si può fare in modo molto più compatto, ma lasciamo stare così) …
… devi però dichiarare una variabile di tipo stringa del ‘C’ (che è un array di char) e, usando la funzione strcpy() che fa appunto pare di <string.h> che si trova in AVR libc (libreria SEMPRE automaticamente inclusa nei programmi Arduino), assegnare a tale stringa la stringa che vuoi racchiusa tra doppi apici.

Quindi, da qualche parte dichiarare, che so io, una variabile così:

char stringHead[3]; // deve poter contenere il massimo di caratteri che usi più uno

e poi, all’interno dei vari IF assegnargli il giusto valore con la strcpy() in questo modo:

strcpy( stringHead, "xx" ); // dove xx saranno i caratteri voluti .. N, NE, E, SE, ecc.

e quindi potrai mandare in stampa la variabile stringa stringHead.

Quindi ora … buono studio e buon lavoro ! :wink:

Guglielmo

certo che mi mancano le basi del linguaggio altrimenti avrei risolto per conto mio senza venire su questo forum a farmi dare dell’ignorante quale ovviamente sono.
ad ogni modo essendo tutto questo su una nano, non c’è spazio per usare strcpy
a questo punto lascio i gradi, mi va benissimo così.
grazie

Sei sicuro?

… e perché mai? :open_mouth: Arduino Nano è come Arduino UNO, sempre ATmega328P … quindi strcpy() NON ha alcun problema !

Guglielmo

Guarda che nessuno ti sta dando dell’ignorante in senso dispregiativo, ci mancherebbe ! :open_mouth:

Ti si sta solo dicendo che … ti mancano le basi di un dato linguaggio, tu vuoi usare quel linguaggio per sviluppare tue applicazioni … il minimo è che ti STUDI approfonditamente il linguaggio che vuoi usare non ti pare ?

Guglielmo

penso di si perchè la nano è già piena al 95% e per quanto abbia scritto le stringhe in modo che credo (forse) corretto non posso caricare salvo non cancellare metà di quello che c’è già.
o almeno così è uscito dalle prove che ho fatto prima che potesse compliare correttamente ho dovuto eliminare // non poche delle parti che adesso sarebbero in uso.
questo è il codice che sto usando e funziona perfettamente ma non ci posso aggiungere un singolo carattere di testo, posso solo limare dalla presentazione"logger gps"

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
const int cs_sd = 2;
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
File myFile;
float odo;
float Speed;
float alt;
float Dist;
float maxs = 0;
float Am = 0;
float head;
unsigned int Sat = 0;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true;
bool                  lastLocOK = false;
static const int RXPin = 5, TXPin = 4;
static const uint32_t GPSBaud = 9600;
NeoSWSerial gpsPort(RXPin, TXPin);
const int SHOW_INTERVAL = 1;
const int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; // speed limit value
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPSBaud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.clear();
  oled.setCursor(23, 2);
  oled.println("LOGGER GPS");
  delay(2000);
  oled.clear();
  if (!SD.begin(cs_sd)) {
    oled.clear();
    oled.setCursor(60, 2);
    oled.print("SD");
    delay(10000);
    oled.clear();
    return;
  }
  oled.setCursor(60, 2);
  oled.print("OK");
  delay(2000);
  oled.clear();
  File data = SD.open("log.csv", FILE_WRITE);
  data.println("");
  data.println("D  H  La  Lo  A  Am  Km  D  V" );
  data.close();
}
void loop() {
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    if ( Speed > maxs)
      maxs = Speed;
    if (fix.valid.heading )
      head = (fix.heading() );
    if (fix.valid.satellites )
      Sat = (fix.satellites );
    if (fix.valid.altitude)
      alt = (fix.altitude ());
    if ( alt > Am)
      Am = alt;
    if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
      digitalWrite( LED_PIN, HIGH );
    } else {
      digitalWrite( LED_PIN, LOW );
    }
    if (fix.valid.location) {
      if (lastLocOK) {
        odo += fix.location.DistanceKm( lastLoc );
        Speed = (fix.speed_kph());
      }
      lastLoc   = fix.location;
      lastLocOK = true;
      if (stScan) {
        stScan = false;
        base   = fix.location;
      } else {
        Dist = ( fix.location.DistanceKm( base ) );
      }
    }
    if (show == 0) {
#define MAX_CHARS 24
      char displayBufffer[MAX_CHARS];
      oled.setCursor(0, 0);
      snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 0);
      snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
      oled.println(displayBufffer);
      oled.setCursor(65, 4);
      snprintf(displayBufffer, MAX_CHARS, "Am:%2d.%1d", (int)Am, (int)(Am * 100) % 100);
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "Sa:%2d", (int)Sat, (int)(Sat * 1) % 1);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    if (fix.dateTime);
    String Temps = String(fix.dateTime.hours + 2 ) + (":") + (fix.dateTime.minutes);
    String Date = String(fix.dateTime.day ) + ("/") + (fix.dateTime.month);
    File data = SD.open("log.csv", FILE_WRITE);
    data.println(Date + ("  ") + Temps + ("  ") + String(fix.latitude(), 6) + ("  ") + String(fix.longitude(), 6) + ("  ") + (alt) + ("  ") + (Am) + ("  ") + (odo) + ("  ") + (Dist) + ("  ") + (Speed));
    data.close();
  }
}

adesso però ho da STUDIARE il linguaggio e vediamo se poi avrò voglia di continuare visto che dalle prove che ho fatto per tutto il pomeriggio con strcpy mi restituisce sempre che non c’è abbastanza memoria a disposizione.
non ho idea se dipende da strcpy oppure da qualcos’altro ma alla fine la bussola in gradi mi va benissimo, so leggerla.
mi spiace se non conosco il linguaggio ma sono un modellista, arduino non è il mio hobby anche se per alcune cose è dovuto diventarlo.
mettermi a studiare il C++ per lavoro non ci potrei mai riuscire, farlo per passione non potrebbe mai essere la mia passione, io maneggio il legno e il metallo.
studiarlo perchè ne ho necessità per costruire qualcosa mi può capitare, ci perdo tutto il tempo necessario leggendomi paginate del forum inglese, sperimentando, sbagliando, ma oltre questo non vado, mi spiace.
per adesso va bene così, grazie a tutti.

Secondo me i problemi derivano piuttosto dalla sprintf() che è abbastanza pesante piuttosto che dalla strcpy() e da tutte quelle maledette classi String che abbiamo detto e ripetuto un’infinità di volte di NON USARE !!!

Guglielmo

Le direzioni sono classificate diversamente, avanti indietro destra sinistra ma sono sempre 8.
Ma questa mi sembra ancora più elegante

e cosa dovei usare invece delle classi String per ottenere il medesimo risultato?

Le stringhe classiche del ‘C’ (array di char) e, come già detto, tutte le funzioni di <string.h>, oppure, “volendo vincere facile”, almeno usare la libreria SafeString che è descritta nella sezione software.

Guglielmo

ho installato la libreria e fatto 1 ora di prove senza venirne a capo (me lo aspettavo? un pochino si) ma quello che non capisco è il fine. cosa cambierebbe? quali vantaggi rispetto a come lo sketch è scritto adesso? non sono non capisco cosa dovrei fare ma soprattutto perchè lo dovrei fare. uso questo sketch da circa 1 anno, funziona bene, posso migliorarlo? ok, in quali termini il miglioramento sarebbe apprezzabile rispetto ad adesso? è chiaro che vorrei rendere il gps (che uso e mi serve) il più efficiente possibile anche perchè adesso ha 2 difetti (il giorno della data è sempre 7, l’altitudine si aggiorna di rado e spesso con valori errati, idem il conteggio dei satelliti che a volte spara numeri a 3 cifre) ma non riesco davvero a mettermi a studiare il C da un giorno all’altro per arrivare a ottenere dei risultati che non so determinare neanche quali potrebbero essere. avrei bisogno di una spiegazione per favore.

Quello che può succedere con l’uso della classe String è che venga consumata la RAM della MCU che ad esempio nel caso della UNO è di soli 2k.
Questo effetto c’è anche sui PC ma siccome di RAM ce n’è una quantità maggiore di diversi ordini di grandezza non te ne accorgi.
Se hai un po’ di basi di C non c’è bisogno che ti fai un corso completo, anche se aiuta.
In questo caso il tuo problema è la gestione di stringhe in C, se cerchi con Google trovi parecchia documentazione.
Per esempio questa

Io neppure ho fatto un corso di C ma piano piano, cercando in rete opportunamente, ho sempre trovato la soluzione e ormai, avendo un po’ di conoscenza, sono in grado di valutare se va bene per me o è una soluzione da Ufficio Complicazione Affari Semplici.
Una miniera è Stackoverflow e tutti quelli derivati in quanto alle soluzioni si da un punteggio e di solito quelle con il punteggio più alto te le trovi in cima.

Evidentemente non hai letto il primo post del link che ti ho dato perché … c’è ben spiegato quale è il problema.

Guglielmo

Un anno è molto tempo :wink:

Battute a parte, è evidente che lo sketch è frutto di un “assemblaggio” delle diverse funzionalità fatto un po’ alla cieca.
Ad esempio per stampare a display i messaggi usi l’istruzione snprintf() / print() con il “trucchetto” per i float mentre per salvare le stesse informazioni sulla SD usi le String di Arduino quindi un metodo completamente diverso.
Ad esempio “riciclando” lo stesso approccio che usi per l’OLED con la parte SD puoi ridurre lo spazio occupato dal firmware dal 97% al 90% (c’è anche un errore sull’if credo).

 if (fix.dateTime) { 
      File data = SD.open("log.csv", FILE_WRITE);      
      snprintf(displayBufffer, MAX_CHARS, "%02d:%02d %02d/%02d ", fix.dateTime.day, fix.dateTime.month, fix.dateTime.hours, fix.dateTime.minutes);
      data.print(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d.%d %d.%d ", (int)fix.latitude(), (int)(fix.latitude()*1000)%1000, (int)fix.longitude(), (int)(fix.longitude()*1000)%1000) ;
      data.print(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d.%d %d.%d %d.%d ", (int)alt, (int)(alt*1000)%1000, (int)Am, (int)(Am*1000)%1000, (int)odo, (int)(odo*1000)%1000) ;
      data.print(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d.%d %d.%d\n", (int)Dist, (int)(Dist*1000)%1000, (int)Speed, (int)(Speed*1000)%1000)  ;
      data.print(displayBufffer);      
      data.close();
    }

Per quanto riguarda l’aggiunta che vuoi fare, se continui ad usare lo stesso metodo non dovrebbero esserci problemi.

grazie! per favore mi puoi spiegare che senso hanno i numeri moltiplicati e divisi alla fine delle stringhe *1000)%1000 ??
perchè non 100 o 10 ?
poi, come mai nell’ultima hai aggiunto \n?
cosa cambia? giusto per dare un senso che possa capire.
ti ringrazio.