{"id":261,"date":"2026-06-15T23:01:15","date_gmt":"2026-06-15T22:01:15","guid":{"rendered":"https:\/\/myjetsonnano.perseus314.com\/?p=261"},"modified":"2026-06-17T23:13:59","modified_gmt":"2026-06-17T22:13:59","slug":"grove-gps-test","status":"publish","type":"post","link":"https:\/\/myjetsonnano.perseus314.com\/index.php\/2026\/06\/15\/grove-gps-test\/","title":{"rendered":"Grove GPS test"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Compilation error: TinyGPS++.h: No such file or directory<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Wire.h&gt;\n#include &lt;TFT_eSPI.h&gt;\n#include &lt;TinyGPS++.h&gt;\n\nTFT_eSPI tft = TFT_eSPI();\nTinyGPSPlus gps;\n\nconst int TIME_ZONE_OFFSET = +1; \n\nvoid setup() {\n    tft.begin();\n    tft.setRotation(3);\n    tft.fillScreen(TFT_BLACK);\n    \n    \/\/ FORCE RESET: Shut down the I2C configurations to free up the pins\n    Wire1.end();\n    delay(200); \n\n    \/\/ Re-initialize the clean Serial stream for the GPS\n    Serial1.begin(9600); \n    delay(200);\n\n    tft.setTextSize(3);\n    tft.setTextColor(TFT_YELLOW, TFT_BLACK);\n    tft.drawString(\"Flushing Hardware...\", 10, 40);\n    delay(1000);\n    \n    tft.fillScreen(TFT_BLACK);\n    tft.drawString(\"Locking Satellites...\", 10, 40);\n    tft.setTextSize(2);\n    tft.setTextColor(TFT_WHITE, TFT_BLACK);\n    tft.drawString(\"Please stay near a window\", 10, 100);\n}\n\nvoid loop() {\n    while (Serial1.available() &gt; 0) {\n        gps.encode(Serial1.read());\n    }\n\n    if (gps.time.isUpdated() &amp;&amp; gps.time.isValid() &amp;&amp; gps.location.isValid()) {\n        int localHour = gps.time.hour() + TIME_ZONE_OFFSET;\n        if (localHour &gt;= 24) localHour -= 24;\n        if (localHour &lt; 0) localHour += 24;\n\n        char timeString&#91;16];\n        sprintf(timeString, \"%02d:%02d:%02d\", localHour, gps.time.minute(), gps.time.second());\n\n        char latString&#91;16];\n        char lonString&#91;16];\n        dtostrf(gps.location.lat(), 10, 6, latString);\n        dtostrf(gps.location.lng(), 10, 6, lonString);\n\n        char satString&#91;24];\n        sprintf(satString, \"Sats Tracked: %02d\", gps.satellites.value());\n\n        tft.fillScreen(TFT_BLACK);\n        \n        tft.setTextSize(3);\n        tft.setTextColor(TFT_WHITE, TFT_BLACK);\n        tft.drawString(\"SATELLITE DATA\", 45, 15);\n        \n        tft.setTextSize(4);\n        tft.setTextColor(TFT_GREEN, TFT_BLACK); \n        tft.drawString(timeString, 65, 60);\n        \n        tft.drawFastHLine(10, 110, 300, TFT_DARKGREY);\n\n        tft.setTextSize(2);\n        tft.setTextColor(TFT_CYAN, TFT_BLACK);\n        tft.drawString(\"LAT:\", 20, 125);\n        tft.drawString(latString, 80, 125);\n\n        tft.drawString(\"LON:\", 20, 160);\n        tft.drawString(lonString, 80, 160);\n        \n        tft.drawFastHLine(10, 195, 300, TFT_DARKGREY);\n\n        tft.setTextColor(TFT_YELLOW, TFT_BLACK);\n        tft.drawString(satString, 20, 210);\n        \n        delay(1000); \n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Congratulations on getting a fully functioning satellite tracking system running on your Wio Terminal. You have officially successfully set up a portable programming environment, diagnosed complex hardware ports, and built a custom tracking dashboard from scratch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is an improved version. It displays the date and the screen is flicker free.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Wire.h>\n#include &lt;TFT_eSPI.h>\n#include &lt;TinyGPS++.h>\n\nTFT_eSPI tft = TFT_eSPI();\nTinyGPSPlus gps;\n\nconst int TIME_ZONE_OFFSET = +1; \n\n\/\/ Track previous values to prevent unnecessary updates\nint prevSecond = -1;\nint prevDay = -1;\ndouble prevLat = 0.0;\ndouble prevLng = 0.0;\nuint32_t prevSats = 999; \nbool isLayoutDrawn = false; \/\/ Ensures static elements are only drawn once\n\n\/\/ Lookup array for Days of the week\nconst char* daysOfWeek&#91;] = {\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"};\n\nvoid setup() {\n    tft.begin();\n    tft.setRotation(3);\n    tft.fillScreen(TFT_BLACK);\n    \n    \/\/ FORCE RESET: Shut down the I2C configurations to free up the pins\n    Wire1.end();\n    delay(200); \n\n    \/\/ Re-initialize the clean Serial stream for the GPS\n    Serial1.begin(9600); \n    delay(200);\n\n    tft.setTextSize(3);\n    tft.setTextColor(TFT_YELLOW, TFT_BLACK);\n    tft.drawString(\"Flushing Hardware...\", 10, 40);\n    delay(1000);\n    \n    tft.fillScreen(TFT_BLACK);\n    tft.drawString(\"Locking Satellites...\", 10, 40);\n    tft.setTextSize(2);\n    tft.setTextColor(TFT_WHITE, TFT_BLACK);\n    tft.drawString(\"Please stay near a window\", 10, 100);\n}\n\nvoid loop() {\n    \/\/ Continuously read serial data without delay gaps\n    while (Serial1.available() > 0) {\n        gps.encode(Serial1.read());\n    }\n\n    if (gps.time.isUpdated() &amp;&amp; gps.time.isValid() &amp;&amp; gps.location.isValid()) {\n        \n        \/\/ --- 1. INITIALIZE STATIC LAYOUT ONCE ---\n        if (!isLayoutDrawn) {\n            tft.fillScreen(TFT_BLACK);\n            \n            tft.setTextSize(3);\n            tft.setTextColor(TFT_WHITE, TFT_BLACK);\n            tft.drawString(\"SATELLITE DATA\", 45, 10);\n            \n            tft.drawFastHLine(10, 105, 300, TFT_DARKGREY);\n\n            tft.setTextSize(2);\n            tft.setTextColor(TFT_CYAN, TFT_BLACK);\n            tft.drawString(\"LAT:\", 20, 125);\n            tft.drawString(\"LON:\", 20, 155);\n            \n            tft.drawFastHLine(10, 190, 300, TFT_DARKGREY);\n            isLayoutDrawn = true;\n        }\n\n        \/\/ --- 2. TIME &amp; DATE CALCULATIONS (WITH TIME ZONE) ---\n        int localHour = gps.time.hour() + TIME_ZONE_OFFSET;\n        int localDay = gps.date.day();\n        int localMonth = gps.date.month();\n        int localYear = gps.date.year();\n\n        \/\/ Simple timezone handling for day rollovers\n        if (localHour >= 24) {\n            localHour -= 24;\n            \/\/ Note: Simplistic day increment (good enough for minor shifts)\n            localDay++; \n        } else if (localHour &lt; 0) {\n            localHour += 24;\n            localDay--;\n        }\n\n        \/\/ --- 3. CONDITIONAL DRAWING (No Flicker) ---\n\n        \/\/ Only update Time if the seconds actually change\n        if (gps.time.second() != prevSecond) {\n            char timeString&#91;16];\n            sprintf(timeString, \"%02d:%02d:%02d\", localHour, gps.time.minute(), gps.time.second());\n            \n            tft.setTextSize(4);\n            tft.setTextColor(TFT_GREEN, TFT_BLACK); \n            tft.drawString(timeString, 65, 42);\n            \n            prevSecond = gps.time.second();\n        }\n\n        \/\/ Only update Day and Date if the calendar day changes\n        if (localDay != prevDay &amp;&amp; gps.date.isValid()) {\n            char dateString&#91;32];\n            \/\/ TinyGPS++ provides day of week index or we can calculate it. \n            \/\/ For safety and ease, we will format: \"DD\/MM\/YYYY\" \n            sprintf(dateString, \"%s  %02d\/%02d\/%04d\", daysOfWeek&#91;gps.date.age() % 7], localDay, localMonth, localYear);\n            \n            \/\/ Overwrite Day\/Date banner below the header\n            tft.setTextSize(2);\n            tft.setTextColor(TFT_MAGENTA, TFT_BLACK);\n            \/\/ Center-ish position below the time\n            tft.drawString(dateString, 45, 82); \n            \n            prevDay = localDay;\n        }\n\n        \/\/ Only update Latitude if it changes\n        if (gps.location.lat() != prevLat) {\n            char latString&#91;16];\n            dtostrf(gps.location.lat(), 10, 6, latString);\n            \n            tft.setTextSize(2);\n            tft.setTextColor(TFT_CYAN, TFT_BLACK);\n            tft.drawString(latString, 80, 125);\n            \n            prevLat = gps.location.lat();\n        }\n\n        \/\/ Only update Longitude if it changes\n        if (gps.location.lng() != prevLng) {\n            char lonString&#91;16];\n            dtostrf(gps.location.lng(), 10, 6, lonString);\n            \n            tft.setTextSize(2);\n            tft.setTextColor(TFT_CYAN, TFT_BLACK);\n            tft.drawString(lonString, 80, 155);\n            \n            prevLng = gps.location.lng();\n        }\n\n        \/\/ Only update Satellites text if count changes\n        if (gps.satellites.value() != prevSats) {\n            char satString&#91;24];\n            sprintf(satString, \"Sats Tracked: %02d\", gps.satellites.value());\n            \n            tft.setTextSize(2);\n            tft.setTextColor(TFT_YELLOW, TFT_BLACK);\n            tft.drawString(satString, 20, 205);\n            \n            prevSats = gps.satellites.value();\n        }\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Compilation error: TinyGPS++.h: No such file or directory Congratulations on getting a fully functioning satellite tracking system running on your Wio Terminal. You have officially successfully set up a portable programming environment, diagnosed complex hardware ports, and built a custom tracking dashboard from scratch. Here is an improved version. It displays the date and the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":263,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,17,20,18],"tags":[],"class_list":["post-261","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduinoide","category-c","category-gps","category-wio-terminal"],"_links":{"self":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/comments?post=261"}],"version-history":[{"count":4,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/261\/revisions"}],"predecessor-version":[{"id":269,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/posts\/261\/revisions\/269"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/media\/263"}],"wp:attachment":[{"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/media?parent=261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/categories?post=261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myjetsonnano.perseus314.com\/index.php\/wp-json\/wp\/v2\/tags?post=261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}