Skip to content

Commit 70d0460

Browse files
committed
Add UNIT max30100 example
1 parent 947d42b commit 70d0460

File tree

2 files changed

+155
-1
lines changed

2 files changed

+155
-1
lines changed

examples/Unit/HEART/MAX30100_RawData/MAX30100_RawData.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
2929

3030
// The LEDs currents must be set to a level that avoids clipping and maximises the
3131
// dynamic range
32-
#define IR_LED_CURRENT MAX30100_LED_CURR_50MA
32+
#define IR_LED_CURRENT MAX30100_LED_CURR_24MA
3333
#define RED_LED_CURRENT MAX30100_LED_CURR_27_1MA
3434

3535
// The pulse width of the LEDs driving determines the resolution of
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/*
2+
pls install MAX30100lib by library manager first
3+
addr: https://github.com/oxullo/Arduino-MAX30100
4+
*/
5+
6+
#include <M5Stack.h>
7+
#include "MAX30100.h"
8+
#include <math.h>
9+
10+
#define SAMPLING_RATE MAX30100_SAMPRATE_50HZ
11+
12+
// The LEDs currents must be set to a level that avoids clipping and maximises the
13+
// dynamic range
14+
#define IR_LED_CURRENT MAX30100_LED_CURR_11MA
15+
#define RED_LED_CURRENT MAX30100_LED_CURR_11MA
16+
17+
// The pulse width of the LEDs driving determines the resolution of
18+
// the ADC (which is a Sigma-Delta).
19+
// set HIGHRES_MODE to true only when setting PULSE_WIDTH to MAX30100_SPC_PW_1600US_16BITS
20+
#define PULSE_WIDTH MAX30100_SPC_PW_400US_14BITS
21+
#define HIGHRES_MODE true
22+
23+
TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd);
24+
MAX30100 sensor;
25+
26+
uint64_t realTime[4], time_count = 0;
27+
bool k_ready = false;
28+
29+
void setup() {
30+
// put your setup code here, to run once:
31+
M5.begin();
32+
33+
M5.Lcd.setSwapBytes(false);
34+
Disbuff.createSprite(160, 160);
35+
Disbuff.setSwapBytes(true);
36+
Disbuff.createSprite(160, 160);
37+
38+
if (!sensor.begin())
39+
{
40+
Serial.println("FAILED");
41+
for(;;);
42+
}
43+
else
44+
{
45+
Serial.println("SUCCESS");
46+
}
47+
48+
sensor.setMode(MAX30100_MODE_SPO2_HR);
49+
sensor.setLedsCurrent(IR_LED_CURRENT, RED_LED_CURRENT);
50+
sensor.setLedsPulseWidth(PULSE_WIDTH);
51+
sensor.setSamplingRate(SAMPLING_RATE);
52+
sensor.setHighresModeEnabled(HIGHRES_MODE);
53+
sensor.resetFifo();
54+
}
55+
56+
uint16_t line[2][320] = {0};
57+
int16_t k_number[320]={0};
58+
int16_t raw_data[512];
59+
int16_t k_min;
60+
int16_t k_threshold;
61+
uint32_t k_pos_buff[32];
62+
double k_pos_time[32];
63+
double k_standard_deviation, k_sumdata;
64+
uint32_t k_pos, k_pos_count = 0;
65+
66+
uint32_t led_pos = 0, ir_Pos = 0;
67+
uint16_t ir_max = 0, led_max = 0, ir_min = 0, led_min = 0, ir_last = 0, led_last = 0;
68+
int16_t k_number_min = 0, k_number_max = 0, k_last = 0;
69+
uint16_t ir_last_raw = 0, led_last_raw = 0, k_last_raw = 0;
70+
uint16_t ir_disdata, led_disdata, k_disdata;
71+
uint16_t Alpha = 0.3 * 256;
72+
uint16_t count_min = 0, count_max = 0;
73+
74+
void loop() {
75+
// put your main code here, to run repeatedly:
76+
uint16_t ir, red;
77+
78+
//Serial.printf("raed fifo Length :%d\n", read_length);
79+
while(sensor.getRawValues(&ir, &red) == false)
80+
{
81+
delay(10);
82+
sensor.update();
83+
}
84+
85+
while (1)
86+
{
87+
line[0][( led_pos + 160 )%320] = ( led_last_raw * ( 256 - Alpha ) + red * Alpha )/ 256;
88+
line[1][( ir_Pos + 160 )%320] = ( ir_last_raw * ( 256 - Alpha ) + ir * Alpha )/ 256;
89+
90+
k_number[( led_pos + 160 )%320] = line[0][( led_pos + 160 )%320] - led_last_raw;
91+
92+
led_last_raw = line[0][( led_pos + 160 )%320];
93+
ir_last_raw = line[1][( led_pos + 160 )%320];
94+
led_pos ++;
95+
ir_Pos ++;
96+
if(sensor.getRawValues(&ir, &red) == false)
97+
{
98+
break;
99+
}
100+
}
101+
102+
sensor.resetFifo();
103+
104+
for (int i = 0; i < 160; i++)
105+
{
106+
if( i == 0 )
107+
{
108+
led_max = led_min = line[0][( led_pos + i ) %320];
109+
ir_max = ir_min = line[1][( ir_Pos + i ) %320];
110+
k_number_min = k_number_max = k_number[( ir_Pos + i ) %320];
111+
}
112+
else
113+
{
114+
led_max = ( line[0][( led_pos + i ) %320] > led_max ) ? line[0][( led_pos + i ) %320] : led_max;
115+
led_min = ( line[0][( led_pos + i ) %320] < led_min ) ? line[0][( led_pos + i ) %320] : led_min;
116+
117+
ir_max = ( line[1][( ir_Pos + i ) %320] > ir_max ) ? line[1][( ir_Pos + i ) %320] : ir_max;
118+
ir_min = ( line[1][( ir_Pos + i ) %320] < ir_min ) ? line[1][( ir_Pos + i ) %320] : ir_min;
119+
120+
k_number_max = ( k_number[( ir_Pos + i ) %320] > k_number_max ) ? k_number[( ir_Pos + i ) %320] : k_number_max;
121+
k_number_min = ( k_number[( ir_Pos + i ) %320] < k_number_min ) ? k_number[( ir_Pos + i ) %320] : k_number_min;
122+
}
123+
}
124+
125+
Disbuff.fillRect(0,0,160,160,BLACK);
126+
127+
for (int i = 0; i < 160; i++ )
128+
{
129+
led_disdata = map( line[0][( led_pos + i ) %320] , led_max, led_min, 0, 160);
130+
ir_disdata = map( line[1][( ir_Pos + i ) %320] , ir_max, ir_min, 0, 160);
131+
k_disdata = map( k_number[( ir_Pos + i ) %320] , k_number_max, k_number_min, 0, 160);
132+
{
133+
Disbuff.drawLine( i, led_last, i + 1, led_disdata, WHITE);
134+
Disbuff.drawLine( i, ir_last, i + 1, ir_disdata, RED);
135+
Disbuff.drawLine( i, k_last, i + 1, k_disdata, GREEN);
136+
}
137+
ir_last = ir_disdata;
138+
led_last = led_disdata;
139+
k_last = k_disdata;
140+
}
141+
142+
Disbuff.setTextSize(1);
143+
Disbuff.setTextColor(WHITE);
144+
145+
Disbuff.setCursor(5,5);
146+
Disbuff.printf("led:%d,%d,%d",led_max, led_min, led_max - led_min );
147+
Disbuff.setCursor(5,15);
148+
Disbuff.printf("ir:%d,%d,%d",ir_max, ir_min, ir_max - ir_min );
149+
150+
Disbuff.pushSprite(0,0);
151+
152+
153+
delay(10);
154+
}

0 commit comments

Comments
 (0)