150 lines
4.5 KiB
Arduino
150 lines
4.5 KiB
Arduino
|
#include <TinyGPSPlus.h>
|
||
|
#include <SoftwareSerial.h>
|
||
|
/*
|
||
|
This sample code demonstrates how to use an array of TinyGPSCustom objects
|
||
|
to monitor all the visible satellites.
|
||
|
|
||
|
Satellite numbers, elevation, azimuth, and signal-to-noise ratio are not
|
||
|
normally tracked by TinyGPSPlus, but by using TinyGPSCustom we get around this.
|
||
|
|
||
|
The simple code also demonstrates how to use arrays of TinyGPSCustom objects,
|
||
|
each monitoring a different field of the $GPGSV sentence.
|
||
|
|
||
|
It requires the use of SoftwareSerial, and assumes that you have a
|
||
|
4800-baud serial GPS device hooked up on pins 4(RX) and 3(TX).
|
||
|
*/
|
||
|
static const int RXPin = 4, TXPin = 3;
|
||
|
static const uint32_t GPSBaud = 4800;
|
||
|
|
||
|
// The TinyGPSPlus object
|
||
|
TinyGPSPlus gps;
|
||
|
|
||
|
// The serial connection to the GPS device
|
||
|
SoftwareSerial ss(RXPin, TXPin);
|
||
|
|
||
|
/*
|
||
|
From http://aprs.gids.nl/nmea/:
|
||
|
|
||
|
$GPGSV
|
||
|
|
||
|
GPS Satellites in view
|
||
|
|
||
|
eg. $GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
|
||
|
$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
|
||
|
$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D
|
||
|
|
||
|
1 = Total number of messages of this type in this cycle
|
||
|
2 = Message number
|
||
|
3 = Total number of SVs in view
|
||
|
4 = SV PRN number
|
||
|
5 = Elevation in degrees, 90 maximum
|
||
|
6 = Azimuth, degrees from true north, 000 to 359
|
||
|
7 = SNR, 00-99 dB (null when not tracking)
|
||
|
8-11 = Information about second SV, same as field 4-7
|
||
|
12-15= Information about third SV, same as field 4-7
|
||
|
16-19= Information about fourth SV, same as field 4-7
|
||
|
*/
|
||
|
|
||
|
static const int MAX_SATELLITES = 40;
|
||
|
|
||
|
TinyGPSCustom totalGPGSVMessages(gps, "GPGSV", 1); // $GPGSV sentence, first element
|
||
|
TinyGPSCustom messageNumber(gps, "GPGSV", 2); // $GPGSV sentence, second element
|
||
|
TinyGPSCustom satsInView(gps, "GPGSV", 3); // $GPGSV sentence, third element
|
||
|
TinyGPSCustom satNumber[4]; // to be initialized later
|
||
|
TinyGPSCustom elevation[4];
|
||
|
TinyGPSCustom azimuth[4];
|
||
|
TinyGPSCustom snr[4];
|
||
|
|
||
|
struct
|
||
|
{
|
||
|
bool active;
|
||
|
int elevation;
|
||
|
int azimuth;
|
||
|
int snr;
|
||
|
} sats[MAX_SATELLITES];
|
||
|
|
||
|
void setup()
|
||
|
{
|
||
|
Serial.begin(115200);
|
||
|
ss.begin(GPSBaud);
|
||
|
|
||
|
Serial.println(F("SatelliteTracker.ino"));
|
||
|
Serial.println(F("Monitoring satellite location and signal strength using TinyGPSCustom"));
|
||
|
Serial.print(F("Testing TinyGPSPlus library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
|
||
|
Serial.println(F("by Mikal Hart"));
|
||
|
Serial.println();
|
||
|
|
||
|
// Initialize all the uninitialized TinyGPSCustom objects
|
||
|
for (int i=0; i<4; ++i)
|
||
|
{
|
||
|
satNumber[i].begin(gps, "GPGSV", 4 + 4 * i); // offsets 4, 8, 12, 16
|
||
|
elevation[i].begin(gps, "GPGSV", 5 + 4 * i); // offsets 5, 9, 13, 17
|
||
|
azimuth[i].begin( gps, "GPGSV", 6 + 4 * i); // offsets 6, 10, 14, 18
|
||
|
snr[i].begin( gps, "GPGSV", 7 + 4 * i); // offsets 7, 11, 15, 19
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
// Dispatch incoming characters
|
||
|
if (ss.available() > 0)
|
||
|
{
|
||
|
gps.encode(ss.read());
|
||
|
if (totalGPGSVMessages.isUpdated())
|
||
|
{
|
||
|
for (int i=0; i<4; ++i)
|
||
|
{
|
||
|
int no = atoi(satNumber[i].value());
|
||
|
// Serial.print(F("SatNumber is ")); Serial.println(no);
|
||
|
if (no >= 1 && no <= MAX_SATELLITES)
|
||
|
{
|
||
|
sats[no-1].elevation = atoi(elevation[i].value());
|
||
|
sats[no-1].azimuth = atoi(azimuth[i].value());
|
||
|
sats[no-1].snr = atoi(snr[i].value());
|
||
|
sats[no-1].active = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int totalMessages = atoi(totalGPGSVMessages.value());
|
||
|
int currentMessage = atoi(messageNumber.value());
|
||
|
if (totalMessages == currentMessage)
|
||
|
{
|
||
|
Serial.print(F("Sats=")); Serial.print(gps.satellites.value());
|
||
|
Serial.print(F(" Nums="));
|
||
|
for (int i=0; i<MAX_SATELLITES; ++i)
|
||
|
if (sats[i].active)
|
||
|
{
|
||
|
Serial.print(i+1);
|
||
|
Serial.print(F(" "));
|
||
|
}
|
||
|
Serial.print(F(" Elevation="));
|
||
|
for (int i=0; i<MAX_SATELLITES; ++i)
|
||
|
if (sats[i].active)
|
||
|
{
|
||
|
Serial.print(sats[i].elevation);
|
||
|
Serial.print(F(" "));
|
||
|
}
|
||
|
Serial.print(F(" Azimuth="));
|
||
|
for (int i=0; i<MAX_SATELLITES; ++i)
|
||
|
if (sats[i].active)
|
||
|
{
|
||
|
Serial.print(sats[i].azimuth);
|
||
|
Serial.print(F(" "));
|
||
|
}
|
||
|
|
||
|
Serial.print(F(" SNR="));
|
||
|
for (int i=0; i<MAX_SATELLITES; ++i)
|
||
|
if (sats[i].active)
|
||
|
{
|
||
|
Serial.print(sats[i].snr);
|
||
|
Serial.print(F(" "));
|
||
|
}
|
||
|
Serial.println();
|
||
|
|
||
|
for (int i=0; i<MAX_SATELLITES; ++i)
|
||
|
sats[i].active = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|