NeoGPS icon indicating copy to clipboard operation
NeoGPS copied to clipboard

Distance skipping heavily, even when stationary

Open sumagnadas opened this issue 3 years ago • 0 comments

Components:

  • GPS Ublox M8N
  • Arduino Mega 2560 Clone/Genuine
  • Display Nextion enhanced

Output Clock : OK Lon : OK Lat : OK Speed : OK

Problem :

HDOP : not showing Sat count : not showing Trip Distance is skipping heavily. For example 3.99km (walk) of distance is showing 7.xx Trip Distance is ticking when stationary.

CODE :

#include <NMEAGPS.h>
#include <GPSport.h>
#include "extraFuncs.h"

/* variables of default type */
float max_speed = 0, dist = 0;

/* variables of custom classes */
static NMEAGPS gps;
NeoGPS::Location_t prev_loc(91L, 181L);
const gps_fix fix;

/* Reads the data whenever it is available */
static void readData(uint8_t c)
{
   gps.handle(c);
}

/* setup() function */
void setup()
{
  Serial1.begin(9600);
  
  gpsPort.attachInterrupt(readData);
  gpsPort.begin(9600);
}

/* loop() function which will be run by the board constantly */
void loop()
{ 
  if (gps.available()){
    fix = gps.read();
  }
  //if (fix.valid.heading){sendData("dir", fix.heading());}
  if (fix.valid.hdop){sendData("hdop", fix.hdop);}
  if (fix.valid.satellites){sendData("sat", fix.satellites);}

  sendData("speed", fix.speed_kph());
  sendData("max", maxspeed());
  
  if (fix.valid.location){
    sendData("long", fix.longitude());
    sendData("lat", fix.latitude());
    if (prev_loc.lat() != 91L){
      dist += fix.location.DistanceKm(prev_loc);
    }
    prev_loc.lat(fix.latitudeL());
    prev_loc.lon(fix.longitudeL());
    sendData("dist", dist);
  }
  
  PrintTime();//Prints the time
  stopwatch();
  getData();
}

extraFuncs.h contains:

extern const gps_fix fix;
extern float max_speed, dist;

template <typename T> void sendData(char *var, T n);

void ender() {
  for (int i=1; i<=3; i++)
    Serial1.write(0xff);
}

void getData(){
  if (Serial1.available()){
    String a = Serial1.readString();
    if (a.indexOf("dis++") != -1){
      dist += 0.1;
    }
    if (a.indexOf("dis--") != -1 and dist >= 0.1){
      dist -= 0.1;
    }
    sendData("dist", dist);
  }
}

/* Function which sends the passed data, irrespective of the data type,
   to the Nextion display after converting it to String */
template <typename T>
void sendData(char *var, T n) {
  Serial1.print(String(var) + String(".") + String("txt") + String("=\"") + String(n) + String("\""));
  ender();
}

/* function for stopwatch */
void stopwatch() {
  int ms = millis() % 1000;
  int secs = millis() / 1000;
  int mins = secs / 60;
  secs %= 60;
  int hours = mins / 60;
  mins %= 60;
  char elapsed[12];
  sprintf(elapsed, "%02d:%02d:%02d.%02d", hours, mins, secs, ms);
  sendData("stopwatch", elapsed);
}

/* Get the max speed recorded by the GPS module */
static float maxspeed() {
  if (fix.speed_kph() > max_speed) {
    max_speed = fix.speed_kph();
  }
  return max_speed;
}

/* Print the time after adding a few hours for IST */
static void PrintTime() {
    int ind_minute = fix.dateTime.minutes + 30, ind_hour = fix.dateTime.hours + 5, ind_second = fix.dateTime.seconds;
    if (ind_minute >= 60) {
      ind_hour += 1;
      ind_minute -= 60;
    }
    if (ind_hour > 23) {
      ind_hour %= 24;
    }
    char ind_time[8];
    sprintf(ind_time, "%02d:%02d:%02d", ind_hour, ind_minute, ind_second);
    sendData("time", ind_time);
}

sumagnadas avatar Aug 25 '21 12:08 sumagnadas