ho costruito un gps che funziona abbastanza bene ma vorrei modificare alcune funzioni, purtroppo non ne sto venendo a capo..
il gps è questo
https://create.arduino.cc/projecthub...52375&offset=0
in questi giorni sto provando ad aggiungere una funzione "disl" dislivello che vorrei misurasse da zero (fix, reset o campo base) i metri di altitudine che vengono discesi o saliti durante un tragitto..
ovvero disl vorrei poterlo azzerare sulla cima di una collina e sapere sul display quanti metri di dislivello sono stati percorsi.
attualmente "alt = fix altitude mi rende un dato sul livello del mare e tutte le prove che ho fatto hanno sempre indicato una altitudine di partenza slm ad esempio 48mt casa mia.
io è da poco che gioco con arduino e avrei bisogno di confrontarmi con qualcuno più esperto di me che magari mi possa aiutare a scrivere meglio il codice.
non riesco a capire come azzerare il dato dell'altitudine slm, la stessa cosa che si fa con una bilancia quando si azzera la tara e si esclude la ciotola.
questo è il codice.
"disl" adesso misura un valore fix.alt.whole ma è solo un refuso dell'ultima prova che ho fatto..
codice:
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <NMEAGPS.h>
#include <SoftwareSerial.h>
//#include <NeoSWSerial.h>
const int cs_sd=2;
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire lcd;
NMEAGPS gps;
gps_fix fix;
File myFile;
float odo;
float Speed;
float alt;
int disl; //--dislivello
NeoGPS::Location_t lastLoc;
bool lastLocOK = false;
static const int RXPin = 5, TXPin = 4; //-- gps pin
static const uint32_t GPSBaud = 9600;
SoftwareSerial 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; //-- led on at speed limit
const float SPEED_LIMIT = 0.0; // --setup speed limit value es: 55.0; kmh
int maxs = 0;
void setup(){
pinMode (LED_PIN, OUTPUT);
Serial.begin(9600);
gpsPort.begin(GPSBaud);
Wire.begin();
lcd.begin(&Adafruit128x64, I2C_ADDRESS);
lcd.setFont(TimesNewRoman16_bold);
lcd.clear();
lcd.println(" GPS");
lcd.println(" ");
lcd.println(" WELCOME");
delay(3000);
lcd.clear();
if(!SD.begin(cs_sd)){
lcd.clear();
lcd.println(" ");
lcd.print("NO SD");
delay(3000);
return;}
lcd.println(" ");
lcd.print("SD Card OK");
delay(2000);
lcd.clear();
File data = SD.open("log.csv",FILE_WRITE);
data.println("");
data.println("Data Hr+1 Lat Lon Disl Alt Vel Dist" ); //-- Hr+1 add your local time difference
data.close();}
void loop(){
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 ( Speed > maxs)
maxs = Speed;
if (fix.valid.altitude)
alt = ( fix.altitude());
disl = (fix.alt.whole);//--dislivello
if (show == 0) {
#define MAX_CHARS 22
char displayBufffer[MAX_CHARS];
lcd.setCursor(0,0);
snprintf(displayBufffer, MAX_CHARS, " Km : % 3d.%02d", (int)odo, (int)(odo * 100)%100);
lcd.println(displayBufffer);
snprintf(displayBufffer, MAX_CHARS, "Kmh: % 3d.%02d", (int)Speed, (int)(Speed * 100)%100);
lcd.println(displayBufffer);
snprintf(displayBufffer, MAX_CHARS, "Vmx: % 3d.%02d", (int)maxs, (int)(maxs * 100)%100);
lcd.println(displayBufffer);
snprintf(displayBufffer, MAX_CHARS, "Disl : % 3d.%02d", (int)alt, (int)(alt * 100)%100);
lcd.println(displayBufffer);}
String Temps=String(fix.dateTime.hours +1)+(":")+(fix.dateTime.minutes)+(":")+(fix.dateTime.seconds);
String Date=String(fix.dateTime.day)+("/")+(fix.dateTime.month)+("/")+(fix.dateTime.year);
File data=SD.open("log.csv",FILE_WRITE);
data.println(Date +(" ")+ Temps +(" ")+ String(fix.latitude(), 6)+(" ")+String(fix.longitude(), 6)+(" ")+String(disl)+(" ")+String(alt)+(" ")+String(Speed)+(" ")+ String(odo));
data.close();}}
vi ringrazio.