| 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++ objectTinyGPSPlus gps;// The serial connection to the GPS deviceSoftwareSerial 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 elementTinyGPSCustom messageNumber(gps, "GPGSV", 2);      // $GPGSV sentence, second elementTinyGPSCustom satsInView(gps, "GPGSV", 3);         // $GPGSV sentence, third elementTinyGPSCustom satNumber[4]; // to be initialized laterTinyGPSCustom 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;      }    }  }}
 |