Getting errors during compile

I am using the TinyGPS library and trying to combine it with the LCD library to display various GPS data. However, I can not compile because it says 'gpsdump' declared void. I am sure I need to fix other things in the sketch but, I can get past the error.

Any help would be great!

// Ported to SdFat from the native Arduino SD library example by Bill Greiman
// . SdFat handles setting SS
// MicroSD sheild pins 8,11,13
//LCD screen 7,6,5,4,3,2
//Button one A0
//Button two A1
//Gps rx A2 D16
//gps tx A3 D17
//LED pin 13
/*

/* This sample code demonstrates the normal use of a TinyGPS object.
 It requires the use of NewSoftSerial, and assumes that you have a
 4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
 */

int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval at which to time communication events:


#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:


#include <NewSoftSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
NewSoftSerial nss(16,17); //Gps rx A2 D16 tx A3 D17

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

lcd.setCursor(1,1);
lcd.print("GPS is starting"); // I will enter number for testing:
delay(2000);  
lcd.clear(); 

void setup()
{
  Serial.begin(115200);
  nss.begin(9600);
  lcd.begin(16, 2);    // set up the LCD's number of columns and rows:   
  lcd.setCursor(0,0);   
  lcd.print("B1 to Read");// Print a message to the LCD.
  delay(1000); // chance to push a button:
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  buttonStateone = digitalRead(14);
  buttonStatetwo = digitalRead(15);
  lcd.setCursor(0,1);
  lcd.print("Ini. SD card");// Print a message to the LCD.
  delay (1000);

  Serial.print("Testing TinyGPS library v. "); 
  Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); 
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop()
{

  if (buttonStateone == HIGH) {
  }

  if (buttonStatetwo == HIGH) {
    lcd.setCursor(0,0);
    lcd.print("Nothing Yet Baby! ");// Print a message to the LCD.
    delay (1000);
  }   


  pinMode(13, OUTPUT);   
  digitalWrite (13, HIGH ); //led indicator to show action
  bool newdata = false;
  unsigned long start = millis();

  // Every 1 seconds we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }

  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
    Serial.print('-');
    number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;

  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint; 
  } 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); 
  Serial.print(lat); 
  Serial.print(", "); 
  Serial.print(lon); 
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

    gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); 
  printFloat(flat, 5); 
  Serial.print(", "); 
  printFloat(flon, 5);
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); 
  Serial.print(date); 
  Serial.print(" Time(hhmmsscc): "); 
  Serial.print(time);
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); 
  Serial.print(static_cast<int>(month)); 
  Serial.print("/"); 
  Serial.print(static_cast<int>(day)); 
  Serial.print("/"); 
  Serial.print(year);
  Serial.print("  Time: "); 
  Serial.print(static_cast<int>(hour)); 
  Serial.print(":"); 
  Serial.print(static_cast<int>(minute)); 
  Serial.print(":"); 
  Serial.print(static_cast<int>(second)); 
  Serial.print("."); 
  Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  Serial.print("Alt(cm): "); 
  Serial.print(gps.altitude()); 
  Serial.print(" Course(10^-2 deg): "); 
  Serial.print(gps.course()); 
  Serial.print(" Speed(10^-2 knots): "); 
  Serial.println(gps.speed());
  Serial.print("Alt(float): "); 
  printFloat(gps.f_altitude()); 
  Serial.print(" Course(float): "); 
  printFloat(gps.f_course()); 
  Serial.println();
  Serial.print("Speed(knots): "); 
  printFloat(gps.f_speed_knots()); 
  Serial.print(" (mph): ");  
  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); 
  printFloat(gps.f_speed_mps()); 
  Serial.print(" (kmph): "); 
  printFloat(gps.f_speed_kmph()); 
  Serial.println();

  feedgps();
  digitalWrite (13, LOW ); //led indicator to show action
  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); 
  Serial.print(chars); 
  Serial.print(" sentences: "); 
  Serial.print(sentences); 
  Serial.print(" failed checksum: "); 
  Serial.println(failed);
}

bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

The first thing I saw was this:

lcd.setCursor(1,1);
lcd.print("GPS is starting"); // I will enter number for testing:
delay(2000);  
lcd.clear();

This is intended to be executable statements, but they are outside any function declaration.
You need to move these into your setup() function; the current usage is not legal C/C++ syntax.

To help narrow the search for my problem, my error pops up at the end of the snippet of the code.
Where is it says 'gpsdump' declared void:void gpsdump(TinyGPS &gps);

int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval at which to time communication events:


#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:


#include <NewSoftSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
NewSoftSerial nss(16,17); //Gps rx A2 D16 tx A3 D17

