Convertire variabile in nome

ciao a tutti, vorrei capire dove posso imparare a convertire una variabile float numerica in un nome in lettere.
mi spiego meglio: ho ripreso recentemente in mano lo sketch di una bussola che mi restituisce un dato che varia da zero a 360°
ho fatto una serie di IF per dividere i gradi in 8-16 settori ai quali vorrei dare i nomi dei punti cardinali e farli apparire su un display tradotti in lettere.
sto provando con strcpy ma non sto avendo successo.

essenzialmente questa è la parte interessata del codice ma non so dove sto sbagliando oppure se ho scelto la via sbagliata per ottenere quello che vorrei.

float head; // il dato numerico che mi arriva dalla bussola
char bussola [3]; //  2 caratteri lettere dei punti cardinali

void loop 

 // punti cardinali gradi bussola  (float head) convertiti in lettere (bussola)
        if ((head > 345 && head < 360) || (head > 0 && head < 15)) {
       strcpy ( bussola, "N") ;
    }

    if (head > 25 && head < 55) {
     strcpy  (bussola, "NE") ;
    }
    if (head > 80 && head < 100) {
    strcpy(bussola, "E") ;
    }
    if (head > 120 && head < 140) {
     strcpy (bussola, "SE") ;
    }
    if (head > 165 && head < 195) {
     strcpy ( bussola, "S") ;
    }
    if (head > 210 && head < 235) {
     strcpy  (bussola, "SO") ;
    }
    if (head > 260 && head < 280) {
     strcpy  (bussola,"O") ;
    }
    if (head > 310 && head < 330) {
     strcpy  (bussola, "NO") ;
    }

snprintf(displayBufffer, MAX_CHARS, "Bu: %s\n", bussola);  //punti cardinali bussola scritti in lettere sul display
   

non mi funziona.. quanto ci sono lontano da quello che vorrei ottenere?

vi ringrazio e vi auguro una buona settimana.

Il codice sembra corretto, almeno compilandolo funziona.
Cosa non ti funziona? Hai provato a stampare sulla seriale i valori assunti da bussola?

È corretto che ci siano dei "buchi" nei valori degli if?
Se becchi dei valori intermedi che succede?

non so che dire.. io la verifica la devo ottenere dal display e non riesco a veder apparire nessuna lettera nel campo "Bu:"

il codice completo è questo, magari mi sfugge qualche inghippo ce non conosco o mi è sfuggito.
anche a me carica senza errore ma il valore rimane vuoto.
i valori di head funzionano perfettamente, i gradi in numeri li vedo.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24

#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float  odo, Speed, alt, Dist, head, maxs = 0;

char bussola [3]; //  2 caratteri lettere punti cardinali

unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;

static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; 
void disp(int c, int r)
{
  oled.clear();
  oled.setCursor(c, r);
}
void setup() {
  
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.displayRemap(true);//reverse lcd
  
  oled.clear();
 
  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(65, 2);
    oled.print("SD");//se appare questo manca la SD
    delay(10000);
    oled.clear();
    return;
  }
 
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("Da  Hr  Tm  La  Lo  At  Km  Di  Ve  He" );
  data.close();
}
void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    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 ( Speed > maxs)          maxs = Speed;
    if (fix.valid.heading )     head = fix.heading() ;
    
    if (fix.valid.altitude) {
        alt = fix.altitude();
       
    }
    // punti cardinali gradi bussola  (float head) convertiti in lettere (bussola)
        if ((head > 345 && head < 360) || (head > 0 && head < 15)) {
       strcpy ( bussola, "N") ;
    }

    if (head > 25 && head < 55) {
     strcpy  ( bussola, "NE") ;
    }
    if (head > 80 && head < 100) {
    strcpy  ( bussola, "E") ;
    }
    if (head > 120 && head < 140) {
     strcpy  ( bussola, "SE") ;
    }
    if (head > 165 && head < 195) {
     strcpy  ( busslola, "S") ;
    }
    if (head > 210 && head < 235) {
     strcpy  ( bussola, "SO") ;
    }
    if (head > 260 && head < 280) {
     strcpy  ( bussola,"O") ;
    }
    if (head > 310 && head < 330) {
     strcpy  (bussola, "NO") ;
    }

    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      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, "Bu:%s\n",bussola);  //punti cardinali bussola scritti sul display
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print("  ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print("  ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print("  ");
    data.print(fix.latitude(), 6);
    data.print("  ");
    data.print(fix.longitude(), 6);
    data.print("  ");
    data.print(alt);
    data.print("  ");    
    data.print(odo);
    data.print("  ");
    data.print(Dist);
    data.print("  ");
    data.print(Speed);
    data.print("  ");
    data.print(head);
    data.print("  ");
    
    data.close();
  }
}

