Start Position - recorded when you press a button
Current Position, or "No Fix" if no valid satellite data received
Time and Date
Distance travelled from Start to Current in nm
Here's the code:
// GPS with report of No Fix // and record/display of start position // and distance travelled #include "SoftwareSerial.h" #include "U8glib.h" // GPS 11 RX, 10 TX SoftwareSerial gps(10, 11); // LCD 6 SCK(E), 5 MOSI(RW), 4 SS(RS) U8GLIB_ST7920_128X64_1X lcd(6, 5, 4); char gpsbuf[200]; // GPS output line char temp[20] = "No Start posn"; char startlatdeg[20] = "--", startlatmin[20] = "", startlondeg[20] = "--", startlonmin[20] = ""; char startns[2] = "", startew[2] = ""; char curlatdeg[20] = "--", curlatmin[20] = "--", curlondeg[20] = "--", curlonmin[20] = "--"; char curns[2] = "-", curew[2] = "-"; char time[20] = "__", date[20] = "--"; char fix[5]; int startflag = false; void setup() { gps.begin(9600); // start GPS serial Serial.begin(9600); pinMode(2, INPUT_PULLUP); // LOW = read start position } void loop() { float lat; float lon; float dist; do // get GPS output, look for $GPRMC { getline(gpsbuf); } while(strncmp(gpsbuf, "$GPRMC", 6) != 0); Serial.println(gpsbuf); // button press records start position if(digitalRead(2) == LOW) { delay(5); // button bounce extfmt(3, "**", gpsbuf, startlatdeg); // read deg lat extfmt(3, " *****", gpsbuf, startlatmin); // read min lat extfmt(4, "*", gpsbuf, startns); // NS extfmt(5, "***", gpsbuf, startlondeg); // read deg lon extfmt(5, " *****", gpsbuf, startlonmin); // read min lon extfmt(6, "*", gpsbuf, startew); // EW startflag = true; } // extract current position to cur*** arrays extfmt(2, "*", gpsbuf, fix); Serial.println(fix); if(fix[0] == 'A') { extfmt(3, "**", gpsbuf, curlatdeg); // read deg lat extfmt(3, " *****", gpsbuf, curlatmin); // read min lat extfmt(4, "*", gpsbuf, curns); // NS extfmt(5, "***", gpsbuf, curlondeg); // read deg lon extfmt(5, " *****", gpsbuf, curlonmin); // read min lon extfmt(6, "*", gpsbuf, curew); // EW extfmt(1, "**:**", gpsbuf, time); extfmt(9, "**-**-**", gpsbuf, date); } else strcpy(curlatdeg, "No Fix"); if(startflag) // if there is a cstart position { lat = atof(startlatdeg) * 60 + atof(startlatmin); lat -= atof(curlatdeg) * 60 + atof(curlatmin); // lat in minutes lon = atof(startlondeg) * 60 + atof(startlonmin); lon -= atof(curlondeg) * 60 + atof(curlonmin); // lon in minutes dist = sqrt(lat * lat + lon * lon); sprintf(temp, "%d", dist); // print int into temp buffer } lcd.firstPage(); // prepare display do { lcd.setFont(u8g_font_helvR08); // 1st line lcd.drawStr(2, 8, "Start"); lcd.drawStr(2, 17, startlatdeg); lcd.drawStr(20, 17, startlatmin); lcd.drawStr(48, 17, startns); lcd.drawStr(65, 17, startlondeg); lcd.drawStr(87, 17, startlonmin); lcd.drawStr(118, 17, startew); lcd.drawStr(2, 26, "Current"); lcd.drawStr(2, 35, curlatdeg); lcd.drawStr(20, 35, curlatmin); lcd.drawStr(48, 35, curns); lcd.drawStr(65, 35, curlondeg); lcd.drawStr(88, 35, curlonmin); lcd.drawStr(118, 35, curew); lcd.drawStr(2, 44, "Time"); lcd.drawStr(65, 44, "Date"); lcd.drawStr(2, 53, time); lcd.drawStr(65, 53, date); lcd.drawStr(2, 62, "Dist nm"); lcd.drawStr(44, 62, temp); } while(lcd.nextPage()); } // get a line from the GPS void getline(char *buf) { int bp = 0; char c; do { c = gps.read(); // -1 if no char available if(c == -1) continue; buf[bp++] = c; } while(c != '\n'); buf[bp] = '\0'; } // find field, extract in fmt from inbuf to outbuf // fmt * = copy inbuf to outbuf, else copy fmt to outbuf void extfmt(int field, char *fmt, char *inbuf, char *outbuf) { int f = 0; // field count, common & input pointers int fp = 0; int op = 0; int ip = 0; // find field and ip start while(f != field) { while(inbuf[ip++] != ','); f++; } // format from ip while(fmt[fp] !='\0') { if(fmt[fp] == ' ') ip++; // skip along else if(fmt[fp] == '*') { outbuf[op++] = inbuf[ip++]; // copy in to out } else { outbuf[op++] = fmt[fp]; // insert format } fp++; } outbuf[op] = '\0'; // add end of string }
1 comment:
Hello,
I like this project!
I have made it and it works prtey well :)
But can you tell me pleace where i can find the point that makes the distance in nm?
I dont understand it where it is :/ and what have i to do to make it in meters?
Greating
Georg
Post a Comment