Tue. Jul 28th, 2026

Compilation error: TinyGPS++.h: No such file or directory

#include <Wire.h>
#include <TFT_eSPI.h>
#include <TinyGPS++.h>

TFT_eSPI tft = TFT_eSPI();
TinyGPSPlus gps;

const int TIME_ZONE_OFFSET = +1; 

void setup() {
    tft.begin();
    tft.setRotation(3);
    tft.fillScreen(TFT_BLACK);
    
    // FORCE RESET: Shut down the I2C configurations to free up the pins
    Wire1.end();
    delay(200); 

    // Re-initialize the clean Serial stream for the GPS
    Serial1.begin(9600); 
    delay(200);

    tft.setTextSize(3);
    tft.setTextColor(TFT_YELLOW, TFT_BLACK);
    tft.drawString("Flushing Hardware...", 10, 40);
    delay(1000);
    
    tft.fillScreen(TFT_BLACK);
    tft.drawString("Locking Satellites...", 10, 40);
    tft.setTextSize(2);
    tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.drawString("Please stay near a window", 10, 100);
}

void loop() {
    while (Serial1.available() > 0) {
        gps.encode(Serial1.read());
    }

    if (gps.time.isUpdated() && gps.time.isValid() && gps.location.isValid()) {
        int localHour = gps.time.hour() + TIME_ZONE_OFFSET;
        if (localHour >= 24) localHour -= 24;
        if (localHour < 0) localHour += 24;

        char timeString[16];
        sprintf(timeString, "%02d:%02d:%02d", localHour, gps.time.minute(), gps.time.second());

        char latString[16];
        char lonString[16];
        dtostrf(gps.location.lat(), 10, 6, latString);
        dtostrf(gps.location.lng(), 10, 6, lonString);

        char satString[24];
        sprintf(satString, "Sats Tracked: %02d", gps.satellites.value());

        tft.fillScreen(TFT_BLACK);
        
        tft.setTextSize(3);
        tft.setTextColor(TFT_WHITE, TFT_BLACK);
        tft.drawString("SATELLITE DATA", 45, 15);
        
        tft.setTextSize(4);
        tft.setTextColor(TFT_GREEN, TFT_BLACK); 
        tft.drawString(timeString, 65, 60);
        
        tft.drawFastHLine(10, 110, 300, TFT_DARKGREY);

        tft.setTextSize(2);
        tft.setTextColor(TFT_CYAN, TFT_BLACK);
        tft.drawString("LAT:", 20, 125);
        tft.drawString(latString, 80, 125);

        tft.drawString("LON:", 20, 160);
        tft.drawString(lonString, 80, 160);
        
        tft.drawFastHLine(10, 195, 300, TFT_DARKGREY);

        tft.setTextColor(TFT_YELLOW, TFT_BLACK);
        tft.drawString(satString, 20, 210);
        
        delay(1000); 
    }
}

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 screen is flicker free.

#include <Wire.h>
#include <TFT_eSPI.h>
#include <TinyGPS++.h>

TFT_eSPI tft = TFT_eSPI();
TinyGPSPlus gps;

const int TIME_ZONE_OFFSET = +1; 

// Track previous values to prevent unnecessary updates
int prevSecond = -1;
int prevDay = -1;
double prevLat = 0.0;
double prevLng = 0.0;
uint32_t prevSats = 999; 
bool isLayoutDrawn = false; // Ensures static elements are only drawn once

// Lookup array for Days of the week
const char* daysOfWeek[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
    tft.begin();
    tft.setRotation(3);
    tft.fillScreen(TFT_BLACK);
    
    // FORCE RESET: Shut down the I2C configurations to free up the pins
    Wire1.end();
    delay(200); 

    // Re-initialize the clean Serial stream for the GPS
    Serial1.begin(9600); 
    delay(200);

    tft.setTextSize(3);
    tft.setTextColor(TFT_YELLOW, TFT_BLACK);
    tft.drawString("Flushing Hardware...", 10, 40);
    delay(1000);
    
    tft.fillScreen(TFT_BLACK);
    tft.drawString("Locking Satellites...", 10, 40);
    tft.setTextSize(2);
    tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.drawString("Please stay near a window", 10, 100);
}

