| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | #include <TinyGPS++.h>#include <SoftwareSerial.h>/*   This sample code tracks satellite elevations using TinyGPSCustom objects.   Satellite numbers and elevations are not normally tracked by TinyGPS++, but    by using TinyGPSCustom we get around this.   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;static const int MAX_SATELLITES = 40;static const int PAGE_LENGTH = 40;// The TinyGPS++ objectTinyGPSPlus gps;// The serial connection to the GPS deviceSoftwareSerial ss(RXPin, TXPin);TinyGPSCustom totalGPGSVMessages(gps, "GPGSV", 1); // $GPGSV sentence, first elementTinyGPSCustom messageNumber(gps, "GPGSV", 2);      // $GPGSV sentence, second elementTinyGPSCustom satNumber[4]; // to be initialized laterTinyGPSCustom elevation[4];bool anyChanges = false;unsigned long linecount = 0;struct{  int elevation;  bool active;} sats[MAX_SATELLITES];void setup(){  Serial.begin(115200);  ss.begin(GPSBaud);  Serial.println(F("SatElevTracker.ino"));  Serial.println(F("Displays GPS satellite elevations as they change"));  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  }}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());        if (no >= 1 && no <= MAX_SATELLITES)        {          int elev = atoi(elevation[i].value());          sats[no-1].active = true;          if (sats[no-1].elevation != elev)          {            sats[no-1].elevation = elev;            anyChanges = true;          }        }      }            int totalMessages = atoi(totalGPGSVMessages.value());      int currentMessage = atoi(messageNumber.value());      if (totalMessages == currentMessage && anyChanges)      {        if (linecount++ % PAGE_LENGTH == 0)          printHeader();        TimePrint();        for (int i=0; i<MAX_SATELLITES; ++i)        {          Serial.print(F(" "));          if (sats[i].active)            IntPrint(sats[i].elevation, 2);          else            Serial.print(F("   "));          sats[i].active = false;        }        Serial.println();        anyChanges = false;      }    }  }}void IntPrint(int n, int len){  int digs = n < 0 ? 2 : 1;  for (int i=10; i<=abs(n); i*=10)    ++digs;  while (digs++ < len)    Serial.print(F(" "));  Serial.print(n);  Serial.print(F(" "));}void TimePrint(){  if (gps.time.isValid())  {    if (gps.time.hour() < 10)      Serial.print(F("0"));    Serial.print(gps.time.hour());    Serial.print(F(":"));    if (gps.time.minute() < 10)      Serial.print(F("0"));    Serial.print(gps.time.minute());    Serial.print(F(":"));    if (gps.time.second() < 10)      Serial.print(F("0"));    Serial.print(gps.time.second());    Serial.print(F(" "));  }  else  {    Serial.print(F("(unknown)"));  }}void printHeader(){  Serial.println();  Serial.print(F("Time     "));  for (int i=0; i<MAX_SATELLITES; ++i)  {    Serial.print(F(" "));    IntPrint(i+1, 2);  }  Serial.println();  Serial.print(F("---------"));  for (int i=0; i<MAX_SATELLITES; ++i)    Serial.print(F("----"));  Serial.println();}
 |