Host software for the MAXREFDES220 Heart Rate Monitor Smart Sensor. Hosted on the MAX32630FTHR.

Dependencies:   max32630fthr USBDevice

Fork of MAXREFDES220_HEART_RATE_MONITOR by Maxim Integrated

Finger Heart Rate Monitor and SpO2 Monitor

The MAXREFDES220 Smart Sensor FeatherWing board is a integrated solution for providing finger-based heart rate measurements and SpO2 (blood oxygen saturation). This evaluation board interfaces to the host computer using the I2C interface. Heart rate outpu is available in beats per minute (BPM) and SpO2 is reported in percentages.; the PPG (photoplethysmography) raw data is also available. The board has an MAX30101 chip which is a low power heart rate monitor with adjustable sample rates and adjustable LED currents. The low cost MAX32664 microcontroller is pre-flashed with C code for finger-based pulse rate and SpO2 monitoring. Bootloader software is included to allow for future algorithms or updates to the algorithm from Maxim Integrated.

Ordering information will be available soon.

Note: SpO2 values are not calibrated. Calibration should be performed using the final end product.

Warning

The MAXREFDES220 source code listed is dated and only compatible with the 1.2.8a.msbl. The latest sample host source code is available on the MAX32664 website.

MAXREFDES220 FeatherWing Pinout Connections

/media/uploads/phonemacro/maxrefdes220_pinouts_heart_rate_monitor.jpg