Ti posso proporre una versione alternativa?

Le direzioni principali della rosa dei venti sono 8 e le puoi mettere in un array di char* statico.

Poi con un ciclo for, verifiche se l'angolo passato dalla bussola è compreso nel range angolo direzione principale X +/- 22.5° (45° diviso 2, cosi copri tutti i quadranti in modo completo).
Quando l'angolo è compreso nel range specificato, hai trovato l'indice dell'array e quindi puoi stampare la stringa corrispondente.

E' più facile da fare che da spiegare... se vuoi ti faccio al volo una simulazione online.

ti ringrazio, si mi interessano versioni alternative specialmente se posso semplificare. anche perché adesso i settori non sono neanche divisi con precisione, mi riservavo questo passaggio alla fine.
non so se riuscirò a metterlo nel programma, faccio ancora molta fatica a scrivere senza fare troppi errori spesso davvero banali.
ho corretto un poco meglio i vari settori in questo codice e il gps così funziona molto bene eccetto la rosa dei venti che per pura didattica mi piacerebbe capire cosa non va e dove potrebbe essere l'errore, ovviamente se è possibile migliorarlo mi farebbe solo piacere.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24

#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float  odo, Speed, alt, Dist, head, maxs = 0;

char bussola [3]; //  2 caratteri lettere punti cardinali

unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;

static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; 
void disp(int c, int r)
{
  oled.clear();
  oled.setCursor(c, r);
}
void setup() {
  
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.displayRemap(true);//reverse lcd
  
  oled.clear();
 
  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(65, 2);
    oled.print("SD");//if you read this mean SD is not present
    delay(10000);
    oled.clear();
    return;
  }
 
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("Da  Hr  Tm  La  Lo  At  Km  Di  Ve  He" );
  data.close();
}
void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    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 ( Speed > maxs)          maxs = Speed;
    if (fix.valid.heading )     head = fix.heading() ;
    
    if (fix.valid.altitude) {
        alt = fix.altitude();
       
    }
    // punti cardinali gradi bussola  (float head) convertiti in lettere (bussola)
        if ((head > 343 && head < 360) || (head > 0 && head < 22)) {
       strcpy( bussola, "N") ;
    }

    if (head > 23 && head < 68) {
     strcpy  ( bussola, "NE") ;
    }
    if (head > 69 && head < 114) {
    strcpy( bussola, "E") ;
    }
    if (head > 115 && head < 160) {
     strcpy ( bussola, "SE") ;
    }
    if (head > 161 && head < 206) {
     strcpy ( bussola, "S") ;
    }
    if (head > 207 && head < 252) {
     strcpy   ( bussola, "SO") ;
    }
    if (head > 253 && head < 298) {
     strcpy  ( bussola,"O") ;
    }
    if (head > 299 && head < 342) {
     strcpy  ( bussola, "NO") ;
    }

    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      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, "Bu:%s\n",bussola);  //punti cardinali bussola scritti sul display
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print("  ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print("  ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print("  ");
    data.print(fix.latitude(), 6);
    data.print("  ");
    data.print(fix.longitude(), 6);
    data.print("  ");
    data.print(alt);
    data.print("  ");    
    data.print(odo);
    data.print("  ");
    data.print(Dist);
    data.print("  ");
    data.print(Speed);
    data.print("  ");
    data.print(head);
    data.print("  ");
    
    data.close();
  }
}

Allora dai un'occhiata a questa simulazione.
Se non ti è chiaro qualche passaggio chiedi pure

grazie !! adesso la controllo, anzi mi faccio un nuovo sketch e provo a includerla nel mio.
comunque sono un imbecille io perché il mio sketch funziona. quasi bene ma funziona
è bastato fare il fix e sono partite le lettere, davo per scontato che anche senza il fix con i satelliti il dato 0.0 lo avrebbe dovuto convertire in "N"

