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.
Dependencies: MAX30101 max32630fthr
Fork of MAX30101_HR_SPO2 by
Diff: main.cpp
- Revision:
- 0:0bd4103885bf
- Child:
- 1:471e2b722d24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Aug 17 15:53:16 2017 +0000 @@ -0,0 +1,142 @@ +#include "mbed.h" +#include "max32630fthr.h" +#include "MAX30101.h" + +MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); + +bool op_sensor_config(MAX30101 &op_sensor); + +/* Op Sensor FIFO nearly full callback */ +volatile bool op_sensorIntFlag = false; +void op_sensor_callback() +{ + op_sensorIntFlag = true; +} + +int main() +{ + Serial pc(USBTX, USBRX); + pc.baud(115200); + + DigitalOut rLed(LED1, LED_OFF); + DigitalOut gLed(LED2, LED_OFF); + DigitalOut bLed(LED3, LED_OFF); + + InterruptIn op_sensor_int(P3_2); + + I2C i2cBus(I2C1_SDA, I2C1_SCL); // I2C bus + + MAX30101 * op_sensor; + op_sensor = new MAX30101(i2cBus); + int rc = op_sensor_config(*op_sensor); + + op_sensor_int.fall(op_sensor_callback); + + MAX30101::InterruptBitField_u ints; + uint8_t fifoData[MAX30101::MAX_FIFO_BYTES]; + uint16_t idx, readBytes; + while(1) { + + if( rc == 0 ) + { + + if(op_sensorIntFlag) + { + + pc.printf("Interrupt seen...\r\n"); + op_sensorIntFlag = false; + rc = op_sensor->getInterruptStatus(ints); + + if((rc == 0) && (ints.bits.a_full)) + { + + rc = op_sensor->readFIFO(MAX30101::OneLedChannel, fifoData, readBytes); + + if(rc == 0) + { + + pc.printf("FIFO Read, received %d bytes\r\n", readBytes); + + for(idx = 0; idx < readBytes; idx++) + { + pc.printf("fifoData[0x%04x] = 0x%02x\r\n", idx, fifoData[idx]); + } + pc.printf("\r\n"); + } + } + } + + } else { + + pc.printf("Something went wrong, check the I2C bus or power connections... \r\n"); + bLed = LED_OFF; + gLed = LED_OFF; + + while(1) + { + rLed = !rLed; + wait(0.5); + } + + } + + } + +} + + +bool op_sensor_config(MAX30101 &op_sensor) { + + //Reset Device + MAX30101::ModeConfiguration_u modeConfig; + modeConfig.all = 0; + modeConfig.bits.reset = 1; + int32_t rc = op_sensor.setModeConfiguration(modeConfig); + + + //enable MAX30101 interrupts + MAX30101::InterruptBitField_u ints; + if(rc == 0) + { + ints.all = 0; + ints.bits.die_temp = 1; + ints.bits.a_full = 1; + rc = op_sensor.enableInterrupts(ints); + } + + //configure FIFO + MAX30101::FIFO_Configuration_u fifoConfig; + if(rc == 0) + { + fifoConfig.all = 0; + fifoConfig.bits.fifo_a_full = 15; //Max level of 15 samples + fifoConfig.bits.sample_average = MAX30101::AveragedSamples_4; + rc = op_sensor.setFIFOConfiguration(fifoConfig); + } + + MAX30101::SpO2Configuration_u spo2Config; + spo2Config.all = 0; + spo2Config.bits.spo2_sr = MAX30101::SR_1600_Hz; + if(rc == 0) + { + rc = op_sensor.setSpO2Configuration(spo2Config); + } + + //Set LED1 drive current + if(rc == 0) + { + //Heart Rate only + rc = op_sensor.setLEDPulseAmplitude(MAX30101::LED1_PA, 0x1F); + } + + //Set operating mode + modeConfig.all = 0; + modeConfig.bits.mode = MAX30101::HeartRateMode; + if(rc == 0) + { + rc = op_sensor.setModeConfiguration(modeConfig); + } + + + return rc; +}