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.