From 9da30e9e79ea3cec8b9d5afb658421a3adc3d749 Mon Sep 17 00:00:00 2001 From: PinkyFlowy Date: Mon, 21 Apr 2025 18:47:30 +0200 Subject: [PATCH] Add GPS functionality: implement GPS_Init, GPS_Read, and GPS coordinate retrieval; update includes and platform dependencies --- hardware/.vscode/settings.json | 3 +- hardware/include/GPS.hpp | 5 +- hardware/include/main.hpp | 1 + hardware/lib/GPS.cpp | 131 ++++++++++++++++++++++----------- hardware/lib/MQ7.cpp | 2 +- hardware/platformio.ini | 3 +- hardware/src/main.cpp | 8 +- 7 files changed, 105 insertions(+), 48 deletions(-) diff --git a/hardware/.vscode/settings.json b/hardware/.vscode/settings.json index ba2a34e..1a0fc35 100644 --- a/hardware/.vscode/settings.json +++ b/hardware/.vscode/settings.json @@ -9,7 +9,8 @@ "utility": "cpp", "bmp280.h": "c", "random": "cpp", - "sstream": "cpp" + "sstream": "cpp", + "cmath": "cpp" }, "github.copilot.enable": { "*": false, diff --git a/hardware/include/GPS.hpp b/hardware/include/GPS.hpp index 7b5b7c4..c947489 100644 --- a/hardware/include/GPS.hpp +++ b/hardware/include/GPS.hpp @@ -1,8 +1,9 @@ #define RX 4 #define TX 5 -#include "SoftwareSerial.h" +#include "TinyGPSPlus.h" void GPS_Init(); void GPS_Read(); -String GPS_Data(); \ No newline at end of file +float GPS_longitud(); +float GPS_latitud(); \ No newline at end of file diff --git a/hardware/include/main.hpp b/hardware/include/main.hpp index 3e84416..05b64b0 100644 --- a/hardware/include/main.hpp +++ b/hardware/include/main.hpp @@ -6,6 +6,7 @@ #include "MqttClient.hpp" #include "MQ7.hpp" #include "BMP280.hpp" +#include "GPS.hpp" //#include "test.hpp" diff --git a/hardware/lib/GPS.cpp b/hardware/lib/GPS.cpp index 617da56..62be19c 100644 --- a/hardware/lib/GPS.cpp +++ b/hardware/lib/GPS.cpp @@ -1,51 +1,100 @@ #include "GPS.hpp" -char c; -SoftwareSerial gps(RX, TX); -void GPS_Init(){ - // RX, TX +// A sample NMEA stream. +const char *gpsStream = + "$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n" + "$GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n" + "$GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n" + "$GPGGA,045201.000,3014.3864,N,09748.9411,W,1,10,1.2,200.8,M,-22.5,M,,0000*6C\r\n" + "$GPRMC,045251.000,A,3014.4275,N,09749.0626,W,0.51,217.94,030913,,,A*7D\r\n" + "$GPGGA,045252.000,3014.4273,N,09749.0628,W,1,09,1.3,206.9,M,-22.5,M,,0000*6F\r\n"; - Serial.begin(115500); - gps.begin(9600); - Serial.println("GPS Initialized"); +// The TinyGPSPlus object +TinyGPSPlus gps; + +void GPS_Init() +{ + Serial.begin(115200); + + Serial.println(F("BasicExample.ino")); + Serial.println(F("Basic demonstration of TinyGPSPlus (no device needed)")); + Serial.print(F("Testing TinyGPSPlus library v. ")); Serial.println(TinyGPSPlus::libraryVersion()); + Serial.println(F("by Mikal Hart")); + Serial.println(); + + while (*gpsStream) + if (gps.encode(*gpsStream++)) + GPS_Read(); + + Serial.println(); + Serial.println(F("Done.")); } -void GPS_Read(){ - - if (gps.available()) { - c = gps.read(); - - } +void GPS_Read() +{ + Serial.print(F("Location: ")); + if (gps.location.isValid()) + { + Serial.print(gps.location.lat(), 6); + Serial.print(F(",")); + Serial.print(gps.location.lng(), 6); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.print(F(" Date/Time: ")); + if (gps.date.isValid()) + { + Serial.print(gps.date.month()); + Serial.print(F("/")); + Serial.print(gps.date.day()); + Serial.print(F("/")); + Serial.print(gps.date.year()); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.print(F(" ")); + if (gps.time.isValid()) + { + if (gps.time.hour() < 10) Serial.print(F("0")); + Serial.print(gps.time.hour()); + Serial.print(F(":")); + if (gps.time.minute() < 10) Serial.print(F("0")); + Serial.print(gps.time.minute()); + Serial.print(F(":")); + if (gps.time.second() < 10) Serial.print(F("0")); + Serial.print(gps.time.second()); + Serial.print(F(".")); + if (gps.time.centisecond() < 10) Serial.print(F("0")); + Serial.print(gps.time.centisecond()); + } + else + { + Serial.print(F("INVALID")); + } + + Serial.println(); } -//$GPRMC,044235.000,A,4322.0289,N,00824.5210,W,0.39,65.46,020615,,,A*44 -void GPS_Data(const char* data) { - char buffer[100]; - strncpy(buffer, data, sizeof(buffer)); // Copia segura de la cadena - buffer[sizeof(buffer) - 1] = '\0'; // Asegura que la cadena termine en '\0' - - char* token = strtok(buffer, ","); // Divide la cadena por comas - int index = 0; - String check; - float lon = 0.0, lat = 0.0; - - while (token != nullptr) { - if (index == 2) { - check = String(token); // Elemento en la posición 2 - } else if (index == 3) { - lon = atof(token); // Elemento en la posición 3 convertido a float - } else if (index == 5) { - lat = atof(token); // Elemento en la posición 5 convertido a float - } - token = strtok(nullptr, ","); // Avanza al siguiente token - index++; +float GPS_longitud(){ + float log; + if (gps.location.isValid()) + { + log = gps.location.lng(); } + return log; +} - // Imprime los resultados - Serial.print("Check: "); - Serial.println(check); - Serial.print("Longitude: "); - Serial.println(lon, 6); // 6 decimales para precisión - Serial.print("Latitude: "); - Serial.println(lat, 6); +float GPS_latitud(){ + float lat; + if (gps.location.isValid()) + { + lat = gps.location.lat(); + } + return lat; } \ No newline at end of file diff --git a/hardware/lib/MQ7.cpp b/hardware/lib/MQ7.cpp index f7fbbe0..6542f58 100644 --- a/hardware/lib/MQ7.cpp +++ b/hardware/lib/MQ7.cpp @@ -10,7 +10,7 @@ void MQ7_Read(float &sensorVolt, float &RSAir, float &R0, float &sensorValue) { analogWrite(ANALOG_MQ7, 1023); delay(60000); - analogWrite(ANALOG_MQ7, (1023/5)*1.4 ); + analogWrite(ANALOG_MQ7, (1023/5)*1.4); for(int i = 0; i<100; i++) { diff --git a/hardware/platformio.ini b/hardware/platformio.ini index 6ec8d50..5314c12 100644 --- a/hardware/platformio.ini +++ b/hardware/platformio.ini @@ -14,7 +14,6 @@ board = esp32dev framework = arduino lib_deps = knolleary/PubSubClient@^2.8 - mikalhart/TinyGPSPlus@^1.0.2 bblanchon/ArduinoJson@^6.17.3 martinl1/BMP280_DEV@^1.0.21 - plerup/EspSoftwareSerial@^8.2.0 + mikalhart/TinyGPSPlus@^1.1.0 diff --git a/hardware/src/main.cpp b/hardware/src/main.cpp index 08f9845..848f0ec 100644 --- a/hardware/src/main.cpp +++ b/hardware/src/main.cpp @@ -41,8 +41,14 @@ void setup() { // test get getRequest(httpClient, "http://172.20.10.7:8082/api/v1/sensors/1/values", response); deserializeSensorValue(httpClient, httpClient.GET()); + + // test gps + GPS_Init(); + } void loop() { - + GPS_Read(); + lon = GPS_longitud(); + lat = GPS_latitud(); } \ No newline at end of file