funziona quasi bene perché il secondo carattere rimane sempre "O" ovvero sia che vado a nord ovest che a nord ottengo scritto sempre" NO"
me ne sono accorto perché andando a est mi è arrivato scritto sul display "EO" e non è possibile.
quindi comunque c'è un errore nella sintassi del display %s\n che devo risolvere.
poi non sempre i caratteri sono 2 anche se posso indicare nord con "NN" est con "EE" e così via..
devo capire perché il secondo carattere è sempre "O" poi avrei quasi risolto..

adesso provo la tua simulazione, molto interessante, grazie 1000.

Devi aggiungere il carattere di terminazione stringa '\0' alla fine dell'array.

Oppure passare alla strcpy sempre 2 caratteri:
strcpy( bussola, "E ");

si infatti, ti ringrazio, sto aggiungendo uno spazio. sono proprio a limite memoria ormai.. ho dovuto togliere lettere dalla legenda della scheda SD per evitare l'errore di memoria . lo sketch usa 28352 (92%)

questo è il codice adesso, devo sistemare un pochino i gradi che non sono precisi ma alla fine è del tutto irrilevante.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24

#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float  odo, Speed, alt, Dist, head, maxs = 0;

char bussola [3]; //  2 caratteri lettere punti cardinali

unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;

static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; // autovelox impostato a 0.1 avverte quando avviene il fix
void disp(int c, int r)
{
  oled.clear();
  oled.setCursor(c, r);
}
void setup() {
  
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.displayRemap(true);//reverse lcd
  
  oled.clear();
 
  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(65, 2);
    oled.print("SD");//quando leggi SD manca la scheda 
    delay(10000);
    oled.clear();
    return;
  }
 
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("D  H  T  La  Lo  K  D  A  V  B" ); // data, ora,  durata percorrenza, latitudine, longitudine, distanza percorsa, distanza lineare da punto di fix, altitudine, velocità, gradi bussola
  data.close();
}
void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    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 ( Speed > maxs)          maxs = Speed;
    if (fix.valid.heading )     head = fix.heading() ;
    
    if (fix.valid.altitude) {
        alt = fix.altitude();
       
    }
    // punti cardinali gradi bussola  (float head) convertiti in lettere (bussola)
        if ((head > 343 && head < 360) || (head > 0 && head < 22)) {
       strcpy( bussola, "N ") ;
    }

    if (head > 23 && head < 68) {
     strcpy  ( bussola, "NE") ;
    }
    if (head > 69 && head < 114) {
    strcpy( bussola, "E ") ;
    }
    if (head > 115 && head < 160) {
     strcpy ( bussola, "SE") ;
    }
    if (head > 161 && head < 206) {
     strcpy ( bussola, "S ") ;
    }
    if (head > 207 && head < 252) {
     strcpy   ( bussola, "SO") ;
    }
    if (head > 253 && head < 298) {
     strcpy  ( bussola,"O ") ;
    }
    if (head > 299 && head < 342) {
     strcpy  ( bussola, "NO") ;
    }

    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      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, "Bu:%s\n",bussola);  //punti cardinali bussola scritti sul display
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print("  ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print("  ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print("  ");
    data.print(fix.latitude(), 6);
    data.print("  ");
    data.print(fix.longitude(), 6);
    data.print("  ");
       
    data.print(odo);
    data.print("  ");
    data.print(Dist);
    data.print("  ");
    data.print(alt);
    data.print("  "); 
    data.print(Speed);
    data.print("  ");
    data.print(head);
    data.print("  ");
    
    data.close();
  }
}

mi sarebbe piaciuto aggiungere anche qualche altra funzione o fare una legenda più comprensibile da leggere ma non ho più spazio.
adesso esco a verificare cosa ho fatto.. poi se non ci faccio nottata inizio a fare lo sketch con la tua simulazione che magari consuma meno risorse.

ok funziona tutto, ho sistemato anche la rosa dei venti con una migliore precisione dei gradi che avevo fatto ad occhio.
provato adesso non ho riscontrato nessun difetto.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24

#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float  odo, Speed, alt, Dist, h, maxs = 0;

char bussola [3]; //  2 caratteri lettere punti cardinali

unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;

