123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include <TinyGPS++.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 TinyGPS++, 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 TinyGPS++ 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 TinyGPS++ 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;
- }
- }
- }
- }
|