TinyGPSPlus gps;
//HardwareSerial GPS(1); // Use UART1 for LC29H
SoftwareSerial mySerial(16, 17); // RX, TX pins (adjust as needed)
const int WAKEUP_PIN = 2; // Replace with the actual pin number
void setBaseStation() {
const int numSamples = 50; // Number of readings to average
double totalLat = 0, totalLng = 0, totalAlt = 0;
int validSamples = 0;
bool hasPreviousData = false;
// File name for storing RTK base station coordinates
const char* filePath = "/rtk_base_coords.txt";
// Initialize LittleFS
if (!LittleFS.begin()) {
Serial.println("Failed to mount LittleFS!");
return;
}
// Check if the file with previous RTK coordinates exists
if (LittleFS.exists(filePath)) {
File file = LittleFS.open(filePath, "r");
if (file) {
// Read previously saved coordinates
String latStr = file.readStringUntil(',');
String lngStr = file.readStringUntil(',');
String altStr = file.readStringUntil('\n');
rtkLat = latStr.toDouble();
rtkLng = lngStr.toDouble();
rtkAlt = altStr.toDouble();
hasPreviousData = true;
Serial.println("Loaded previous RTK base station coordinates:");
Serial.print("Latitude: ");
Serial.println(rtkLat, 8);
Serial.print("Longitude: ");
Serial.println(rtkLng, 8);
Serial.print("Altitude: ");
Serial.println(rtkAlt, 2);
file.close();
} else {
Serial.println("Failed to open RTK coordinates file for reading.");
}
} else {
Serial.println("No previous RTK base station coordinates found.");
}
Serial.println("Averaging GPS readings for base station...");
while (mySerial.available() > 0) {
Serial.println(“gps is encoding…”);
gps.encode(mySerial.read());
}
// Collect GPS samples to calculate the average
for (int i = 0; i < numSamples; i++) {
if (gps.location.isValid()) {
totalLat += gps.location.lat();
totalLng += gps.location.lng();
totalAlt += gps.altitude.meters();
validSamples++;
// Check RTK status in GGA
// if (gps.gga.fix_quality == 4) {
// Serial.println("RTK Fixed position.");
// } else if (gps.gga.fix_quality == 5) {
// Serial.println("RTK Float position.");
// } else {
// Serial.println("No RTK Fix. GNSS Quality: " + String(gps.gga.fix_quality));
// }
} //else {
// Serial.println("Invalid GPS reading, skipping...");
// Print additional information for debugging invalid readings
// Serial.print("Invalid GPS reading (");
// Serial.print(i + 1);
// Serial.print("/<bos>");
// Serial.print(numSamples);
// Serial.println("):");
// Check for specific error codes from TinyGPSPlus (if available)
// if (gps.gpsError) {
// Serial.print(" Error code: ");
// Serial.println(gps.gpsError);
// }
// }
// delay(1000); // Wait 1 second between samples
}
if (validSamples > 0) {
// Calculate average position
double avgLat = totalLat / validSamples;
double avgLng = totalLng / validSamples;
double avgAlt = totalAlt / validSamples;
if (hasPreviousData) {
// Average with previously saved data
rtkLat = (avgLat + rtkLat) / 2;
rtkLng = (avgLng + rtkLng) / 2;
rtkAlt = (avgAlt + rtkAlt) / 2;
} else {
// Use the newly calculated averages directly
rtkLat = avgLat;
rtkLng = avgLng;
rtkAlt = avgAlt;
}
Serial.println("Averaged Base Station Position:");
Serial.print("Latitude: ");
Serial.println(rtkLat, 8);
Serial.print("Longitude: ");
Serial.println(rtkLng, 8);
Serial.print("Altitude: ");
Serial.println(rtkAlt, 2);
// Save the new RTK base station coordinates to LittleFS
File file = LittleFS.open(filePath, "w");
if (file) {
file.print(String(rtkLat, 8) + ",");
file.print(String(rtkLng, 8) + ",");
file.println(String(rtkAlt, 2));
file.close();
Serial.println("RTK base station coordinates saved to LittleFS.");
} else {
Serial.println("Failed to open RTK coordinates file for writing.");
}
// Set the base station with the averaged coordinates
mySerial.print("$PQTGM,SETBASE,");
mySerial.print(rtkLat, 8);
mySerial.print(",");
mySerial.print(rtkLng, 8);
mySerial.print(",");
mySerial.print(rtkAlt, 2);
mySerial.println(",0.01"); // 1 cm assumed accuracy
GPSBaseStation();
} else {
Serial.println("Unable to calculate averaged position due to invalid readings.");
}
// End LittleFS
LittleFS.end();
}
Averaging GPS readings for base station…
Unable to calculate averaged position due to invalid readings.
Loaded previous RTK base station coordinates:
Latitude: 0.00000000
Longitude: 0.00000000
Altitude: 0.00
Averaging GPS readings for base station…
Unable to calculate averaged position due to invalid readings.
Loaded previous RTK base station coordinates:
Latitude: 0.00000000
Longitude: 0.00000000
Altitude: 0.00
Averaging GPS readings for base station…
Unable to calculate averaged position due to invalid readings.
Loaded previous RTK base station coordinates:
Latitude: 0.00000000
Longitude: 0.00000000
Altitude: 0.00
Averaging GPS readings for base station…
Unable to calculate averaged position due to invalid readings.
Loaded previous RTK base station coordinates:
Latitude: 0.00000000