I am working on a heart rate sensor that can currently capture the user's heart rate, display it on the ESP32 OLED and IoT ThingSpeak. Next I am trying to find how to calculate the Amplitude and Phase Shift of the users heart waveform and upload those calculations to ThingSpeak.
[code]
#include <WiFi.h>
#include <Wire.h>
#include "heltec.h"
#include "arduinoFFT.h"
#include "ThingSpeak.h"
#include <PulseSensorPlayground.h>
#include <math.h>
// connect the signal to the pin 13 of heltec LoRa ESP32
arduinoFFT fft = arduinoFFT();
WiFiClient client_1;
// ************* Variables and WiFi SSID/PWD setup
const char* SSID_1 = "Enter Wifi SSID";
const char* PWD_1 = "PWD";
unsigned long myChannelNumber = Have channel number;
const char * myWriteAPIKey = "I have write key";
const char * myReadAPIKey = "I have read key"; //if channel is private then add this in readintfeild(channel, field, Readapikey)
int status = WL_IDLE_STATUS;
const int FFT_size = 256;
const int Sampling_freq = 20;
const int Heart_Read = 13;
//float Signal;
double vReal[FFT_size];
double vImag[FFT_size];
double vPhase[FFT_size];
double x = 0;
// *******************************************************************
void setupOLED()
{
pinMode(16, OUTPUT);
digitalWrite(16, LOW); // turn D16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set D16 in high
Heltec.display->init();
Heltec.display->flipScreenVertically();
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
}
//********************************************************************
void setupWIFI()
{
WiFi.disconnect(true);
delay(1000);
WiFi.mode(WIFI_STA);
WiFi.setAutoConnect(true);
WiFi.setAutoReconnect(true);
WiFi.begin(SSID_1, PWD_1);
ThingSpeak.begin(client_1);
Heltec.display->clear();
if(WiFi.status() == WL_CONNECTED)
Heltec.display->drawString(0, 0, "WiFi Connected");
else
Heltec.display->drawString(0, 0, "WiFi Connection Failed");
Heltec.display->display();
}
//*****************************************************
void setup()
{
Serial.begin(115200);
ThingSpeak.begin(client_1);
Heltec.begin(true, false, true);
pinMode(25, OUTPUT);
digitalWrite(25,HIGH);
pinMode(Heart_Read, INPUT);
Heltec.display->init();
Heltec.display->flipScreenVertically();
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
}
// ******************************************************
void loop()
{
delay(500);
for (int k = 0; k < FFT_size; k++)
{
vReal[k] = (double)analogRead(Heart_Read);
Serial.println(vReal[k]);
vImag[k] = 0;
delay(50); //Delay = 1000/Sampling_freq
}
fft.Windowing(vReal, FFT_size, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
fft.Compute(vReal, vImag, FFT_size, FFT_FORWARD);
fft.ComplexToMagnitude(vReal, vImag, FFT_size);
x = fft.MajorPeak(vReal, FFT_size, Sampling_freq);
int Heart_rate = (int) (x * 60);
Serial.println("Heart Rate Calculated: " + String(Heart_rate));
setupWIFI();
delay(1000);
int retrieveHR = ThingSpeak.readIntField(myChannelNumber, 1, myReadAPIKey);
// Check the status of the read operation to see if it was successful
int statusCode = ThingSpeak.getLastReadStatus();
if(statusCode == 200){
Serial.println("Retrieved Heart Rate from Thingspeak " + String(retrieveHR));
}
else{
Serial.println("Problem reading channel. HTTP error code " + String(statusCode));
}
ThingSpeak.setField(1, Heart_rate);
ThingSpeak.writeFields(Heart_rate, myWriteAPIKey);
delay(500);
WiFi.disconnect();
WiFi.mode( WIFI_MODE_NULL );
delay(100);
setupOLED();
Heltec.display->clear();
Heltec.display->setFont(ArialMT_Plain_16);
if((Heart_rate < 60 || Heart_rate > 100)|| (retrieveHR < 60 || retrieveHR > 100))
//Writes to OLED
{ String BPM = String("ABNORMAL HEART RATE ");
Heltec.display->drawString(0,10,BPM);
} else {
String BPM = String("BPM: " +String(Heart_rate));
Heltec.display->drawString(0,10,BPM);
}
Heltec.display->display();
delay(10000);
Heltec.display->clear();
Heltec.display->display();
digitalWrite(16, LOW); // turn D16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set D16 in high
delay(5000);
while(1);
}
[/code]
``` Thank you in advance!