Test program for a Max30102 heartrate sensor on a STM32L476RG specific board ENSMM

Dependencies:   mbed

These two pictures show how to connect the Mheuve Sensor to the ST-Link debugger (don't forget to disable ST-link jumpers and JP5 on the board! ):

https://os.mbed.com/media/uploads/jimbaud/1611739514454.jpghttps://os.mbed.com/media/uploads/jimbaud/1611739514453.jpg

These two pictures show how to connect the Mheuve Sensor TX RX to the ST-Link debugger (don't forget to cross TX and RX, it means Mheuve sensor TX on ST-Link RX and ST-Link TX on Mheuve sensor RX ):

https://os.mbed.com/media/uploads/jimbaud/1611739514450.jpg https://os.mbed.com/media/uploads/jimbaud/1611739514452.jpg

The Mheuve sensor board needs to be powered by an external battery.

The result appears on the terminal, speed config is 115200 bds.

https://os.mbed.com/media/uploads/jimbaud/terminal.jpg

Revision:
0:346a7fa07998
Child:
3:7c0fb55eb3ff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/algorithm/algorithm.h	Wed Apr 20 21:46:06 2016 +0000
@@ -0,0 +1,100 @@
+/** \file algorithm.h ******************************************************
+*
+* Project: MAXREFDES117#
+* Filename: algorithm.c
+* Description: This module is the heart rate/SpO2 calculation algorithm header file
+*
+* Revision History:
+*\n 1-18-2016 Rev 01.00 SK Initial release.
+*\n
+*
+* --------------------------------------------------------------------
+*
+* This code follows the following naming conventions:
+*
+*\n char              ch_pmod_value
+*\n char (array)      s_pmod_s_string[16]
+*\n float             f_pmod_value
+*\n int32_t           n_pmod_value
+*\n int32_t (array)   an_pmod_value[16]
+*\n int16_t           w_pmod_value
+*\n int16_t (array)   aw_pmod_value[16]
+*\n uint16_t          uw_pmod_value
+*\n uint16_t (array)  auw_pmod_value[16]
+*\n uint8_t           uch_pmod_value
+*\n uint8_t (array)   auch_pmod_buffer[16]
+*\n uint32_t          un_pmod_value
+*\n int32_t *         pn_pmod_value
+*
+* ------------------------------------------------------------------------- */
+/*******************************************************************************
+* Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+*******************************************************************************
+*/
+#ifndef ALGORITHM_H_
+#define ALGORITHM_H_
+
+#include "mbed.h"
+
+#define true 1
+#define false 0
+#define FS 100
+#define BUFFER_SIZE  (FS* 5) 
+#define HR_FIFO_SIZE 7
+#define MA4_SIZE  4 // DONOT CHANGE
+#define HAMMING_SIZE  5// DONOT CHANGE
+#define min(x,y) ((x) < (y) ? (x) : (y))
+
+const uint16_t uw_hamm[31]={ 41,    276,    512,    276,     41 }; //Hamm=  long16(512* hamming(5)');
+//SPO2table is computed as  -45.060*ratioAverage* ratioAverage + 30.354 *ratioAverage + 94.845 ;
+const uint8_t uch_spo2_table[184]={ 95, 95, 95, 96, 96, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 99, 99, 99, 99, 
+                            99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 
+                            100, 100, 100, 100, 99, 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 97, 97, 
+                            97, 97, 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 93, 92, 92, 92, 91, 91, 
+                            90, 90, 89, 89, 89, 88, 88, 87, 87, 86, 86, 85, 85, 84, 84, 83, 82, 82, 81, 81, 
+                            80, 80, 79, 78, 78, 77, 76, 76, 75, 74, 74, 73, 72, 72, 71, 70, 69, 69, 68, 67, 
+                            66, 66, 65, 64, 63, 62, 62, 61, 60, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 
+                            49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 31, 30, 29, 
+                            28, 27, 26, 25, 23, 22, 21, 20, 19, 17, 16, 15, 14, 12, 11, 10, 9, 7, 6, 5, 
+                            3, 2, 1 } ;
+static  int32_t n_dx[ BUFFER_SIZE-MA4_SIZE]; // delta
+static  int32_t n_x[ BUFFER_SIZE]; //ir
+static  int32_t n_y[ BUFFER_SIZE]; //red
+
+
+void maxim_heart_rate_and_oxygen_saturation(uint32_t *un_ir_buffer ,  int32_t n_ir_buffer_length, uint32_t *un_red_buffer ,   int32_t *n_spo2, int8_t *ch_spo2_valid ,  int32_t *n_heart_rate , int8_t  *ch_hr_valid);
+void maxim_find_peaks( int32_t *n_locs, int32_t *n_npks,  int32_t *n_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num );
+void maxim_peaks_above_min_height( int32_t *n_locs, int32_t *n_npks,  int32_t *n_x, int32_t n_size, int32_t n_min_height );
+void maxim_remove_close_peaks( int32_t *n_locs, int32_t *n_npks,   int32_t  *n_x, int32_t n_min_distance );
+void maxim_sort_ascend( int32_t *n_x, int32_t n_size );
+void maxim_sort_indices_descend(  int32_t  *n_x, int32_t *n_indx, int32_t n_size);
+
+#endif /* ALGORITHM_H_ */
\ No newline at end of file