I am creating library for GPS to use in my project. I am using Adafruit GPS and its library to create my own library in which I am using millis()
function to display the GPS Location after 1 minute (60s). So when I created my inline code the function works very well and also displays location after 60s. But I created header
and cpp
file for my own library, in which it doesn't gives any error but the results(location) is not displayed. Doesn't shows any output. So I printed the time which is 0 (attached the output screenshot)
My code updates the GPS every 30s and prints the location every 1 minute.It also checks the if old location is equal to new location in every 1minute.
I think there is problem with my libaray or with the millis() function. I am new to Arduino programming , please help me with this.
My inline code is:
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
uint32_t timer = millis();
float old_lat,old_lon,new_lat,new_lon;
void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand("$PMTK220,30000*1F");
mySerial.println(PMTK_Q_RELEASE);
}
void loop() // run over and over again
{
char c = GPS.read();
if (GPS.newNMEAreceived()) {
//Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
if (GPS.fix) {
old_lat = GPS.latitudeDegrees;
old_lon = GPS.longitudeDegrees;
if (timer > millis()) timer = millis();
if (millis() - timer > 60000) {
timer = millis();
Serial.println("Location 1 minute:");
displaytime();
new_lat = GPS.latitudeDegrees;
new_lon = GPS.longitudeDegrees;
if (new_lat == old_lat){
new_lat = old_lat;
}
else{
new_lat = GPS.latitudeDegrees;
}
Serial.print("Final Latitude: ");
Serial.println(new_lat,6);
if (new_lon == old_lon){
new_lon = old_lon;
}
else{
new_lon = GPS.longitudeDegrees;
}
Serial.print("Final Longitude: ");
Serial.println(new_lon,6);
}
}
}
void displaytime(){
Serial.print("\nTime: ");
if (GPS.hour < 10) { Serial.print('0'); }
Serial.print(GPS.hour, DEC); Serial.print(':');
if (GPS.minute < 10) { Serial.print('0'); }
Serial.print(GPS.minute, DEC); Serial.print(':');
if (GPS.seconds < 10) { Serial.print('0'); }
Serial.print(GPS.seconds, DEC); Serial.print('.');
if (GPS.milliseconds < 10) {
Serial.print("00");
} else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
Serial.print("0");
}
Serial.println(GPS.milliseconds);
}
My header file is :
/*
* GPS.h - library used to show Latitude and Longitude
*/
#ifndef GPS_Loc_h
#define GPS_Loc_h
#include "Arduino.h"
class SoftwareSerial;
class Adafruit_GPS;
class GPS_Loc
{
public:
GPS_Loc();
void displaytime();
void displayloc();
uint32_t timer;
float old_lat,old_lon,new_lat,new_lon;
};
#endif
My cpp file is:
/*
* GPS_Loc.cpp - library used to show Latitude and Longitude
*/
#include "Arduino.h"
#include "GPS_Loc.h"
#include "Adafruit_GPS.h"
#include "SoftwareSerial.h"
#define GPSECHO true
SoftwareSerial mySerial(11,10);
Adafruit_GPS GPS(&mySerial);
GPS_Loc::GPS_Loc()
{
timer = millis();
old_lat = old_lat;
old_lon = old_lon;
new_lat = new_lat;
new_lon = new_lon;
}
void GPS_Loc::displayloc(){
//Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand("$PMTK220,30000*1F");
mySerial.println(PMTK_Q_RELEASE);
char c = GPS.read();
if (GPS.newNMEAreceived()) {
//Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
if (GPS.fix) {
old_lat = GPS.latitudeDegrees;
old_lon = GPS.longitudeDegrees;
if (timer > millis()) timer = millis();
if (millis() - timer > 60000) {
timer = millis();
Serial.println("Location 1 minute:");
displaytime();
new_lat = GPS.latitudeDegrees;
new_lon = GPS.longitudeDegrees;
if (new_lat == old_lat){
new_lat = old_lat;
}
else{
new_lat = GPS.latitudeDegrees;
}
Serial.print("Location lat: ");
Serial.println(new_lat,6);
if (new_lon == old_lon){
new_lon = old_lon;
}
else{
new_lon = GPS.longitudeDegrees;
}
Serial.print("Location long: ");
Serial.println(new_lon,6);
}
}
}
void GPS_Loc::displaytime(){
Serial.print("\nTime: ");
if (GPS.hour < 10) { Serial.print('0'); }
Serial.print(GPS.hour, DEC); Serial.print(':');
if (GPS.minute < 10) { Serial.print('0'); }
Serial.print(GPS.minute, DEC); Serial.print(':');
if (GPS.seconds < 10) { Serial.print('0'); }
Serial.print(GPS.seconds, DEC); Serial.print('.');
if (GPS.milliseconds < 10) {
Serial.print("00");
} else if (GPS.milliseconds > 9 && GPS.milliseconds < 100) {
Serial.print("0");
}
Serial.println(GPS.milliseconds);
}
My demo code using my own library is:
#include <GPS_Loc.h>
GPS_Loc bgps;
void setup() {
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
bgps.displaytime();
bgps.displayloc();
}
GPS.begin(9600);
. You are initialize the serial connection every time you call displayLoc. But in the inline code, you only do this once. Try adding aninit
function to your class, that will setup the serial only once.