static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
int show          = INITIAL_SHOW;
const int   LED_PIN  = 3;
const float SPEED_LIMIT = 0.1; 
void disp(int c, int r)
{
  oled.clear();
  oled.setCursor(c, r);
}
void setup() {
  
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  oled.displayRemap(true);//reverse lcd
  
  oled.clear();
 
  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(65, 2);
    oled.print("SD");//if you read this mean SD is not present
    delay(10000);
    oled.clear();
    return;
  }
 
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("D  H  T  La  Lo  K  D  A  V  B" );
  data.close();
}
void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    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 ( Speed > maxs)          maxs = Speed;
    if (fix.valid.heading )     h = fix.heading() ;
    
    if (fix.valid.altitude) {
        alt = fix.altitude();
       
    }
    // punti cardinali gradi bussola  (float head) convertiti in lettere (bussola)
        if ((h > 338 && h < 360) || (h > 0 && h < 22)) {
       strcpy( bussola, "N ") ;
    }

    if (h > 23 && h < 67) {
     strcpy  ( bussola, "NE") ;
    }
    if (h > 68 && h < 112) {
    strcpy( bussola, "E ") ;
    }
    if (h > 113 && h < 157) {
     strcpy ( bussola, "SE") ;
    }
    if (h > 158 && h < 202) {
     strcpy ( bussola, "S ") ;
    }
    if (h > 203 && h < 247) {
     strcpy   ( bussola, "SO") ;
    }
    if (h > 248 && h < 292) {
     strcpy  ( bussola,"O ") ;
    }
    if (h > 293 && h < 337) {
     strcpy  ( bussola, "NO") ;
    }

    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      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, "He:%s\n",bussola);  //punti cardinali bussola scritti sul display
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)h, (int)(h * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print("  ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print("  ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print("  ");
    data.print(fix.latitude(), 6);
    data.print("  ");
    data.print(fix.longitude(), 6);
    data.print("  ");
       
    data.print(odo);
    data.print("  ");
    data.print(Dist);
    data.print("  ");
    data.print(alt);
    data.print("  "); 
    data.print(Speed);
    data.print("  ");
    data.print(h);
    data.print("  ");
    
    data.close();
  }
}

ciao, ho provato la tua simulazione ma mettendola in uno sketch da errore forbids converting a string constant to char*
adesso vedo se riesco a capire come risolvere perché il tuo sistema di arrivare al risultato è interessante, forse basta mettere const davanti a char?
pensavo potesse dipendere dall'averlo male integrato nel programma del gps ma ho visto che l'errore avviene anche copiando solo il listato della simulazione in un file.ino
continuo a fare le mie prove e ti ringrazio dell'aiuto.

Esattamente qual è l'istruzione che ti da problemi?

Lo sketch in questione non usa variabili String, ma se vuoi passare da una String ad un char* (detta anche C string) devi usare il metodo .c_str()

String myString = "This is an Arduino String";
Serial.println(myString);

char* c_string = myString.c_str();
Serial.println(c_string);

