added sdcard write of trkpt

This commit is contained in:
damage 2024-02-14 20:31:57 +01:00
parent a632d060a8
commit 60c217a446

View File

@ -1,13 +1,71 @@
#include <TinyGPS++.h> #include <TinyGPS++.h>
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <SD.h>
#define BUFFER_SIZE 256 #define BUFFER_SIZE 256
#define SERIAL_TX_PIN 4 #define SERIAL_TX_PIN 4
#define SERIAL_RX_PIN 5 #define SERIAL_RX_PIN 5
TinyGPSPlus gps; #define SD_CS_PIN 15
#define MAX_LOOP_RUN 120
#define LOOP_DELAY_RUN_MS 200
#define LED_PIN 2
#define LED_ERROR_DEALY_MS 100
#define LED_PROGRESS_DELAY_MS 200
#define MAX_SLEEP_TIME_MS 60 * 1000
SoftwareSerial serialGPS(SERIAL_RX_PIN, SERIAL_TX_PIN); SoftwareSerial serialGPS(SERIAL_RX_PIN, SERIAL_TX_PIN);
void blinkLED(int count, int delayMS) {
for (int i = 0; i < count; i++) {
digitalWrite(LED_PIN, LOW);
delay(delayMS);
digitalWrite(LED_PIN, HIGH);
delay(delayMS);
}
}
void errorLED(int count) {
blinkLED(count, LED_ERROR_DEALY_MS);
}
void progressLED(int count) {
blinkLED(count, LED_PROGRESS_DELAY_MS);
}
void okLED() {
blinkLED(1, 1000);
}
void writeTrackPoint(File gpxFile, TinyGPSPlus gps) {
float latitude = gps.location.lat();
String latitudeStr = String(latitude , 6);
float longitude = gps.location.lng();
String longitudeStr = String(longitude , 6);
gpxFile.print("<trkpt lat=\"");
gpxFile.print(latitudeStr);
gpxFile.print("\" lon=\"");
gpxFile.print(longitudeStr);
gpxFile.print("\"><time>");
gpxFile.print(gps.date.year());
gpxFile.print("-");
gpxFile.print(gps.date.month());
gpxFile.print("-");
gpxFile.print(gps.date.day());
gpxFile.print("T");
gpxFile.print(gps.time.hour());
gpxFile.print(":");
gpxFile.print(gps.time.minute());
gpxFile.print(":");
gpxFile.print(gps.time.second());
gpxFile.println("Z</time></trkpt>");
}
void setup() { void setup() {
Serial.begin(9600); Serial.begin(9600);
while (!Serial) { while (!Serial) {
@ -15,52 +73,60 @@ void setup() {
} }
serialGPS.begin(9600); serialGPS.begin(9600);
//serialGPS.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD startup failed");
errorLED(10);
while(1);
}
Serial.println("Setup finished");
} }
void loop() { void loop() {
//Serial.println("Running loop..."); Serial.println("Running loop");
while (serialGPS.available() > 0) { File gpxFile = SD.open("gpx.txt", FILE_WRITE);
//Serial.println("GPS data available"); if (!gpxFile) {
if (gps.encode(serialGPS.read())) { errorLED(15);
//Serial.println("GPS data read"); Serial.println("Unable to open file for writing");
if (gps.location.isValid()) { return;
//Serial.println("GPS location valid"); }
float latitude = gps.location.lat();
String latitudeStr = String(latitude , 6); TinyGPSPlus gps;
float longitude = gps.location.lng(); int run = 0;
String longitudeStr = String(longitude , 6); bool success = false;
while (!success && run < MAX_LOOP_RUN) {
while (serialGPS.available() > 0) {
if (gps.encode(serialGPS.read())) {
if (gps.location.isValid()
&& gps.date.isValid()
&& gps.time.isValid()) {
Serial.print("Lat: "); success = true;
Serial.print(latitudeStr);
Serial.print(" Lon: ");
Serial.println(longitudeStr);
}
if (gps.date.isValid()) { writeTrackPoint(gpxFile, gps);
Serial.print("Date: ");
Serial.print(gps.date.year()); Serial.println("location, date and time are valid");
Serial.print("/"); } else {
Serial.print(gps.date.month()); run++;
Serial.print("/"); errorLED(2);
Serial.println(gps.date.day()); delay(LOOP_DELAY_RUN_MS);
} }
if (gps.time.isValid()) {
Serial.print("Time: ");
Serial.print(gps.time.hour());
Serial.print(":");
Serial.print(gps.time.minute());
Serial.print(":");
Serial.println(gps.time.second());
}
if (gps.location.isValid()
&& gps.date.isValid()
&& gps.time.isValid()) {
Serial.println("location, date and time are valid");
} }
} }
} }
delay(500);
gpxFile.close();
if (success) {
okLED();
} else {
errorLED(5);
}
Serial.println("Sleeping...");
ESP.deepSleep(MAX_SLEEP_TIME_MS * 1000);
} }