diff --git a/GPXTracker.ino b/GPXTracker.ino index 2cc71f3..8d5d231 100644 --- a/GPXTracker.ino +++ b/GPXTracker.ino @@ -1,13 +1,71 @@ #include #include +#include #define BUFFER_SIZE 256 #define SERIAL_TX_PIN 4 #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); +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(""); +} + void setup() { Serial.begin(9600); while (!Serial) { @@ -15,52 +73,60 @@ void setup() { } 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() { - //Serial.println("Running loop..."); - while (serialGPS.available() > 0) { - //Serial.println("GPS data available"); - if (gps.encode(serialGPS.read())) { - //Serial.println("GPS data read"); - if (gps.location.isValid()) { - //Serial.println("GPS location valid"); - float latitude = gps.location.lat(); - String latitudeStr = String(latitude , 6); - float longitude = gps.location.lng(); - String longitudeStr = String(longitude , 6); + Serial.println("Running loop"); + File gpxFile = SD.open("gpx.txt", FILE_WRITE); + if (!gpxFile) { + errorLED(15); + Serial.println("Unable to open file for writing"); + return; + } + + TinyGPSPlus gps; + int run = 0; + 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: "); - Serial.print(latitudeStr); - Serial.print(" Lon: "); - Serial.println(longitudeStr); - } + success = true; - if (gps.date.isValid()) { - Serial.print("Date: "); - Serial.print(gps.date.year()); - Serial.print("/"); - Serial.print(gps.date.month()); - Serial.print("/"); - Serial.println(gps.date.day()); - } - - 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"); + writeTrackPoint(gpxFile, gps); + + Serial.println("location, date and time are valid"); + } else { + run++; + errorLED(2); + delay(LOOP_DELAY_RUN_MS); + } } } } - delay(500); + + gpxFile.close(); + + if (success) { + okLED(); + } else { + errorLED(5); + } + + Serial.println("Sleeping..."); + ESP.deepSleep(MAX_SLEEP_TIME_MS * 1000); }