Ho risolto in questo modo aggiungendo const char*, ora ha iniziato a piovere e appena smette vedo di verificare se funziona.
il programma carica bene e sembra funzionare perchè mi ha già dato la N del valore zero iniziale, tra l'altro con il tuo contributo è molto più snello di memoria.
questo mi ha permesso di ripristinare alcune lettere della legenda della scheda SD e funzioni che avevo dovuto togliere per trovare spazio sufficiente.
questo il codice

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24
#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float odo, Speed, alt, Dist, head, maxs = 0;
unsigned int  Sat = 0;
unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;
bool altOK = false;
static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr 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 disp(int c, int r)
{
  oled.clear();
  oled.setCursor(c, r);
}
const char* strBussola[9] = {"N", "NE", "E", "SE", "S", "SO", "O", "NO"};
int index;  
int trovaIndice(float angolo) {
int _index;
for(_index=0; _index<8; _index++) {
float angoloDirezione = _index * 45.0 + 22.50;
float angoloMin = angoloDirezione - 22.50;
float angoloMax = angoloDirezione + 22.50;
if (angolo >= angoloMin && angolo <= angoloMax)
            return _index;
}
return _index;  
}
void setup() {

  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  //oled.displayRemap(true); // inversione dello schermo display
  disp(15, 2);
  oled.println("TUO NOME GPS");
  delay(2000);
  
  oled.clear();

  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(60, 2);
    oled.print("NO SD");
    delay(10000);
    oled.clear();
    return; 
head = 165.0;    
    index = trovaIndice(head);
head = 205.0;    
    index = trovaIndice(head);
head = 314.5;    
    index = trovaIndice(head);
head = 22.5;    
    index = trovaIndice(head);
}
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("Da Hr Tm La Lo At Km Di Ve He Co Sa" );
  data.close();
}
void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
      digitalWrite( LED_PIN, HIGH );
    } else {
      digitalWrite( LED_PIN, LOW );
      }
    if (fix.valid.location) {
      if (lastLocOK) {
       
        float segDist = fix.location.DistanceKm( lastLoc );
        
      
        if (segDist < 0.1F) {
            odo += segDist;
            Speed = fix.speed_kph();
        }
      }
      lastLoc   = fix.location;
      lastLocOK = true;
      if (stScan) {
        stScan = false;
        base   = fix.location;
      } else {
        Dist = ( fix.location.DistanceKm( base ) );
      }
    }
    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();
        altOK = true;
    }
    
    
    
    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
      oled.println(displayBufffer);
      
      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 4);
      snprintf(displayBufffer, MAX_CHARS, "Co: %s\n", (strBussola[index]));
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print(" ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print(" ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print(" ");
    data.print(fix.latitude(), 6);
    data.print(" ");
    data.print(fix.longitude(), 6);
    data.print(" ");
    data.print(alt);
    data.print(" ");
    
    data.print(odo);
    data.print(" ");
    data.print(Dist);
    data.print(" ");
    data.print(Speed);
    data.print(" ");
    data.print(head);
    data.print(" ");
    data.print(strBussola[index]);
    data.print(" ");
    data.print(Sat);
    data.println();
    data.close();
  }
}

Dovresti sistemare l'indentazione del codice premendo CTRL+T nell'IDE Arduino per rendere la lettura più chiara.

Hai lasciato queste righe che erano solo di test nel setup(). Tra l'altro dopo un return e quindi non verranno mai eseguite.
Inoltre hai definito la funzione, ma non la usi quando dovresti, ovvero subito dopo che hai determinato il valore di head

Prova cosi (ho dato una sistemata qui e la):

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <NeoSWSerial.h>

#define I2C_ADDRESS 0x3C
#define RST_PIN -1
#define MAX_CHARS 24
#define RX_pin 5
#define TX_pin 4
#define SHOW_INTERVAL 1
#define GPS_baud 9600
SSD1306AsciiWire oled;
NMEAGPS gps;
gps_fix fix;
float odo, Speed, alt, Dist, head, maxs = 0;
unsigned int  Sat = 0;
unsigned long tmp, var = 0;
int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
NeoGPS::Location_t    lastLoc, base;
bool stScan = true, lastLocOK = false;
bool altOK = false;
static NeoSWSerial gpsPort(RX_pin, TX_pin);
static constexpr 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 disp(int c, int r) {
  oled.clear();
  oled.setCursor(c, r);
}

const char* strBussola[8] = {"N", "NE", "E", "SE", "S", "SO", "O", "NO"};
int index;

int trovaIndice(float angolo) {
  int _index;
  for (_index = 0; _index < 8; _index++) {
    float angoloDirezione = _index * 45.0 + 22.50;
    float angoloMin = angoloDirezione - 22.50;
    float angoloMax = angoloDirezione + 22.50;
    if (angolo >= angoloMin && angolo <= angoloMax)
      return _index;
  }
  return _index;
}

void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin(9600);
  gpsPort.begin(GPS_baud);
  Wire.begin();
  oled.begin(&SH1106_128x64, I2C_ADDRESS);
  oled.setFont(ZevvPeep8x16);
  //oled.displayRemap(true); // inversione dello schermo display
  disp(15, 2);
  oled.println("TUO NOME GPS");
  delay(2000);
  oled.clear();
  const int cs_sd = 2;
  if (!SD.begin (cs_sd)) {
    oled.clear();
    disp(60, 2);
    oled.print("NO SD");
    delay(10000);
    oled.clear();
  }
  File data = SD.open("L.csv", FILE_WRITE);
  data.println("");
  data.println("Da Hr Tm La Lo At Km Di Ve He Co Sa" );
  data.close();
}

