Buongiorno a tutti, sto modificando uno sketch di un gps logger trovato su project hub.
questo https://create.arduino.cc/projecthub/yvesmorele/rc-loggerstation-gps-data-logger-for-rc-plane-3ea4cd
vorrei riuscire ad aggiungere un dato relativo alla distanza percorsa dall'accensione e fix.
al momento il progetto funziona tutto eccetto la parte relativa a "dist" che vorrei fosse la distanza che viene percorsa.
al massimo avrà da percorrere 20.000 metri che potrebbero essere visualizzati anche come 20.0
vi chiedo se secondo voi è possibile istruire una finzione del genere con i pezzi a disposizione, sto iniziando a pensare che anche col miglior risultato possibile otterrei un dato inattendibile e fortemente sballato.
questo è il codice
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include<SD.h>
const int cs_sd=2;
static const int RXPin = 0, TXPin = 1;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
int maxspeed = 0, speed1 = 0;
int maxhigh = 0, high1 = 0;
int maxsatelite = 0, satelite1 = 0;
int Mps = 0, kmh1 = 0, dist =0;
int flat, flat1, flon, flon1,x2lat, x2lon ;
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
//------------------------------------------------------------------------------
void setup() {
Wire.begin();
ss.begin(GPSBaud);
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif
oled.setFont(System5x7);
oled.clear();
oled.println(" ");
oled.println("GPS DATA LOGGER");
delay(1000);
oled.clear();
if(!SD.begin(cs_sd))
{
oled.clear();
oled.print(" SD");
return;
}
oled.print("SD OK");
delay(1000);
oled.clear();
File data = SD.open("log.txt",FILE_WRITE);
data.println(""); data.println("log acquisition");
data.close();
}
//------------------------------------------------------------------------------
void loop() {
satelite1 = (abs(gps.satellites.value()));
oled.print("V max ");
oled.print(" H max ");
oled.print(" Sat ");
oled.println(" ");
oled.println(" ");
speed1 = (gps.speed.kmph());
if ( speed1 > maxspeed) {
maxspeed = speed1;
}
oled.setCursor(10 , 60);
oled.print(maxspeed);
high1 = (gps.altitude.meters());
if ( high1 > maxhigh) {
maxhigh = high1;
}
oled.setCursor(50 , 60);
oled.print(maxhigh);
oled.setCursor(100 , 60);
oled.print(satelite1);
oled.println(" ");
oled.println(" ");
oled.print("Km/h");
oled.print(" M/s ");
oled.print(" Dist ");
oled.println(" ");
oled.println(" ");
kmh1 = (gps.speed.kmph());
oled.setCursor(10 , 110);
oled.print(kmh1);
{
Mps = (gps.speed.mps());
oled.setCursor(50 , 110);
oled.print(Mps);
}
float flat1 = flat;
float flon1 = flon;
float dist_calc;
float dist_calc2;
float diflat = 0;
float diflon = 0;
diflat = radians(x2lat - flat1);
flat1 = radians(flat1);
x2lat = radians(x2lat);
diflon = radians((x2lon) - (flon1));
dist_calc = (sin(diflat / 2.0) * sin(diflat / 2.0));
dist_calc2 = cos(flat1);
dist_calc2 *= cos(x2lat);
dist_calc2 *= sin(diflon / 2.0);
dist_calc2 *= sin(diflon / 2.0);
dist_calc += dist_calc2;
dist_calc = (2 * atan2(sqrt(dist_calc), sqrt(1.0 - dist_calc)));
dist_calc *= 6371000.0;
oled.setCursor(90 , 110);
oled.print(dist_calc); //distanza in metri
String Temps=String(gps.time.hour()+1)+(":")+(gps.time.minute())+(":")+(gps.time.second());
String Date=String(gps.date.day())+("/")+(gps.date.month())+("/")+(gps.date.year());
File data=SD.open("log.txt",FILE_WRITE);
data.println(Date + " " + Temps + " " + String(gps.location.lat(), 6)+" "+String(gps.location.lng(), 6)+(" ")+String(gps.altitude.meters(),0)+(" ")+String(gps.speed.kmph(),0))+(" ")+String(satelite1);
data.close();
DelayGPS(100);
oled.clear();
}
static void DelayGPS(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}
questo è il display come si presenta adesso, funziona tutto eccetto dist che resta a zero.
date le perplessità adesso sto pensando di ottenere la distanza percorsa con un reed o un A3144.
non so se avrò lo spazio necessario per aggiungere un conteggio a impulsi nella memoria disponibile.
sto giusto studiando adesso la via per fare un contachilometri con un sensore magnetico ma dovrei scrivere qualcosa di molto semplice per farlo convivere nello stesso sketch.
avete suggerimenti?
grazie a tutti.