#include #include #include #define CLK 4 //pins definitions for TM1637 #define DIO 5 static const int RXPin = 10, TXPin = 11; // GPS serial pins unsigned long last = 0UL; // update counter uint8_t SEG_LINES[] = {SEG_G,0x00,0x00,0x00}; // For displaying dashes TM1637Display display(CLK, DIO); // Set up display TinyGPSPlus gps; // The TinyGPS++ object SoftwareSerial ss(RXPin, TXPin); // And the software serial connection for the GPS void setup() { display.setBrightness(0x0f); // This needs to be controlled by an LDR. For v.2 Serial.begin(115200); // Hardware serial port for debug ss.begin(4800); // Start software serial port in gps default speed ss.print("$PSRF100,1,19200,8,1,0*38\r\n"); // Change GPS's speed. Better for software serial delay(10); ss.begin(19200); // Change serial port to new speed ss.print("$PSRF103,1,0,0,1*25\r\n"); // Off: GLL-Geographic Position - Latitude/Longitude ss.print("$PSRF103,3,0,0,1*27\r\n"); // Off: GSV-GNSS Satellites in View ss.print("$PSRF103,2,0,0,1*26\r\n"); // Off: GSA-GNSS DOP and Active Satellites ss.print("$PSRF103,0,0,0,1*24\r\n"); // Off: GGA-Global Positioning System Fixed Data // ss.print("$PSRF103,0,0,1,1*25\r\n"); // On: GGA Serial.println(F("Spedo starting.. ")); SEG_LINES[0]=SEG_G; SEG_LINES[1]=0x00; SEG_LINES[2]=0x00; SEG_LINES[3]=SEG_G; display.setSegments(SEG_LINES); // Display something to show we powerd up. } void loop() { delay(150); // Wait for things to settle // 'feed the hungry object' - data from software serial to gps libs while (ss.available() > 0) { gps.encode(ss.read()); } // Update display every second to keep out of 'feed object's way. if (millis() - last > 1000) { if(gps.passedChecksum() > 5 ) { // Only start once we have some valid data. update_display(); } displayInfo(); // Debug data. last = millis(); } } // If data is valid, display speed, if not display dashes to show problems. void update_display() { if (gps.time.age() > 10000 ) { // No GPS updates in 10 seconds SEG_LINES[0]=SEG_G; SEG_LINES[1]=0x00; SEG_LINES[2]=0x00; SEG_LINES[3]=0x00; display.setSegments(SEG_LINES); // 1 dash } else if (gps.location.isValid()==0) { // No location SEG_LINES[0]=SEG_G; SEG_LINES[1]=SEG_G; SEG_LINES[2]=0x00; SEG_LINES[3]=0x00; display.setSegments(SEG_LINES); // 2 dashes } else if(gps.satellites.value() < 2 ) { // Not enough sats (Maybe should be 3?) SEG_LINES[0]=SEG_G; SEG_LINES[1]=SEG_G; SEG_LINES[2]=SEG_G; SEG_LINES[3]=0x00; display.setSegments(SEG_LINES); // 3 dashes } else if(gps.speed.age() > 5000) { // Speed too old ( 5 seconds) SEG_LINES[0]=SEG_G; SEG_LINES[1]=SEG_G; SEG_LINES[2]=SEG_G; SEG_LINES[3]=SEG_G; display.setSegments(SEG_LINES); // four dashes } else { // All seems good! Update display with a number. display.showNumberDec(gps.speed.kmph(), false, 4, 0); // if (gps.speed.isUpdated()) } } // end update_display // Debug data, mostly from 'kitchen sink' example refromatted to take less space. void displayInfo() { Serial.print(F("TIME")); if (gps.date.isValid()) { Serial.print(F(" Age=")); Serial.print(gps.time.age()); Serial.print(F("ms ")); Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); // Serial.print(F("ms Raw=")); // Serial.print(gps.time.value()); Serial.print(F(" ")); Serial.print(gps.time.hour()); Serial.print(F(":")); Serial.print(gps.time.minute()); Serial.print(F(":")); Serial.print(gps.time.second()); } else { Serial.print(F(" INVALID")); } //if (gps.speed.isUpdated()) // { Serial.print(F(" SPEED Age=")); Serial.print(gps.speed.age()); Serial.print(F("ms Raw=")); Serial.print(gps.speed.value()); Serial.print(F(" km/h=")); Serial.print(gps.speed.kmph()); // } Serial.print(F(" SATS Age=")); Serial.print(gps.satellites.age()); Serial.print(F("ms Value=")); Serial.print(gps.satellites.value()); Serial.print(F(" DIAGS Chars=")); Serial.print(gps.charsProcessed()); Serial.print(F(" Sent-Fix=")); Serial.print(gps.sentencesWithFix()); Serial.print(F(" Fail=")); Serial.print(gps.failedChecksum()); Serial.print(F(" Pass=")); Serial.print(gps.passedChecksum()); // Testing overflow in SoftwareSerial is sometimes useful too. Serial.print(" SSoverflow? "); Serial.print(ss.overflow() ? "YES!" : "No"); Serial.println(); }