Example updates

This commit is contained in:
Rick Sellens 2020-01-29 09:33:26 -05:00
parent 6ea92a021d
commit bc038a14cf
2 changed files with 147 additions and 3 deletions

View File

@ -34,9 +34,10 @@ Adafruit_GPS GPS(&GPSSerial);
#ifdef NMEA_EXTENSIONS #ifdef NMEA_EXTENSIONS
// Create another GPS object to hold the state of the boat, with no // Create another GPS object to hold the state of the boat, with no
// communications, so don't call Boat.begin() in setup. We will build some fake // communications, so you don't need to call Boat.begin() in setup.
// sentences from the Boat data to feed to GPS for testing. // We will build some fake sentences from the Boat data to feed to
Adafruit_GPS Boat(&GPSSerial); // GPS for testing.
Adafruit_GPS Boat;
#endif #endif
// Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console

View File

@ -0,0 +1,143 @@
/**************************************************************************/
/*!
@file NMEA_EXTENSIONS.ino
@section intro Introduction
An Arduino sketch for testing the NMEA_EXTENSIONS to the library. Does
not require any GPS hardware. Boat is a data only object we can use to
represent the actual data and build sentences from. GPS is a data only
object that parses the sentences and saves the results, the same way you
would with a communicating GPS object
Only some of the data values will have added history. Note that history
is stored as integers, scaled and offset from the float values to save
memory. The AWA (Apparent Wind Angle) is recorded as three components,
so that sin and cos parts can be accurately time averaged. onList() allows
testing sentences against a list to see if they should be passed on to
another listener, allowing your sketch to act as an NMEA multiplexer.
Although it will just barely compile for an UNO with the NMEA_EXTENSIONS,
defining two GPS objects pushes the limits of the UNO data space and
should probably be avoided.
@section author Author
Written by Rick Sellens.
@section license License
CCBY license
*/
/**************************************************************************/
#include "Adafruit_GPS.h"
Adafruit_GPS GPS; // The results obtained from the instruments -- no comms
Adafruit_GPS Boat; // The state of the boat used to create some simulated sentences
void setup() {
Serial.begin(115200);
while (!Serial && millis() < 10000); // Wait for monitor to be ready.
Serial.print("\n\nNMEA_EXTENSIONS Example v 0.1.1\n\n");
#ifdef NMEA_EXTENSIONS
addHistory(&GPS);
#else
Serial.print("NMEA_EXTENSIONS not #defined, so there will be no action.\n");
#endif
}
char latestBoat[200] = "";
const char *senList[] = {"GGA", "GLL", "DBT", "HDM", "MWV", "ZZ"}; // sentence list
const char *passList[] = {"GGA", "DBT", "ZZ"}; // short list
void loop() {
static unsigned long lastPrint = 0;
updateBoat();
// stop keeping AWA history after 30 seconds, just as a demonstration
#ifdef NMEA_EXTENSIONS
if(millis() > 30000) GPS.removeHistory(NMEA_AWA);
#endif
if (millis() - lastPrint > 300 || lastPrint == 0) {
lastPrint = millis();
#ifdef NMEA_EXTENSIONS
Serial.print("\nSentences built from Boat and parsed by GPS ");
Serial.print("(Only a few get passed on to the ST network.):\n\n");
for (int i = 0;strncmp(senList[i],"ZZ",2);i++){
if (GPS.parse(Boat.build(latestBoat, "II", senList[i]))){
if (GPS.onList(latestBoat,passList))
Serial.print("Pass to ST: ");
else Serial.print(" No Pass: ");
Serial.print(latestBoat);
} else {
Serial.print("Couldn't build and parse a ");
Serial.print(senList[i]);
Serial.print(" sentence, maybe because sprintf() doesn't work with %f.");
}
}
Serial.print("\nSome of the resulting data stored in GPS:\n\n");
GPS.showDataValue(NMEA_LAT);
GPS.showDataValue(NMEA_LON);
GPS.showDataValue(NMEA_AWA, 20); // show more history values, if history on
GPS.showDataValue(NMEA_AWA_SIN);
GPS.showDataValue(NMEA_AWA_COS);
GPS.showDataValue(NMEA_AWS);
GPS.showDataValue(NMEA_HDG);
GPS.showDataValue(NMEA_DEPTH);
Serial.print("\nThe AWA is: ");
Serial.print(GPS.get(NMEA_AWA));
Serial.print(" while the smoothed value is: ");
Serial.println(GPS.getSmoothed(NMEA_AWA));
#endif // NMEA_Extensions
}
}
void updateBoat() { // Fill up the boat values with
// some test data to use in build()
nmea_float_t t = millis() / 1000.;
nmea_float_t theta = t / 100.; // slow
nmea_float_t gamma = theta * 10; // faster
// add some data to the old Adafruit_GPS variables
Boat.latitude = 4400 + sin(theta) * 60;
Boat.lat = 'N';
Boat.longitude = 7600 + cos(theta) * 60;
Boat.lon = 'W';
Boat.fixquality = 2;
Boat.speed = 3 + sin(gamma);
Boat.hour = abs(cos(theta)) * 24;
Boat.minute = 30 + sin(theta / 2) * 30;
Boat.seconds = 30 + sin(gamma) * 30;
Boat.milliseconds = 500 + sin(gamma) * 500;
Boat.year = 1 + abs(sin(theta)) * 25;
Boat.month = 1 + abs(sin(gamma)) * 11;
Boat.day = 1 + abs(sin(gamma)) * 26;
Boat.satellites = abs(cos(gamma)) * 10;
#ifdef NMEA_EXTENSIONS
// add some data to the new NMEA data values
Boat.newDataValue(NMEA_AWS, 10 + cos(theta));
Boat.newDataValue(NMEA_AWA, 180 * sin(gamma));
Boat.newDataValue(NMEA_VTW, Boat.speed + cos(gamma) / 3);
Boat.newDataValue(NMEA_DEPTH, 10 + cos(gamma) * 5);
Boat.newDataValue(NMEA_HDG, 180 * sin(gamma) + 180);
Boat.newDataValue(NMEA_HDT, 180 * cos(gamma) + 180);
Boat.newDataValue(NMEA_VMG, sin(gamma) * 3);
Boat.newDataValue(NMEA_VMGWP, cos(gamma) * 5);
#endif // NMEA_EXTENSIONS
}
#ifdef NMEA_EXTENSIONS
void addHistory(Adafruit_GPS *nmea) {
// Record integer history for HDOP, scaled by 10.0, offset by 0.0,
// every 15 seconds for the most recent 20 values.
nmea->initHistory(NMEA_HDOP, 10.0, 0.0, 15, 20);
nmea->initHistory(NMEA_COG, 10.0, 0.0, 1);
nmea->initHistory(NMEA_AWA, 10.0, 0.0, 1);
nmea->initHistory(NMEA_HDG, 10.0, 0.0, 3);
// Record pressure every 10 minutes, in Pa relative to 1 bar
nmea->initHistory(NMEA_BAROMETER, 1.0, -100000.0, 600);
nmea->initHistory(NMEA_DEPTH, 10.0, 0.0, 3);
}
#endif // NMEA_EXTENSIONS