Committer:
Ismail Kose
Date:
Mon Aug 20 19:25:24 2018 -0700
Revision:
10:022b2cad9e9b
Parent:
8:0f55f59ca341
Fixing i2c comm issuess with bootloader, and remove unused code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Shaun Kelsey 0:da5f5b56060a 1 #include "mbed.h"
Shaun Kelsey 0:da5f5b56060a 2 #include "USBSerial.h"
Shaun Kelsey 0:da5f5b56060a 3 #include "version.h"
Shaun Kelsey 0:da5f5b56060a 4 #include "DSInterface.h"
Shaun Kelsey 0:da5f5b56060a 5 #include "Peripherals.h"
Ismail Kose 10:022b2cad9e9b 6 #include "max32630fthr.h"
Ismail Kose 10:022b2cad9e9b 7 #include "SSInterface.h"
Ismail Kose 10:022b2cad9e9b 8 #include "SSBootloaderComm.h"
Ismail Kose 10:022b2cad9e9b 9 #include "SSMAX30101Comm.h"
Shaun Kelsey 0:da5f5b56060a 10
Shaun Kelsey 3:28fb38fe73c4 11 #ifndef MAXIM_PLATFORM_NAME
Ismail Kose 10:022b2cad9e9b 12 #define MAXIM_PLATFORM_NAME "Pegasus"
Shaun Kelsey 3:28fb38fe73c4 13 #endif
Shaun Kelsey 3:28fb38fe73c4 14
Shaun Kelsey 0:da5f5b56060a 15 #if ENABLE_LED_STATUS
Shaun Kelsey 0:da5f5b56060a 16 //Set yellow light during boot
Ismail Kose 10:022b2cad9e9b 17 DigitalOut rLED(LED1, LED_ON);
Ismail Kose 10:022b2cad9e9b 18 DigitalOut gLED(LED2, LED_ON);
Ismail Kose 10:022b2cad9e9b 19 DigitalOut bLED(LED3, LED_OFF);
Shaun Kelsey 0:da5f5b56060a 20 #endif
Shaun Kelsey 0:da5f5b56060a 21
Ismail Kose 10:022b2cad9e9b 22 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
Shaun Kelsey 0:da5f5b56060a 23
Shaun Kelsey 0:da5f5b56060a 24 // Virtual serial port over USB
Shaun Kelsey 0:da5f5b56060a 25 USBSerial microUSB(0x1f00, 0x2012, 0x0001, false);
Ismail Kose 10:022b2cad9e9b 26 // Hardware serial port over DAPLink
Ismail Kose 10:022b2cad9e9b 27 Serial daplink(USBRX, USBTX, 115200);
Shaun Kelsey 0:da5f5b56060a 28
Ismail Kose 10:022b2cad9e9b 29 //GUI/Terminal Interface
Shaun Kelsey 0:da5f5b56060a 30 DSInterface dsInterface(&microUSB);
Shaun Kelsey 0:da5f5b56060a 31
Ismail Kose 10:022b2cad9e9b 32 //SmartSensor Interface
Ismail Kose 10:022b2cad9e9b 33 I2C ssI2C(P3_4, P3_5);
Ismail Kose 10:022b2cad9e9b 34 PinName ss_mfio(P5_4);
Ismail Kose 10:022b2cad9e9b 35 PinName ss_reset(P5_6);
Ismail Kose 10:022b2cad9e9b 36 SSInterface ssInterface(ssI2C, ss_mfio, ss_reset);
Shaun Kelsey 0:da5f5b56060a 37
Ismail Kose 10:022b2cad9e9b 38 SSBootloaderComm ssBoot(&microUSB, &ssInterface, &dsInterface);
Ismail Kose 10:022b2cad9e9b 39 SSMAX30101Comm ssMAX30101(&microUSB, &ssInterface, &dsInterface);
Shaun Kelsey 0:da5f5b56060a 40
Shaun Kelsey 0:da5f5b56060a 41
Ismail Kose 10:022b2cad9e9b 42 #ifdef ENABLE_LED_STATUS
Ismail Kose 10:022b2cad9e9b 43 static int led_on_ms = 100;
Ismail Kose 10:022b2cad9e9b 44 static int led_off_ms = 1900;
Ismail Kose 10:022b2cad9e9b 45 static Timer blink_timer;
Ismail Kose 10:022b2cad9e9b 46 static int current_state = 0;
Ismail Kose 10:022b2cad9e9b 47 void update_led_state()
Shaun Kelsey 0:da5f5b56060a 48 {
Ismail Kose 10:022b2cad9e9b 49 if (current_state == LED_ON) {
Ismail Kose 10:022b2cad9e9b 50 if (blink_timer.read_ms() > led_on_ms) {
Ismail Kose 10:022b2cad9e9b 51 gLED = LED_OFF;
Ismail Kose 10:022b2cad9e9b 52 current_state = LED_OFF;
Ismail Kose 10:022b2cad9e9b 53 blink_timer.reset();
Ismail Kose 10:022b2cad9e9b 54 }
Shaun Kelsey 0:da5f5b56060a 55 }
Ismail Kose 10:022b2cad9e9b 56 else
Ismail Kose 10:022b2cad9e9b 57 {
Ismail Kose 10:022b2cad9e9b 58 if (blink_timer.read_ms() > led_off_ms) {
Ismail Kose 10:022b2cad9e9b 59 gLED = LED_ON;
Ismail Kose 10:022b2cad9e9b 60 current_state = LED_ON;
Ismail Kose 10:022b2cad9e9b 61 blink_timer.reset();
Ismail Kose 10:022b2cad9e9b 62 }
Ismail Kose 10:022b2cad9e9b 63 }
Shaun Kelsey 0:da5f5b56060a 64 }
Shaun Kelsey 0:da5f5b56060a 65 #endif
Shaun Kelsey 0:da5f5b56060a 66
Shaun Kelsey 0:da5f5b56060a 67 void print_build_version()
Shaun Kelsey 0:da5f5b56060a 68 {
Ismail Kose 10:022b2cad9e9b 69 printf("\n\nPegasus mBED EVKit\r\n");
Shaun Kelsey 0:da5f5b56060a 70 printf("Fw version: %s, mbed version: %d\r\n", FIRMWARE_VERSION, MBED_VERSION);
Shaun Kelsey 0:da5f5b56060a 71 printf("Build source: (%s) %s\r\n", BUILD_SOURCE_BRANCH, BUILD_SOURCE_HASH);
Shaun Kelsey 0:da5f5b56060a 72 printf("Build time: %s %s\r\n\n", __TIME__, __DATE__);
Shaun Kelsey 0:da5f5b56060a 73 }
Shaun Kelsey 0:da5f5b56060a 74
Shaun Kelsey 0:da5f5b56060a 75 int main()
Shaun Kelsey 0:da5f5b56060a 76 {
Shaun Kelsey 0:da5f5b56060a 77 daplink.printf("Init NVIC Priorities...\r\n");
Shaun Kelsey 0:da5f5b56060a 78 fflush(stdout);
Shaun Kelsey 0:da5f5b56060a 79 NVIC_SetPriority(GPIO_P0_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 80 NVIC_SetPriority(GPIO_P1_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 81 NVIC_SetPriority(GPIO_P2_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 82 NVIC_SetPriority(GPIO_P3_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 83 NVIC_SetPriority(GPIO_P4_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 84 NVIC_SetPriority(GPIO_P5_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 85 NVIC_SetPriority(GPIO_P6_IRQn, 5);
Shaun Kelsey 0:da5f5b56060a 86 print_build_version();
Shaun Kelsey 0:da5f5b56060a 87 daplink.printf("daplink serial port\r\n");
Shaun Kelsey 0:da5f5b56060a 88 microUSB.printf("micro USB serial port\r\n");
Shaun Kelsey 0:da5f5b56060a 89
Shaun Kelsey 0:da5f5b56060a 90 dsInterface.set_fw_version(FIRMWARE_VERSION);
Shaun Kelsey 0:da5f5b56060a 91 dsInterface.set_fw_platform(MAXIM_PLATFORM_NAME);
Shaun Kelsey 0:da5f5b56060a 92 Peripherals::setUSBSerial(&microUSB);
Shaun Kelsey 0:da5f5b56060a 93
Shaun Kelsey 0:da5f5b56060a 94 ssI2C.frequency(400000);
Shaun Kelsey 0:da5f5b56060a 95 dsInterface.set_fw_platform(ssInterface.get_ss_platform_name());
Shaun Kelsey 0:da5f5b56060a 96 dsInterface.set_fw_version(ssInterface.get_ss_fw_version());
Shaun Kelsey 0:da5f5b56060a 97 dsInterface.add_sensor_comm(&ssBoot);
Shaun Kelsey 0:da5f5b56060a 98 dsInterface.add_sensor_comm(&ssMAX30101);
Shaun Kelsey 0:da5f5b56060a 99
Shaun Kelsey 0:da5f5b56060a 100 #ifdef ENABLE_LED_STATUS
Ismail Kose 10:022b2cad9e9b 101 //Indicate we're done with setup
Ismail Kose 10:022b2cad9e9b 102 rLED = LED_OFF;
Ismail Kose 10:022b2cad9e9b 103 gLED = LED_OFF;
Ismail Kose 10:022b2cad9e9b 104 bLED = LED_OFF;
Shaun Kelsey 0:da5f5b56060a 105
Ismail Kose 10:022b2cad9e9b 106 blink_timer.start();
Shaun Kelsey 0:da5f5b56060a 107 #endif
Shaun Kelsey 0:da5f5b56060a 108
Shaun Kelsey 0:da5f5b56060a 109 while(1) {
Shaun Kelsey 0:da5f5b56060a 110 USBSerial *serial = &microUSB;
Shaun Kelsey 0:da5f5b56060a 111 uint8_t ch;
Shaun Kelsey 0:da5f5b56060a 112 while (serial->readable()) {
Shaun Kelsey 0:da5f5b56060a 113 ch = serial->_getc();
Shaun Kelsey 0:da5f5b56060a 114 dsInterface.enable_console_interface();
Shaun Kelsey 0:da5f5b56060a 115 dsInterface.build_command(ch);
Shaun Kelsey 0:da5f5b56060a 116 }
Shaun Kelsey 0:da5f5b56060a 117
Shaun Kelsey 0:da5f5b56060a 118 dsInterface.data_report_execute();
Shaun Kelsey 0:da5f5b56060a 119 #ifdef ENABLE_LED_STATUS
Ismail Kose 10:022b2cad9e9b 120 update_led_state();
Shaun Kelsey 0:da5f5b56060a 121 #endif
Shaun Kelsey 0:da5f5b56060a 122 }
Shaun Kelsey 0:da5f5b56060a 123 }