#include <Wire.h>
#include <Arduino.h>
#include <ThingSpeak.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include "time.h"
#include "PulseSimulator.h"
#include "NMEA.h"
// Pin Definitions
#define PULSE_PIN 35
// ThingSpeak Channel Credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define MY_CHANNEL 2566527
#define API_KEY "EOVRV2RJBUZBX6TU"
union {
char bytes[4];
float valor;
} velocidadeGPS;
float latitude;
float longitude;
NMEA gps(GPRMC); // Creates a GPS data connection with sentence type GPRMC
// HTTP Client
HTTPClient client_http;
// WiFi Client
WiFiClient client_wifi;
// Pulse Simulator
PulseSimulator pulseSimulator;
void setup() {
Wire.begin(23, 22);
Serial.begin(115200);
connectWifi();
ThingSpeak.begin(client_wifi); // Connecting with ThingSpeak
pulseSimulator.begin(PULSE_PIN); // Initialize Pulse Simulator
Serial2.begin(9600); // Serial1 is connected to the custom chip
Serial.println("Data received from GPS Fake:");
}
void loop() {
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim(); // Remove leading/trailing spaces
if (command.equalsIgnoreCase("gps")) {
// Read and display GPS data
readAndDisplayGPS();
} else if (command.equalsIgnoreCase("pulse")) {
// Read and display pulse sensor data
readAndDisplayPulse();
} else {
Serial.println("Invalid command. Use 'gps' or 'pulse'.");
}
}
}
void readAndDisplayGPS() {
while (Serial2.available()) {
char serialData = Serial2.read(); // Receives data from GPS serial port
if (gps.decode(serialData)) {
if (gps.gprmc_status() == '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();
Serial.println();
Serial.print(" Latitude: ");
Serial.println(latitude, 8);
Serial.print("Longitude: ");
Serial.println(longitude, 8);
Serial.print(" Speed: ");
Serial.print(velocidadeGPS.valor);
Serial.println(" Km/h");
convertCoordinatesToCartesian(latitude, longitude);
}
}
}
void readAndDisplayPulse() {
float voltage = pulseSimulator.readVoltage();
int heartRate = calculateHeartRate(voltage);
Serial.print("\nHeart Rate: ");
Serial.print(heartRate);
sendThingSpeak(heartRate);
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected: ");
Serial.println(WiFi.localIP());
}
void sendThingSpeak(int heartRate) {
if (heartRate > 0) {
ThingSpeak.setField(1, heartRate);
ThingSpeak.writeFields(MY_CHANNEL, API_KEY);
}
}
int calculateHeartRate(float voltage) {
return static_cast<int>((voltage / 3.3) * 675);
}
void convertCoordinatesToCartesian(float latitude, float longitude) {
float latRadius = latitude * PI / 180;
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);
}