Pulse Oximeter/Optical Heart Rate Monitor

Maxim MAX30100 based Pulse Oximeter and Heart Rate Monitor

Similar projects worth following
Pulse Oximeter and Photoplethysmography (PPG) based Heart Rate Monitor for finger (and possibly wrist) use.

This Flex Module uses the new MAX30100 module. Requires a 3v3 VDD input for the LEDs. Also requires a 1v8 power source, so we added a tiny SMPS onboard powered from the VDD. 1v8 SMPS is around 500mA, so the board provides it to auxiliary boards through a pin out. We need to make the driver once we have a board ready.

Any software related will be released under BSD or MIT license. SAAS or cloud based software will be AGPL.

Creative Commons License

  • 1 × MAX30100
  • 1 × LM3671TLX-1.875/NOPB Power Management ICs / Switching Regulators and Controllers

  • Initial availability on Tindie

    Chris Hamilton03/23/2017 at 14:47 0 comments

    I have added the boards to Tindie for anyone who wants them. The design is generic to any of the MAX3010x series modules, so we will sell all versions. The design we made is pretty minimal compared to Sparkfun's MAX30105 and others. The MAX3010x series is 6V pin tolerant, so much of the i2c bus wrangling is unnecessary.

    I am also looking at using something like the TPS8268180, though it is a little pricey it may be easier to build with by hand compared to the LM3671TL series BGA.

    The photos aren't great, I will have a new camera and light box configuration soon:

  • MAXREFDES117 now available

    Chris Hamilton09/09/2016 at 07:48 0 comments

    Hi, just wanted to let everyone know that Maxim Integrated has released a small reference design board for the new MAX30102 complete with examples:


    I will be updating this design, but just to make a Flex Module compatible version. I hope this design will help everyone interested.

  • Software Development

    Chris Hamilton04/07/2016 at 18:32 0 comments

    I have rejected a bunch of random request to join this project. If you are not a bot and are truly interested in working on the software issues, please let me know. Do not just click the join button.

    If you want to generally help on making small wearable circuit designs, I would suggest talking to me about joining the general Flex Modules project.

  • Waiting on component and stencil

    Chris Hamilton08/17/2015 at 20:39 0 comments

    We are still waiting for parts to confirm if the reference design appears to work.

  • Driver

    Chris Hamilton08/17/2015 at 20:38 1 comment

    It may take some effort to create them, the datasheet is pretty minimal and there isn't that much information public about the module.

  • PPG heart rate

    Chris Hamilton08/17/2015 at 20:37 0 comments

    PPG is not recommended to be measured on the wrist. There are many consumer fitness products that do try, but movement disturbs the reading. This module is tiny, so maybe it can be placed tight against the wrist.

  • Maxim NDA

    Chris Hamilton08/17/2015 at 17:47 0 comments

    For this component we had to sign an NDA. We will develop drivers, but I am concerned about exposing what Maxim believes is its intellectual property. I have no idea how their position helps them sell more components.

View all 7 project logs

Enjoy this project?



francescem wrote 09/13/2016 at 08:34 point

Hi, in case someone needs it, I made a code to read the Infrared data and plot it in the pc via serial port with the software SerialPlot. I'll leave it here.!lxNUGabb!kZQF51G4X880iESr4EPBIMfcDMrOi1_C-XqQXmHDWXo

  Are you sure? yes | no

chhor.g wrote 07/07/2016 at 08:38 point

Hi everyone !
Does anyone knows what is the physical measure we get in output of the MAX30100 ? It does not seem that it is absorbance ! Is it transmittance or only the intensity of light or even the pure voltage to be converted into a physical value ? I can get any information on this;. Thank you for your help !

  Are you sure? yes | no

smith1994 wrote 05/21/2016 at 02:14 point

Hello everyone! I'm really stuck in this sensor for months. Is it the fact that there's no way to compute the SpO2 ratio and heart rate? Could anyone can tell me a solution? Thank you very much!

  Are you sure? yes | no

YannickRiouRobotics wrote 03/24/2016 at 14:45 point

I think the real problem about this sensor is that it is used in the latest samsung smartphones :

that's why maxim isn't giving so much information on it, because they made an agreement with Samsung to keep some information (like how to compute the data, application notes, etc) secret... That quite bad for a components beeing currently sold...

  Are you sure? yes | no

adamrenner wrote 04/23/2016 at 17:03 point

I think your giving Samsung a little too much credit. The interface on the Maxim chip is pretty much equivalent to analog front ends that have been built for pulse oximeters in the past. The pulse signature is relatively straightforward to identify if you know the tricks to get good readings. It only requires a single LED. SpO2 is not so easy and requires good signal quality at both wavelengths. It would be hard to pull off in a watch or phone form factor regardless of chips used.

  Are you sure? yes | no

adamrenner wrote 03/21/2016 at 18:27 point

I found a library here that seems to work except for some minor issues:

I was getting values for the IR but not the Red, but I think I might just have a bad connection to the Red Cathode on my board. Anyone want to confirm?

  Are you sure? yes | no

YannickRiouRobotics wrote 03/24/2016 at 10:43 point