void loop() {
  tmp = (millis() / 1000);
  secondi = tmp - (var * 10) + fct;
  if (secondi > 60) {
    secondi = secondi - 60;
  }
  if (secondi == 60) {
    minuti = minuti + 1;
    var = var + 6;
  }
  if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
    fct = fct + fcl;
  }
  if (minuti >= 60) {
    minuti = 0;
    ore = ore + 1;
  }
  if (ore >= 24) {
    ore = 0;
  }
  if (gps.available( gpsPort )) {
    gps_fix fix = gps.read();
    show = (show + 1) % SHOW_INTERVAL;
    if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
      digitalWrite( LED_PIN, HIGH );
    } else {
      digitalWrite( LED_PIN, LOW );
    }
    if (fix.valid.location) {
      if (lastLocOK) {
        float segDist = fix.location.DistanceKm( lastLoc );
        if (segDist < 0.1F) {
          odo += segDist;
          Speed = fix.speed_kph();
        }
      }
      lastLoc   = fix.location;
      lastLocOK = true;
      if (stScan) {
        stScan = false;
        base   = fix.location;
      } else {
        Dist = ( fix.location.DistanceKm( base ) );
      }
    }
    if ( Speed > maxs)          maxs = Speed;
    if (fix.valid.satellites )  Sat = fix.satellites ;
    
    if (fix.valid.heading ) {
      head = fix.heading() ;
      index = trovaIndice(head);
    }
    
    if (fix.valid.altitude) {
      alt = fix.altitude();
      altOK = true;
    }

    if (show == 0) {
      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 * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 2);
      snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
      oled.println(displayBufffer);

      snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
      oled.println(displayBufffer);
      oled.setCursor(65, 4);
      snprintf(displayBufffer, MAX_CHARS, "Co: %s\n", (strBussola[index]));
      oled.println(displayBufffer);
      snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
      oled.println(displayBufffer);
      oled.setCursor(65, 6);
      snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
      oled.println(displayBufffer);
    }
    File data = SD.open("L.csv", FILE_WRITE);
    data.print(fix.dateTime.hours + 2);
    data.print(":");
    data.print(fix.dateTime.minutes);
    data.print(" ");
    data.print(fix.dateTime.date);
    data.print("/");
    data.print(fix.dateTime.month);
    data.print(" ");
    data.print(ore);
    data.print(":");
    data.print(minuti);
    data.print(":");
    data.print(secondi);
    data.print(" ");
    data.print(fix.latitude(), 6);
    data.print(" ");
    data.print(fix.longitude(), 6);
    data.print(" ");
    data.print(alt);
    data.print(" ");

    data.print(odo);
    data.print(" ");
    data.print(Dist);
    data.print(" ");
    data.print(Speed);
    data.print(" ");
    data.print(head);
    data.print(" ");
    data.print(strBussola[index]);
    data.print(" ");
    data.print(Sat);
    data.println();
    data.close();
  }
}

caspita non entra più nella nano salvo dare problemi di memoria. cosa è cambiato?

è cambiato che nella parte degli if adesso index = trovaIndice(head); porta le variabili globali a usare 1564 invece di 1532 byte

Se devi scriverlo su un display, non è più semplice assegnare un valore da 1 a 8 e poi con uno switch/case scrivere N o NE o E ecc.?

byte dir=(head+22)/45;
if(dir==8) dir=0;

switch(dir)
  {
  case 0:
  lcd.print("N ");
  break;

  case 1:
  lcd.print("NE");
  break;
  
  case 2:
  lcd.print("E ");
  break;
  
  case 3:
  lcd.print("SE");
  break;
  
  case 4:
  lcd.print("S ");
  break;
  
  case 5:
  lcd.print("SW");
  break;
  
  case 6:
  lcd.print("W ");
  break;
  
  case 7:
  lcd.print("NW");
  break;
  }

potrebbe essere un altro modo da valutare, al momento sto usando la lista di if del codice nel post #12 provata anche stasera e funziona bene.
ha come unico difetto che sono preciso con la memoria e ho dovuto togliere alcune cose come la legenda della SD con una sola lettera e la presentazione "tuo nome gps" cose alla fine irrilevanti.
mi intrigava sistemare la prova di cotestatnt perchè mi piace ma non entra nella memoria per davvero pochi byte di memoria per le variabili, domani se ho tempo vedo di trovare un modo di ricavare spazio e poi provo volentieri anche la soluzione switch case.
vi ringrazio.