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