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:
Shaun Kelsey
Date:
Wed Apr 11 16:01:32 2018 -0700
Revision:
0:da5f5b56060a
Child:
3:28fb38fe73c4
Initial commit of Pegasus OS24 SmartSensor Host

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