void gpsdump(TinyGPS &gps);
bool feedgps();

Thank you jwatte for your input. Those statements have worked in a previous code but, I will work with them and see if it helps the problem. I will have to wait to it tomorrow though.

cyclegadget:
Thank you jwatte for your input. Those statements have worked in a previous code but, I will work with them and see if it helps the problem. I will have to wait to it tomorrow though.

By the way, if that's not the problem, then you should copy and paste the exact errors that come out of the compiler when you build, which will make it much easier to figure out what's going wrong. Sometimes, a later error is actually more helpful than the first error, or vice versa.

jwatte thanks for your continued help. You were correct that those statements were in the wrong place however, that was only a small problem. I ended up moving this part under the GPS library #include stuff. I think it is a bug in the library because it seems like I did not really change much other that the order in which the library's were called.

This part is what I moved:

int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval at which to time communication events:


#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:

Here is the code that I am going to continue working on. I now compiles but, I need to work on the LCD output. Then work on button actions.

//LCD screen 7,6,5,4,3,2
//Button one A0
//Button two A1
//Gps rx A2 D16
//gps tx A3 D17
//LED pin 13
/*

/* This sample code demonstrates the normal use of a TinyGPS object.
 It requires the use of NewSoftSerial, and assumes that you have a
 4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
 */



#include <NewSoftSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
NewSoftSerial nss(16,17); //Gps rx A2 D16 tx A3 D17

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval at which to time communication events:


#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:




void setup()
{


  Serial.begin(115200);
  nss.begin(9600);
  lcd.begin(16, 2);    // set up the LCD's number of columns and rows:   
  lcd.setCursor(0,0); 
  lcd.setCursor(1,1);
  lcd.print("GPS is starting"); // I will enter number for testing:
  delay(2000);  
  lcd.clear();   
  lcd.print("B1 to Read");// Print a message to the LCD.
  delay(1000); // chance to push a button:
  pinMode(14, INPUT);
  pinMode(15, INPUT);
  buttonStateone = digitalRead(14);
  buttonStatetwo = digitalRead(15);
  lcd.setCursor(0,1);
  lcd.print("Ini. SD card");// Print a message to the LCD.
  delay (1000);

  Serial.print("Testing TinyGPS library v. "); 
  Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); 
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop()
{

  if (buttonStateone == HIGH) {
  }

  if (buttonStatetwo == HIGH) {
    lcd.setCursor(0,0);
    lcd.print("Nothing Yet Baby! ");// Print a message to the LCD.
    delay (1000);
  }   


  pinMode(13, OUTPUT);   
  digitalWrite (13, HIGH ); //led indicator to show action
  bool newdata = false;
  unsigned long start = millis();

  // Every 1 seconds we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }

  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
    Serial.print('-');
    number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;

  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint; 
  } 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); 
  Serial.print(lat); 
  Serial.print(", "); 
  Serial.print(lon); 
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

    gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); 
  printFloat(flat, 5); 
  Serial.print(", "); 
  printFloat(flon, 5);
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); 
  Serial.print(date); 
  Serial.print(" Time(hhmmsscc): "); 
  Serial.print(time);
  Serial.print(" Fix age: "); 
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); 
  Serial.print(static_cast<int>(month)); 
  Serial.print("/"); 
  Serial.print(static_cast<int>(day)); 
  Serial.print("/"); 
  Serial.print(year);
  Serial.print("  Time: "); 
  Serial.print(static_cast<int>(hour)); 
  Serial.print(":"); 
  Serial.print(static_cast<int>(minute)); 
  Serial.print(":"); 
  Serial.print(static_cast<int>(second)); 
  Serial.print("."); 
  Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  
  Serial.print(age); 
  Serial.println("ms.");

  feedgps();

  Serial.print("Alt(cm): "); 
  Serial.print(gps.altitude()); 
  Serial.print(" Course(10^-2 deg): "); 
  Serial.print(gps.course()); 
  Serial.print(" Speed(10^-2 knots): "); 
  Serial.println(gps.speed());
  Serial.print("Alt(float): "); 
  printFloat(gps.f_altitude()); 
  Serial.print(" Course(float): "); 
  printFloat(gps.f_course()); 
  Serial.println();
  Serial.print("Speed(knots): "); 
  printFloat(gps.f_speed_knots()); 
  Serial.print(" (mph): ");  
  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); 
  printFloat(gps.f_speed_mps()); 
  Serial.print(" (kmph): "); 
  printFloat(gps.f_speed_kmph()); 
  Serial.println();

  feedgps();
  digitalWrite (13, LOW ); //led indicator to show action
  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); 
  Serial.print(chars); 
  Serial.print(" sentences: "); 
  Serial.print(sentences); 
  Serial.print(" failed checksum: "); 
  Serial.println(failed);
}

bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

I think it is a bug in the library because it seems like I did not really change much other that the order in which the library's were called.

Highly unlikely that the bug is in a library. Those are thoroughly tested prior to general release.

Your code, on the other hand...

This part is what I moved:

That was not the part that was in the wrong place. Of course moving it didn't help.

  if (buttonStateone == HIGH) {
  }

If you are not going to do anything if the condition is true, why bother with the test? Where does buttonStateone get a value?

  pinMode(13, OUTPUT);

Are you changing the mode of pin 13? If not, this statement should be executed once, in setup().

  bool newdata = false;
  unsigned long start = millis();

  // Every 1 seconds we print an update
  while (millis() - start < 1000)
  {
    if (feedgps())
      newdata = true;
  }

This comment is wrong. It does not describe what this code is doing. Almost certainly, you want to do something (whatever it is) if millis() - start is greater than or equal (not less than) 1000. When you do whatever it is, you need to reset start to "now". Also, start needs to be either global or static. As it is now, start gets reset on every pass through loop. Again, this is almost certainly NOT what you want.

Ditto for newdata. Don't forget to reset it somewhere (like newdata = feedgps(); instead of a separate if test).

You are most likely correct about the library PaulS. I found that I may have had a problem with location of "{ }" or the amount of them. I am still not sure what it was but, I made a new sketch and compile after every little change to make it work.

I will have to think more about "newdata" and how to work with it.

I put this in setuppinMode(13, OUTPUT); 

Made a LCD to show the button is working for now

if (buttonStateone == HIGH) { //still working on what to do**********
    lcd.setCursor(0,0);
    lcd.print("ya the button worked");
  }

Made corrections to this:

bool newdata = false;
  unsigned long start = millis();

  // Every 2 seconds we print an update
  while (millis() - start >= 2000)
  {
    if (feedgps())
      newdata = true;
  }

Here is the latest code before I continue eliminating Serial prints and put only needed Lcd prints.

#include <NewSoftSerial.h>
#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of NewSoftSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

TinyGPS gps;
NewSoftSerial nss(16, 17);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

// Ported to SdFat from the native Arduino SD library example by Bill Greiman
// . SdFat handles setting SS
// MicroSD sheild pins 8,11,13
//LCD screen 7,6,5,4,3,2
//Button one A0
//Button two A1
//Gps rx A2 D16
//gps tx A3 D17
//LED pin 13
/*
 SD card read/write
 
 This example shows how to read and write data to and from an SD card file 
 	 
 *************************************************************/
const int chipSelect = 8;
int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval at which to time communication events:
//********************************************************************************************

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:
//********************************************************************************************


void setup()
{
  Serial.begin(115200);
  nss.begin(4800);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
   lcd.begin(16, 2);    // set up the LCD's number of columns and rows:   
  pinMode(14, INPUT);
  pinMode(15, INPUT);  
  pinMode(10, OUTPUT); // default chip select pin output, even if you don't use it: 
  pinMode(13, OUTPUT);   
  lcd.setCursor(1,1);
  lcd.print("GPS is starting"); // I will enter number for testing:
  delay(2000);
}

void loop()
{
    buttonStateone = digitalRead(14);
  buttonStatetwo = digitalRead(15);
 
  digitalWrite (13, HIGH ); //led indicator to show action
  
   if (buttonStateone == HIGH) { //still working on what to do**********
    lcd.setCursor(0,0);
    lcd.print("ya the button worked");
  }

  if (buttonStatetwo == HIGH) {
    lcd.setCursor(0,1);
    lcd.print("Nothing Yet Baby! ");// Print a message to the LCD.
    delay (1000);
  }
  
  bool newdata = false;
  unsigned long start = millis();

  // Every 2 seconds we print an update
  while (millis() - start >= 2000)
  {
    if (feedgps())
      newdata = true;
  }
  
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint; 
  } 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");
  
  feedgps();

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

  feedgps();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
  
bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}
// Every 2 seconds we print an update
  while (millis() - start >= 2000)
  {
    if (feedgps())
      newdata = true;
  }

Better, but you only fixed one of the 4 problems. start and newdata are still local, non-static variables, so they get reset on every pass through loop.