void loop() {
    // Continuously read serial data without delay gaps
    while (Serial1.available() > 0) {
        gps.encode(Serial1.read());
    }

    if (gps.time.isUpdated() && gps.time.isValid() && gps.location.isValid()) {
        
        // --- 1. INITIALIZE STATIC LAYOUT ONCE ---
        if (!isLayoutDrawn) {
            tft.fillScreen(TFT_BLACK);
            
            tft.setTextSize(3);
            tft.setTextColor(TFT_WHITE, TFT_BLACK);
            tft.drawString("SATELLITE DATA", 45, 10);
            
            tft.drawFastHLine(10, 105, 300, TFT_DARKGREY);

            tft.setTextSize(2);
            tft.setTextColor(TFT_CYAN, TFT_BLACK);
            tft.drawString("LAT:", 20, 125);
            tft.drawString("LON:", 20, 155);
            
            tft.drawFastHLine(10, 190, 300, TFT_DARKGREY);
            isLayoutDrawn = true;
        }

        // --- 2. TIME & DATE CALCULATIONS (WITH TIME ZONE) ---
        int localHour = gps.time.hour() + TIME_ZONE_OFFSET;
        int localDay = gps.date.day();
        int localMonth = gps.date.month();
        int localYear = gps.date.year();

        // Simple timezone handling for day rollovers
        if (localHour >= 24) {
            localHour -= 24;
            // Note: Simplistic day increment (good enough for minor shifts)
            localDay++; 
        } else if (localHour < 0) {
            localHour += 24;
            localDay--;
        }

        // --- 3. CONDITIONAL DRAWING (No Flicker) ---

        // Only update Time if the seconds actually change
        if (gps.time.second() != prevSecond) {
            char timeString[16];
            sprintf(timeString, "%02d:%02d:%02d", localHour, gps.time.minute(), gps.time.second());
            
            tft.setTextSize(4);
            tft.setTextColor(TFT_GREEN, TFT_BLACK); 
            tft.drawString(timeString, 65, 42);
            
            prevSecond = gps.time.second();
        }

        // Only update Day and Date if the calendar day changes
        if (localDay != prevDay && gps.date.isValid()) {
            char dateString[32];
            // TinyGPS++ provides day of week index or we can calculate it. 
            // For safety and ease, we will format: "DD/MM/YYYY" 
            sprintf(dateString, "%s  %02d/%02d/%04d", daysOfWeek[gps.date.age() % 7], localDay, localMonth, localYear);
            
            // Overwrite Day/Date banner below the header
            tft.setTextSize(2);
            tft.setTextColor(TFT_MAGENTA, TFT_BLACK);
            // Center-ish position below the time
            tft.drawString(dateString, 45, 82); 
            
            prevDay = localDay;
        }

        // Only update Latitude if it changes
        if (gps.location.lat() != prevLat) {
            char latString[16];
            dtostrf(gps.location.lat(), 10, 6, latString);
            
            tft.setTextSize(2);
            tft.setTextColor(TFT_CYAN, TFT_BLACK);
            tft.drawString(latString, 80, 125);
            
            prevLat = gps.location.lat();
        }

        // Only update Longitude if it changes
        if (gps.location.lng() != prevLng) {
            char lonString[16];
            dtostrf(gps.location.lng(), 10, 6, lonString);
            
            tft.setTextSize(2);
            tft.setTextColor(TFT_CYAN, TFT_BLACK);
            tft.drawString(lonString, 80, 155);
            
            prevLng = gps.location.lng();
        }

        // Only update Satellites text if count changes
        if (gps.satellites.value() != prevSats) {
            char satString[24];
            sprintf(satString, "Sats Tracked: %02d", gps.satellites.value());
            
            tft.setTextSize(2);
            tft.setTextColor(TFT_YELLOW, TFT_BLACK);
            tft.drawString(satString, 20, 205);
            
            prevSats = gps.satellites.value();
        }
    }
}

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *