Skip to content

Instantly share code, notes, and snippets.

@alexvng
Last active October 3, 2021 13:21
Show Gist options
  • Save alexvng/7ed391908deb0b2e3bce08cfd5ceac65 to your computer and use it in GitHub Desktop.
Save alexvng/7ed391908deb0b2e3bce08cfd5ceac65 to your computer and use it in GitHub Desktop.
Pulsar - ESP32 code
// Author: Mason Manetta
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#include <WiFi.h>
#include <HTTPClient.h>
//Global Variables
MAX30105 particleSensor;
//Server EndPoint
String serverPostUrl = "https://esp32-proxy.glitch.me/v1/bioMetricPost";
// WiFi config
const char *SSID = "esp32test";
const char *PWD = "$5P5402j";
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
int beatAvg;
long irValue;
//Server running on port 80
//Functions for wifi
void connectToWiFi() {
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PWD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
// we can even make the ESP32 to sleep
}
Serial.print("Connected. IP: ");
Serial.println(WiFi.localIP());
}
void postDataToServer() {
Serial.println("Posting JSON data to server...");
HTTPClient http;
http.begin(serverPostUrl);
http.addHeader("Content-Type", "application/json");
String finger = "true";
if (irValue < 50000)
finger = "false";
String response = "{";
response += "\"finger\": " + finger +" ,";
response += "\"oxygen\": 0 ,"; //hold
response += "\"irValue\": " + longToString(irValue) + ",";
response += "\"cBPM\": " + String(beatsPerMinute) + ",";
response += "\"aBPM\": " + String(beatAvg);
response += "}";
int httpResponseCode = http.POST(response);
if(httpResponseCode>0){
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
}
else {
Serial.printf("Error occurred while sending HTTP POST");
}
}
String longToString(long longInteger){
char buf[50];
ltoa(longInteger, buf, 10);
return(buf);
}
void setup()
{
//initialize serial connections
Serial.begin(115200);
Serial.println("Initializing...");
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
Serial.println("MAX30105 was not found. Please check wiring/power. ");
while (1);
}
Serial.println("Place your index finger on the sensor with steady pressure.");
particleSensor.setup(); //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
//Server Initialize
connectToWiFi();
//API Endpoints
}
void loop()
{
int priorAverage = 0;
irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true)
{
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
if(beatAvg != priorAverage){
priorAverage = beatAvg;
postDataToServer();
}
}
//postDataToServer(); // post data to proxy
}
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);
if (irValue < 50000)
Serial.print(" No finger?");
Serial.println();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment