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