-
Notifications
You must be signed in to change notification settings - Fork 0
/
Final_U8x8_HR_Websocket
128 lines (107 loc) · 3.58 KB
/
Final_U8x8_HR_Websocket
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
Optical Heart Rate Detection (PBA Algorithm) using the MAX30105 Breakout
This is a demo to show the reading of heart rate or beats per minute (BPM) using
a Penpheral Beat Amplitude (PBA) algorithm.
Heavily modified by Kurt Taylor to transmit results via websocket to client
using examples by Shawn Hymel, then ported to Heltec U8x8 ESP32.
Initial idea by: Nathan Seidle @ SparkFun Electronics
*/
#include "Arduino.h"
#include "heltec.h"
#include "MAX30105.h"
#include "heartRate.h"
#include <WiFi.h>
#include <WebSocketsServer.h>
const char* ssid = "YOUR_NETWORK_SSID";
const char* password = "YOUR_NETWORK_PASSWORD";
WebSocketsServer webSocket = WebSocketsServer(80);
MAX30105 particleSensor;
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;
String dataStr = "";
// Callback on WebSocket message
void onWebSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED: // Client has disconnected
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: // New client has connected
{
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connection from ", num);
Serial.println(ip.toString());
}
break;
case WStype_TEXT:
case WStype_BIN:
case WStype_ERROR:
case WStype_FRAGMENT_TEXT_START:
case WStype_FRAGMENT_BIN_START:
case WStype_FRAGMENT:
case WStype_FRAGMENT_FIN:
default:
break;
}
}
void setup()
{
Serial.begin(115200);
Heltec.begin(true, false, true);
Wire.begin(SDA_OLED, SCL_OLED); //Start OLED via I2C0, *** THIS MUST be done before sensor ***
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Default I2C port, 400kHz speed
{
Serial.println("MAX30105 was not found. Please check wiring/power. ");
while (1);
}
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
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
Serial.print("...");
}
Serial.println("Connected!"); // Print our IP address
Serial.print("HR Sensor IP address: ");
Serial.println(WiFi.localIP());
webSocket.begin(); // Start WebSocket server and assign callback
webSocket.onEvent(onWebSocketEvent);
}
void loop()
{
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true) {
if (irValue < 50000) {
Serial.println(" No finger?");
delay(2000);
}
else {
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 150 && beatsPerMinute > 30) {
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;
}
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.println(beatAvg);
dataStr = String(beatAvg);
webSocket.sendTXT(0, dataStr);
webSocket.loop(); // Look for and handle WebSocket data
}
}
}