Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 /** \file main.cpp ****************************************************** 00002 * 00003 * Project: MAXREFDES117# 00004 * Filename: main.cpp 00005 * Description: This module contains the Main application for the MAXREFDES117 example program. 00006 * 00007 * 00008 * -------------------------------------------------------------------- 00009 * 00010 * This code follows the following naming conventions: 00011 * 00012 * char ch_pmod_value 00013 * char (array) s_pmod_s_string[16] 00014 * float f_pmod_value 00015 * int32_t n_pmod_value 00016 * int32_t (array) an_pmod_value[16] 00017 * int16_t w_pmod_value 00018 * int16_t (array) aw_pmod_value[16] 00019 * uint16_t uw_pmod_value 00020 * uint16_t (array) auw_pmod_value[16] 00021 * uint8_t uch_pmod_value 00022 * uint8_t (array) auch_pmod_buffer[16] 00023 * uint32_t un_pmod_value 00024 * int32_t * pn_pmod_value 00025 * 00026 * ------------------------------------------------------------------------- */ 00027 /******************************************************************************* 00028 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. 00029 * 00030 * Permission is hereby granted, free of charge, to any person obtaining a 00031 * copy of this software and associated documentation files (the "Software"), 00032 * to deal in the Software without restriction, including without limitation 00033 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00034 * and/or sell copies of the Software, and to permit persons to whom the 00035 * Software is furnished to do so, subject to the following conditions: 00036 * 00037 * The above copyright notice and this permission notice shall be included 00038 * in all copies or substantial portions of the Software. 00039 * 00040 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00041 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00042 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 00043 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES 00044 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 00045 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 00046 * OTHER DEALINGS IN THE SOFTWARE. 00047 * 00048 * Except as contained in this notice, the name of Maxim Integrated 00049 * Products, Inc. shall not be used except as stated in the Maxim Integrated 00050 * Products, Inc. Branding Policy. 00051 * 00052 * The mere transfer of this software does not imply any licenses 00053 * of trade secrets, proprietary technology, copyrights, patents, 00054 * trademarks, maskwork rights, or any other form of intellectual 00055 * property whatsoever. Maxim Integrated Products, Inc. retains all 00056 * ownership rights. 00057 ******************************************************************************* 00058 */ 00059 /*!\mainpage Main Page 00060 * 00061 * \section intro_sec Introduction 00062 * 00063 * This is the code documentation for the MAXREFDES117# subsystem reference design. 00064 * 00065 * The Files page contains the File List page and the Globals page. 00066 * 00067 * The Globals page contains the Functions, Variables, and Macros sub-pages. 00068 * 00069 * \image html MAXREFDES117_Block_Diagram.png "MAXREFDES117# System Block Diagram" 00070 * 00071 * \image html MAXREFDES117_firmware_Flowchart.png "MAXREFDES117# Firmware Flowchart" 00072 * 00073 */ 00074 #include "mbed.h" 00075 #include "algorithm.h" 00076 #include "MAX30102.h" 00077 #include "USBSerial.h" 00078 00079 #define MAX_BRIGHTNESS 255 00080 00081 uint32_t aun_ir_buffer[500]; //IR LED sensor data 00082 int32_t n_ir_buffer_length; //data length 00083 uint32_t aun_red_buffer[500]; //Red LED sensor data 00084 int32_t n_sp02; //SPO2 value 00085 int8_t ch_spo2_valid; //indicator to show if the SP02 calculation is valid 00086 int32_t n_heart_rate; //heart rate value 00087 int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid 00088 uint8_t uch_dummy; 00089 00090 USBSerial pc; //initializes the serial port 00091 00092 /* 00093 #ifdef TARGET_KL25Z 00094 PwmOut led(PTB18); //initializes the pwm output that connects to the on board LED 00095 DigitalIn INT(PTD1); //pin PTD1 connects to the interrupt output pin of the MAX30102 00096 #endif 00097 #ifdef TARGET_K64F 00098 DigitalIn INT(PTD1); //pin PTD1 connects to the interrupt output pin of the MAX30102 00099 #endif 00100 #ifdef TARGET_MAX32600MBED 00101 PwmOut led(LED_RED); //initializes the pwm output that connects to the on board LED 00102 DigitalIn INT(P2_0); //pin P20 connects to the interrupt output pin of the MAX30102 00103 #endif 00104 */ 00105 00106 // the setup routine runs once when you press reset: 00107 // the setup routine runs once when you press reset: 00108 int main() { 00109 uint32_t un_min, un_max, un_prev_data; //variables to calculate the on-board LED brightness that reflects the heartbeats 00110 int i; 00111 int32_t n_brightness; 00112 float f_temp; 00113 00114 maxim_max30102_reset(); //resets the MAX30102 00115 // initialize serial communication at 115200 bits per second: 00116 //pc.baud(115200); 00117 //pc.format(8,SerialBase::None,1); 00118 wait(1); 00119 00120 //read and clear status register 00121 //maxim_max30102_read_reg(0,&uch_dummy); 00122 00123 //wait until the user presses a key 00124 //while(pc.readable()==0) 00125 //{ 00126 //pc.printf("\x1B[2J"); //clear terminal program screen 00127 // pc.printf("Press any key to start conversion\n\r"); 00128 // wait(1); 00129 //} 00130 //uch_dummy=getchar(); 00131 00132 maxim_max30102_init(); //initializes the MAX30102 00133 00134 00135 n_brightness=0; 00136 un_min=0x3FFFF; 00137 un_max=0; 00138 00139 n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps 00140 00141 //read the first 500 samples, and determine the signal range 00142 for(i=0;i<n_ir_buffer_length;i++) 00143 { 00144 //while(INT.read()==1); //wait until the interrupt pin asserts 00145 00146 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); //read from MAX30102 FIFO 00147 00148 if(un_min>aun_red_buffer[i]) 00149 un_min=aun_red_buffer[i]; //update signal min 00150 if(un_max<aun_red_buffer[i]) 00151 un_max=aun_red_buffer[i]; //update signal max 00152 pc.printf("red="); 00153 pc.printf("%i", aun_red_buffer[i]); 00154 pc.printf(", ir="); 00155 pc.printf("%i\n\r", aun_ir_buffer[i]); 00156 } 00157 un_prev_data=aun_red_buffer[i]; 00158 00159 00160 //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples) 00161 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); 00162 00163 //Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second 00164 while(1) 00165 { 00166 i=0; 00167 un_min=0x3FFFF; 00168 un_max=0; 00169 00170 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top 00171 for(i=100;i<500;i++) 00172 { 00173 aun_red_buffer[i-100]=aun_red_buffer[i]; 00174 aun_ir_buffer[i-100]=aun_ir_buffer[i]; 00175 00176 //update the signal min and max 00177 if(un_min>aun_red_buffer[i]) 00178 un_min=aun_red_buffer[i]; 00179 if(un_max<aun_red_buffer[i]) 00180 un_max=aun_red_buffer[i]; 00181 } 00182 00183 //take 100 sets of samples before calculating the heart rate. 00184 for(i=400;i<500;i++) 00185 { 00186 un_prev_data=aun_red_buffer[i-1]; 00187 //while(INT.read()==1); 00188 maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i)); 00189 00190 if(aun_red_buffer[i]>un_prev_data) 00191 { 00192 f_temp=aun_red_buffer[i]-un_prev_data; 00193 f_temp/=(un_max-un_min); 00194 f_temp*=MAX_BRIGHTNESS; 00195 n_brightness-=(int)f_temp; 00196 if(n_brightness<0) 00197 n_brightness=0; 00198 } 00199 else 00200 { 00201 f_temp=un_prev_data-aun_red_buffer[i]; 00202 f_temp/=(un_max-un_min); 00203 f_temp*=MAX_BRIGHTNESS; 00204 n_brightness+=(int)f_temp; 00205 if(n_brightness>MAX_BRIGHTNESS) 00206 n_brightness=MAX_BRIGHTNESS; 00207 } 00208 #if defined(TARGET_KL25Z) || defined(TARGET_MAX32600MBED) 00209 led.write(1-(float)n_brightness/256); 00210 #endif 00211 //send samples and calculation result to terminal program through UART 00212 pc.printf("red="); 00213 pc.printf("%i", aun_red_buffer[i]); 00214 pc.printf(", ir="); 00215 pc.printf("%i", aun_ir_buffer[i]); 00216 pc.printf(", HR=%i, ", n_heart_rate); 00217 pc.printf("HRvalid=%i, ", ch_hr_valid); 00218 pc.printf("SpO2=%i, ", n_sp02); 00219 pc.printf("SPO2Valid=%i\n\r", ch_spo2_valid); 00220 wait(1); 00221 } 00222 maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid); 00223 } 00224 } 00225 00226
Generated on Fri Jul 29 2022 02:39:04 by
1.7.2