1
2#include <Wire.h>
3#include "MAX30105.h"
4#include "spo2_algorithm.h"
5
6
7#include <SSD1306Ascii.h>
8#include <SSD1306AsciiWire.h>
9
10MAX30105 particleSensor;
11SSD1306AsciiWire oled;
12
13#define MAX_BRIGHTNESS 255
14
15uint16_t irBuffer[100];
16uint16_t redBuffer[100];
17
18int32_t bufferLength;
19int32_t spo2;
20int8_t validSPO2;
21int32_t heartRate;
22int8_t validHeartRate;
23
24byte pulseLED = 11;
25byte readLED = 13;
26
27int prevPulse = 0;
28int prevO2 = 0;
29
30void setup()
31{
32 Serial.begin(115200);
33 Wire.begin();
34
35
36 oled.begin(&Adafruit128x32, 0x3C);
37 oled.setFont(Verdana12);
38 oled.clear();
39 oled.setCursor(0, 0);
40
41 pinMode(pulseLED, OUTPUT);
42 pinMode(readLED, OUTPUT);
43
44
45 if (!particleSensor.begin(Wire, I2C_SPEED_FAST))
46 {
47 Serial.println(F("MAX30105 was not found. Please check wiring/power."));
48 while (1);
49 }
50
51 Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));
52 oled.println("Place finger on");
53 oled.println("sensor");
54 while (Serial.available() == 0) ;
55 Serial.read();
56
57 byte ledBrightness = 60;
58 byte sampleAverage = 4;
59 byte ledMode = 2;
60 byte sampleRate = 100;
61 int pulseWidth = 411;
62 int adcRange = 4096;
63
64 particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
65}
66
67void loop()
68{
69 bufferLength = 100;
70
71
72 for (byte i = 0 ; i < bufferLength ; i++)
73 {
74 while (particleSensor.available() == false)
75 particleSensor.check();
76
77 redBuffer[i] = particleSensor.getRed();
78 irBuffer[i] = particleSensor.getIR();
79 particleSensor.nextSample();
80
81 Serial.print(F("red="));
82 Serial.print(redBuffer[i], DEC);
83 Serial.print(F(", ir="));
84 Serial.println(irBuffer[i], DEC);
85 }
86
87
88 maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
89
90
91 while (1)
92 {
93
94 for (byte i = 25; i < 100; i++)
95 {
96 redBuffer[i - 25] = redBuffer[i];
97 irBuffer[i - 25] = irBuffer[i];
98 }
99
100
101 for (byte i = 75; i < 100; i++)
102 {
103 while (particleSensor.available() == false)
104 particleSensor.check();
105
106 digitalWrite(readLED, !digitalRead(readLED));
107
108 redBuffer[i] = particleSensor.getRed();
109 irBuffer[i] = particleSensor.getIR();
110 particleSensor.nextSample();
111
112
113
114 Serial.print(F("red="));
115 Serial.print(redBuffer[i], DEC);
116 Serial.print(F(", ir="));
117 Serial.print(irBuffer[i], DEC);
118
119 Serial.print(F(", HRvalid="));
120 Serial.print(validHeartRate, DEC);
121
122 Serial.print(F(", SPO2Valid="));
123 Serial.println(validSPO2, DEC);
124
125 int HR = validSPO2;
126 Serial.println(HR);
127
128 if (validSPO2 == 1 && (prevPulse != heartRate || prevO2 != spo2)) {
129 oled.clear();
130
131 oled.setCursor(0, 0);
132 oled.print("HR: ");
133 oled.println(heartRate, DEC);
134
135
136 oled.print("SPO2: ");
137 oled.print(spo2, DEC);
138 }
139
140 prevO2 = spo2;
141 prevPulse = heartRate;
142 }
143
144 maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
145 }
146}