# Gps heading convertire gradi in lettere?

**URL:** <https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071>\
**Category:** Software\
**Created:** [May 7, 2021, 10:16pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071 "2021-05-07T22:16:48Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 7, 2021, 10:16pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/1 "2021-05-07T22:16:48Z")

</div>

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.

```cpp
#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();
  }
}
```

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 8, 2021, 2:58am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/2 "2021-05-08T02:58:17Z")

</div>

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](https://forum.arduino.cc/t/regolamento-come-usare-questo-forum/145566) . Grazie.

Guglielmo

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 8, 2021, 8:11am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/3 "2021-05-08T08:11:15Z")

</div>

fatto grazie.

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 8, 2021, 12:06pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/4 "2021-05-08T12:06:57Z")

</div>

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.

```cpp
#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

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

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 8, 2021, 12:32pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/5 "2021-05-08T12:32:11Z")

</div>

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:

```cpp
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. ... 🙄

Guglielmo

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 8, 2021, 12:47pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/6 "2021-05-08T12:47:40Z")

</div>

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()](https://www.nongnu.org/avr-libc/user-manual/group __avr__ string.html#ga54e4f23104fa6f722f9459d2673a1eba) che fa appunto pare di [\<string.h\>](https://www.nongnu.org/avr-libc/user-manual/group __avr__ string.html) che si trova in [AVR libc](https://www.nongnu.org/avr-libc/user-manual/modules.html) (_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 ! 😉

Guglielmo

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 8, 2021, 6:44pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/7 "2021-05-08T18:44:23Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [May 8, 2021, 6:48pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/8 "2021-05-08T18:48:12Z")

</div>

> [@wrighi](#):
>
> non c’è spazio per usare strcpy

Sei sicuro?

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 8, 2021, 6:49pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/9 "2021-05-08T18:49:21Z")

</div>

> [@wrighi](#):
>
> ogni modo essendo tutto questo su una nano, non c’è spazio per usare strcpy

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

Guglielmo

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 8, 2021, 6:52pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/10 "2021-05-08T18:52:23Z")

</div>

> [@wrighi](#):
>
> senza venire su questo forum a farmi dare dell’ignorante quale ovviamente sono.

Guarda che nessuno ti sta dando dell'_ignorante_ in senso dispregiativo, ci mancherebbe ! 😮

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

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 8, 2021, 7:43pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/11 "2021-05-08T19:43:54Z")

</div>

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"

```cpp
#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.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 9, 2021, 7:13am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/12 "2021-05-09T07:13:14Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![zoomx](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/zoomx/32/213669_2.png) [@zoomx](https://forum.arduino.cc/u/zoomx)\
**Post date:** [May 9, 2021, 2:50pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/13 "2021-05-09T14:50:08Z")

</div>

> <https://stackoverflow.com/questions/44183771/how-to-avoid-if-else-if-chain-when-classifying-a-heading-into-8-directions>

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

> <https://gamedev.stackexchange.com/questions/49290/whats-the-best-way-of-transforming-a-2d-vector-into-the-closest-8-way-compass-d>

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 9, 2021, 6:37pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/14 "2021-05-09T18:37:51Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 9, 2021, 7:17pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/15 "2021-05-09T19:17:57Z")

</div>

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](https://forum.arduino.cc/t/classe-safestring-una-valida-alternativa-alla-pessima-string/660684) che è descritta nella sezione software.

Guglielmo

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 9, 2021, 8:41pm UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/16 "2021-05-09T20:41:32Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![zoomx](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/zoomx/32/213669_2.png) [@zoomx](https://forum.arduino.cc/u/zoomx)\
**Post date:** [May 10, 2021, 7:18am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/17 "2021-05-10T07:18:11Z")

</div>

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

> **[Gestire le stringhe con Arduino – approfondimenti](https://www.maffucci.it/2020/05/09/gestire-le-stringhe-con-arduino-approfondimenti/)**
>
> In passato ho già affrontato questo argomento e con questo post aggiungo alcuni approfondimento utili per i miei studenti. Le stringhe sono una struttura di dati che viene utilizzata per memorizzar…

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.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [May 10, 2021, 7:34am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/18 "2021-05-10T07:34:44Z")

</div>

> [@wrighi](#):
>
> ma quello che non capisco è il fine. cosa cambierebbe?

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

Guglielmo

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [May 10, 2021, 7:41am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/19 "2021-05-10T07:41:13Z")

</div>

> [@wrighi](#):
>
> uso questo sketch da circa 1 anno

> [@wrighi](#):
>
> studiare il C da un giorno all’altro

Un anno è molto tempo 😉

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).

```arduino
 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.

---

<div class="post-metadata">

**Author:** ![wrighi](https://avatars.discourse-cdn.com/v4/letter/w/ac91a4/32.png) [@wrighi](https://forum.arduino.cc/u/wrighi)\
**Post date:** [May 10, 2021, 10:32am UTC](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071/20 "2021-05-10T10:32:32Z")

</div>

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.

[Next page](https://forum.arduino.cc/t/gps-heading-convertire-gradi-in-lettere/859071.md?page=2)