Also, when to display new data should be independent of the status of feedgps(). The feedgps(0 return value will tell you whether you have data to display. The millis() - start > 2000 will happen only once every two seconds (if you correct the issues with start). You want to display data when the time is right AND you have data to display.

newdata = feedgps();
if(newdata && millis() - start >= 2000)
{
   // Update the LCD

   start = millis();
}

No while loop...

Thank you for the fix with newdata. :slight_smile: I am trimming and testing. I currently have MPH and time displayed on the LCD.

I had to add 7 to the hour in order to fix the time to my time zone. I think I will have a problem with that when it gets closer to midnight. I need to either correct the time zone or come up with some if statements to correct the time. I think it could be a mess.

The code is getting closer:

#include <NewSoftSerial.h>
#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
 It requires the use of NewSoftSerial, and assumes that you have a
 9600-baud serial GPS device hooked up on pins 16(rx) and 17(tx).
 */

TinyGPS gps;
NewSoftSerial nss(16, 17);

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

// Ported to SdFat from the native Arduino SD library example by Bill Greiman
// . SdFat handles setting SS
// MicroSD sheild pins 8,11,13
//LCD screen 7,6,5,4,3,2
//Button one A0
//Button two A1
//Gps rx A2 D16
//gps tx A3 D17
//LED pin 13
/*
 SD card read/write
 
 This example shows how to read and write data to and from an SD card file 
 	 
 *************************************************************/
const int chipSelect = 8;
int buttonStateone = 0;         // variable for reading the pushbutton 1  status:
int buttonStatetwo = 0;         // variable for reading the pushbutton 2 status:
unsigned long previousMillis = 0;        // will store last time:
unsigned long currentMillis = 0;         // stores current time:
unsigned long interval = 150;           // interval for later
bool newdata = false;
int start = 0;   //used for timing updates
//********************************************************************************************

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);   // initialize the library with the numbers of the interface pins:
//********************************************************************************************


void setup()
{
  Serial.begin(115200);
  nss.begin(9600);

  Serial.print("TinyGPS "); 

  lcd.begin(16, 2);    // set up the LCD's number of columns and rows:   
  pinMode(14, INPUT);
  pinMode(15, INPUT);  
  pinMode(10, OUTPUT); // default chip select pin output, even if you don't use it: 
  pinMode(13, OUTPUT);   
  lcd.setCursor(1,1);
  lcd.print("GPS starting"); // I will enter number for testing:
  delay(1000);
}

void loop()
{
  lcd.setCursor(0,0);
  lcd.print("MPH  ");
  lcd.print(gps.f_speed_mph()); 
  lcd.print("       ");

  buttonStateone = digitalRead(14);
  buttonStatetwo = digitalRead(15);

  digitalWrite (13, HIGH ); //led indicator to show action

  if (buttonStateone == HIGH) { //still working on what to do**********
    lcd.setCursor(0,0);
    lcd.print("ya the button worked");
  }

  if (buttonStatetwo == HIGH) {
    lcd.setCursor(0,1);
    lcd.print("Nothing Yet Baby! ");// Print a message to the LCD.
    delay (1000);
  }



  // Every 2 seconds we print an update
  newdata = feedgps();
  if(newdata && millis() - start >= 2000)
  {
    // Update the LCD

    start = millis();
  }

  if (newdata)
  {
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
    Serial.print('-');
    number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;

  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint; 
  } 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;



  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

    gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); 
  printFloat(flat, 5); 
  Serial.print(", "); 
  printFloat(flon, 5);


  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  lcd.setCursor(0,1);
  lcd.print(static_cast<int>(hour + 7)); 
  lcd.print(":"); 
  lcd.print(static_cast<int>(minute)); 
  lcd.print(":");
  lcd.print(static_cast<int>(second)); 

}

bool feedgps()
{
  while (nss.available())
  {
    if (gps.encode(nss.read()))
      return true;
  }
  return false;
}

I had to add 7 to the hour in order to fix the time to my time zone. I think I will have a problem with that when it gets closer to midnight. I need to either correct the time zone or come up with some if statements to correct the time. I think it could be a mess.

Not too bad:

hour += 7;
if(hour > 23)
{
   hour -= 24;
   day += 1;
}

Of course, now you need to deal with day possibly moving into next month. Then, you need to deal with month possibly moving into next year.

This stuff:

if (newdata)
{
Serial.println("-------------");
gpsdump(gps);
Serial.println("-------------");
Serial.println();
}

belongs in the if block above it, right after the comment to update the LCD. The if test is superfluous (and incomplete...).

static_cast(hour + 7)

borrowed from some stupid Microsoft example, no doubt.
The hour variable is an int. The value 7 is an int. The addition operation produces an int. The need to cast an int to an int using a template completely escapes me.