Last active
October 3, 2021 13:21
-
-
Save alexvng/7ed391908deb0b2e3bce08cfd5ceac65 to your computer and use it in GitHub Desktop.
Pulsar - ESP32 code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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