Tested and ploted the values but didn't get any relevant values (can't find the heartrate on the graph...)

  Are you sure? yes | no

Connor Huffine wrote 03/27/2016 at 14:48 point

The values are IR reflectance, if you use the latest example the plotter will look familiar. I'm working on pulse-rate calculations now.

  Are you sure? yes | no

YannickRiouRobotics wrote 03/29/2016 at 14:32 point

Connor Huffine can you show us a picture of what you get ? Here is my result with IR, and I can't see any periodic signal to extract the heartbeat !!

  Are you sure? yes | no

smith1994 wrote 04/23/2016 at 03:18 point

Hi @adamrenner, thanks for sharing this library! I found a little confusion in this. In the MAX30100.cpp line 28, you have to change MAX30100_SPO2_CONFIG to MAX30100_MODE_CONFIG. So you can get the value of Red LED.

  Are you sure? yes | no

adamrenner wrote 04/23/2016 at 15:36 point

In the begin() function, Connor is only turning on current to the IR. So you will want to modify the function to allow you to turn on the Red. I just modified it to set them both to the same current, but it is probably best to  set them  seperately

void MAX30100::begin(pulseWidth pw, ledCurrent current, sampleRate sr){
  I2CwriteByte(MAX30100_ADDRESS, MAX30100_MODE_CONFIG, 0x03);
  I2CwriteByte(MAX30100_ADDRESS, MAX30100_LED_CONFIG, (current<<4)|current);
  I2CwriteByte(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, (sr<<2)|pw);

  Are you sure? yes | no

Max Saeta wrote 08/03/2016 at 22:07 point

Para que el LED rojo funcione hay que corregir

void MAX30100::begin(pulseWidth pw, ledCurrent ir, sampleRate sr){
  I2CwriteByte(MAX30100_ADDRESS, MAX30100_MODE_CONFIG, 0x03); // 0x02 Heart rate only  // 0x03 SPO2 Enabled
  I2CwriteByte(MAX30100_ADDRESS, MAX30100_LED_CONFIG, (i50<<4)|i50);

  I2CwriteByte(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, 64|(sr<<2)|pw);

y también cambiar esta tabla

typedef enum{
  i0,    // No current
  i4,    // 4.4mA
  i8,    // 7.6mA
  i11,   // 11.0mA
  i14,   // 14.2mA
  i17,   // 17.4mA
  i21,   // 20.8mA
  i24,   // 24.0mA <--- Este valor faltaba
  i27,   // 27.1mA
  i31,   // 30.6mA
  i34,   // 33.8mA
  i37,   // 37.0mA
  i40,   // 40.2mA
  i44,   // 43.6mA
  i47,   // 46.8mA
  i50    // 50.0mA

  Are you sure? yes | no

Sasha wrote 03/20/2016 at 15:55 point

Hi!!! I know what is this data of IR and R LED in FIFO registr. It's clear data. And if your try function RLed = f(t) and IRled = f(t), where t - long time or diferent number. You can see a graph. Absorption of light distribution in tissues And your can see similar graph in the this picture and datasheet.

And your can find algorytm for this calculation. 

  Are you sure? yes | no

Lorenzo-s92 wrote 03/08/2016 at 00:00 point

Hi!! I am able to interface the max30100 through i2c bus, but i can't obtain data from ADC and the leds doesn't switch on with code posted below. Have you also implemented some functions to manage INT signal, in order to have the sensor working? Thank you and suggestions are appreciated!!! email:

  Are you sure? yes | no

Chris Hamilton wrote 03/08/2016 at 16:22 point

Hi, Lorenzo and everyone else!  Sorry I haven't been keeping up with this conversation.  I have had similar troubles with my board design.  I have asked for some help from a local AFE I know.  Hopefully he can shed some light on what is missing.

  Are you sure? yes | no

Antoine wrote 03/15/2016 at 15:19 point

Hi Chris ! Thanks a lot for sharing about this project ! 
I'm also trying to use MAX30100. Unfortunately i have some issues to access FIFO Data using an Arduino Nano. I will appreciate a lot to get in touch with you about that ! my email :

  Are you sure? yes | no

aswathynair.1412 wrote 02/24/2016 at 10:03 point

Hi guys... i am also able to interface  max30100 with atmega328pa. And i am able to read the raw ADC data stream also. But am not sure whether  the data stream that am reading is correct or not. @Xiaowei Feng  could you please help in identifying it. I don't know what kind of algorithm have you used in calculating the  heart rate. I am bit stuck . email

  Are you sure? yes | no

Boichonoc wrote 02/22/2016 at 21:28 point

Hi guys. I looked your conversation. And also try MAX30100 on the Arduino (Nano), 328 Atmega and i do supply voltage 3.3 v. But what i wnat to say. This sours coe, how write mr.Chris Hamilton is veary good.  Becouse this sourse can be change how i or your want. And i want offer your look on this website. Exactly on this site i bought my module MAX30100. And also your can find sourse code and library for STM32F107VCT6. And also can finde implementation colculate SpO2. I try finished Chris's sourse code, using this information. Also your can see DEMO move. And they have similar data on IR and R diod. this is website)))) And i don't know, what are the units we have on spo2_data[i].ir and spo2_data[i].r. If i can find answer on this quetions, i can finished my task. So and, i think your can healp me whith this problems. Thx. And sry. ))))P.S. Sry for my Eanglesh ) 

  Are you sure? yes | no

Xiaowei Feng wrote 02/22/2016 at 10:25 point

Hi Chris,

I am also testing MAX30100 for my project. Now I have been already able to interface it with my MSP430 and obtain the data stream from it. The results seem good, enough for heart-rate purpose. However I have still no idea about how to calculate SpO2 data cause a large part of DC is missing in the measurement. I think there is still hidden information which the datasheet hasn't released yet due to the NDA (hopefully not hidden registers).

I'm available by my email: Glad to communicate and discuss with other developers. 

  Are you sure? yes | no

aswathynair.1412 wrote 02/04/2016 at 05:16 point

Hello Sir, I am trying to use MAX30100 for my project and am trying to interface it with atmega328pa. I do need some help in building it up. Since atmega328pa works with 5v, is it safe to work with SCL and SDA pins of max30100. Is there any library available for the same?

  Are you sure? yes | no

cgutierrezcisternas wrote 01/22/2016 at 15:20 point

Chris, you have many results ? because i yet have not obtained nothing :(

  Are you sure? yes | no

Alejandro Chavaron wrote 12/29/2015 at 19:18 point

Hello Chris, 

I did get this sensor too. However, have you got any useful data from it? I happen to be in the same situation as Savinogiusto: Getting data from it but unsure if it is correct, or how to interpret it.

Did you all follow the pseudo code from the datasheet?

  Are you sure? yes | no

cgutierrezcisternas wrote 12/01/2015 at 17:03 point

Hi Chris, i'm from Chile and  i think that your job is very impresive. I'm working with the same sensor (MAX30100), but i can't connect it with my arduino (Pro Mini ATmega328P 3.3V/8MHz). I think that there is a problem of connection. Can you help me ? What do you think it might be wrong? Thanks ! 

  Are you sure? yes | no

Chris Hamilton wrote 12/02/2015 at 06:45 point

Hi, my first thought would be to assume it is just i2c bus connectivity problems.  Do you have pull up resistors on both the SDA and SCL lines?  Are they connected correctly to A4 (SDA) and A5 (SCL) on the arduino?  There isn't much to it, the ground needs to be the same, wire and resistor quality is usually not a factor.  Interference is very unlikely.

  Are you sure? yes | no

cgutierrezcisternas wrote 12/02/2015 at 12:05 point

Hi again jeje, yes everything you say is connect. I don't know if you could give me your email for send a image about my connections for discard the possibility of have something wrong. I would be very grateful. Thanks!

  Are you sure? yes | no

smith1994 wrote 04/23/2016 at 02:48 point

Hi Chris, I'm confusing with the i2c bus connectivity, too. Could you send me the schematic. My email is: I hope your answer. Thank you very much !!!

  Are you sure? yes | no

Chris Hamilton wrote 12/02/2015 at 14:23 point

OK, sure.  I am chris at .  Also, you could try scanning for the address:

  Are you sure? yes | no

cgutierrezcisternas wrote 12/02/2015 at 18:38 point

I send you the schematic to your email, i hope your answer. we talk :)

  Are you sure? yes | no

savinogiusto wrote 11/30/2015 at 13:07 point

Yes. I implemented the datasheet pseudo-code. I extract 200 samples at 100Hz while putting my finger over sensor. But I'm not sure about result, i think I'm wrong something.

  Are you sure? yes | no

Chris Hamilton wrote 11/30/2015 at 13:30 point

OK, is your code available to test?  (It would be great if you release it BSD or similar OSS license.)  I could try it on my test boards and see what I can do with it.  Thanks!

  Are you sure? yes | no

savinogiusto wrote 12/01/2015 at 13:42 point

Here you can find my source code:
I implemented two function "readI2C_reg" and "writeI2C" to read and write MAX30100 register. The data that I got don't seem to be right. Please, make your test and let me know.

  Are you sure? yes | no

Chris Hamilton wrote 12/03/2015 at 06:54 point

I wonder if the design requires glass surface above it for a good deflection.   My test board seems to not be functioning, I believe the DRV lines are wrongly set to ground.  I'll order another batch and I can't cut the traces with the way I laid it out.

  Are you sure? yes | no

savinogiusto wrote 12/03/2015 at 13:29 point

According to the datasheet you should leave IR_DRV e R_DRV unconnected, because this lines are internally connected. Please, let me know if you succesful with the code.

  Are you sure? yes | no

savinogiusto wrote 11/29/2015 at 17:47 point

I'm writing driver using Arduino to control MAX30100. I got some data but I'm not sure it's correct. Anyone is working on it?

  Are you sure? yes | no

Chris Hamilton wrote 11/30/2015 at 07:33 point

Hi, did you implement the pseudo-code examples in the datasheet?  I haven't implemented it myself yet.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates