#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "NMEA.h"
#define LEN(arr) ((int)(sizeof(arr) / sizeof(arr)[0]))
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
union {
char bytes[4];
float valor;
} velocidadeGPS;
float latitude;
float longitude;
NMEA gps(GPRMC);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int pulsePin = A0; // Connect the potentiometer's middle pin to A0
void setup() {
Serial.begin(11520);
Serial1.begin(9600); // Serial1 is connected to the custom chip
Serial.println("Data received from GPS Fake:");
pinMode(pulsePin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Initialize the OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
}
void loop() {
int pulseValue = analogRead(pulsePin);
int heartRate = map(pulseValue, 0, 1023, 40, 200); // Map the potentiometer values to a range of possible heart rates
display.clearDisplay();
display.setCursor(0, 0);
display.print("Heart Rate: ");
display.print(heartRate);
display.println(" BPM");
display.display();
delay(200);
while (Serial1.available()) { // Waits for serial port data
char serialData = Serial1.read(); // Receives data from GPS serial port
Serial.print(serialData);
if (gps.decode(serialData)) { // Checks if the GPS sentence is valid
if (gps.gprmc_status() == 'A') { // Checks if GPS status is 'A'
velocidadeGPS.valor = gps.gprmc_speed(KMPH); // Receives GPS speed in km/h
} else {
velocidadeGPS.valor = 0;
}
latitude = gps.gprmc_latitude();
longitude = gps.gprmc_longitude();
// Add line break
Serial.println();
Serial.println();
// Show Latitude
Serial.print(" Latitude: ");
Serial.println(latitude, 8);
// Show Longitude
Serial.print("Longitude: ");
Serial.println(longitude, 8);
// Show Speed in km/h
Serial.print(" Speed: ");
Serial.print(velocidadeGPS.valor);
Serial.println(" Km/h");
// Converts Geographic Coordinates to Cartesian Plane
convertCoordinatesToCartesian(latitude, longitude);
}
}
}
void convertCoordinatesToCartesian(float latitude, float longitude) {
float latRadius = latitude * (PI) / 180; // Convert from Degrees to Radians
float lonRadius = longitude * (PI) / 180;
int earthRadius = 6371; // Radius in km
float posX = earthRadius * cos(latRadius) * cos(lonRadius);
float posY = earthRadius * cos(latRadius) * sin(lonRadius);
Serial.print(" X: "); Serial.println(posX);
Serial.print(" Y: "); Serial.println(posY);
}