gps data logger

Sezione dedicata alla costruzione di robot
Rispondi
Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

gps data logger

Messaggio da wrighizilla » 31/05/2020, 18:25

ciao, sto costruendo un progetto di gps data logger for plane trovato sui project hub.
https://create.arduino.cc/projecthub/yv ... ane-3ea4cd

nella sua versione di base registra solo la velocità massima l'altitudine massima e il numero di satelliti gps connessi.
inoltre sulla sd registra le coordinate.

io adesso sto modificando lo sketch per aggiungere alcune funzioni.
in seguito le vorrei aggiungere anche nella parte che riguarda la SD card ma per adesso mi sto limitando al gps e al display.

ho aggiunto la velocità al secondo.. un dato che varia rispetto agli altri che indicano solo i valori massimi di picco..
è stato facile, ho scritto la stringa: int kmh1 = 0; e poi kmh1 = (gps.speed.kmph()); direttamente dalla libreria tinygps++
mandato a display oled.setCursor(10 , 110); oled.print(kmh1); funziona bene, provato adesso per strada.


adesso però vorrei riuscire ad aggiungere un nuovo dato che misuri la distanza percorsa dall'accensione e fix gps fino al momento della lettura.. una sorta di conta chilometri basato sui metri al secondo che vengono percorsi e sommati.
potete aiutarmi per favore? mi perdo.. :muro

questo è il codice scritto fin'ora..

Codice: Seleziona tutto

 #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 kmh = 0, kmh1 = 0;


#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("  Trip ");
  oled.println(" ");
  oled.println(" "); 
{
  kmh1 = (gps.speed.kmph());
  
  }
 
  oled.setCursor(10 , 110);
  oled.print(kmh1);
  
   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 quello che vedo adesso nello schermo.. tutto a zero ovviamente e campo Trip (sul serio ) ancora vuoto e tutto ancora da scrivere

https://i.postimg.cc/ry3LJjxV/P1011800.jpg




kele-1
Utente Registrato
Messaggi: 78
Iscritto il: 21/08/2019, 4:04
Località: Udine
Grazie Inviati: 1 volta
Grazie Ricevuti: 4 volte
Stato: Non connesso

gps data logger

Messaggio da kele-1 » 05/06/2020, 14:35

Caio wrigh. Non ho ancora mai guardato neanche da lontano i gps quindi non penso di poterti essere utile.
Ma perché i chilometri percorsi li devi trovare dai chilometri all'ora?
Guardando sommariamente il codice ho visto che ci sono le funzioni che restituiscono la latitudine e longitudine del punto in cui ti trovi.
Da queste informazioni mi viene da pensare che si possano sfruttare questi dati per:
- memorizzare le coordinate del punto passato
- leggere le coordinate del punto attuale
- calcolare la distanza della linea che collega i due punti
- sommarla ai km percorsi totali
- ripetere il procedimento per ogni lettura

Avatar utente

Topic author
wrighizilla
Utente Registrato
Messaggi: 78
Iscritto il: 03/10/2018, 14:55
Grazie Inviati: 4 volte
Grazie Ricevuti: 3 volte
Stato: Non connesso

gps data logger

Messaggio da wrighizilla » 16/06/2020, 15:44

ho cambiato tutto.. in primis libreria gps.
alla fine dopo tante sperimentazioni ho costruito questo https://create.arduino.cc/projecthub/wr ... 5&offset=0

funziona piuttosto bene anche se l'altitudine non è affidabile come avrei sperato, non so perchè, non sembra dipendere dal codice ma dal mio gps che in 3d fix effettua letture sporadiche solemente dell'altitudine e con un margine di errore di una decina di metri.
sono giunto a questa conclusione cambiando il settaggio con u-blox center, probabilmente con un modulo gps migliore del mio funziona tutto perfettamente.
in sostanza adesso la distanza viene misurata piuttosto bene, idem la velocità istantanea e soprattutto le coordinate in modo direi ottimo.
il tutto finisce scritto su SD e su google maps vedo spostamenti anche nell'ordine di 1 metro.

in questa versione era presente anche un limitatore di velocità con allarme buzzer ma sarebbe fastidioso, quindi ho modificato con un led che ho impostato a zero solo per vedere quando ho il fix realmente attivo.

non so dire se possono esserci difetti nel codice capaci da compromettere la lettura dell'altitudine, ho provato ad assegnare int oppure float per numeri con la virgola ma non cambia nulla.. la lettura col mio drotek neo6m è imprecisa in ogni caso.
cambia invece molto settando bene il gps su ublox center ma non è così semplice.

ad ogni modo adesso la lettura dell'altitudine è sufficiente per farsi un'idea del dislivello percorso (10mt più o meno e rilevato ogni 2-3 minuti invece che istantaneamente).

questo il codice

Codice: Seleziona tutto

   #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;
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 LOGGER");
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("Date  Hr+  Lat  Lon  Alt  Vel  Dis" ); //-- Hr+ 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 () );
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, " Alt   :  %  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(alt)+("  ") +String(Speed)+("  ")+ String(odo)); 
data.close();}}
e questo lo schema di collegamento

https://hacksterio.s3.amazonaws.com/upl ... paEb3j.png


ad ogni modo se avete suggerimenti e idee per modifiche fatemi sapere.. sperimento volentieri. :ciao

Rispondi