The MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module (often known as the GY-MAX30100 variant) is a pulse oximeter and heart rate sensor built around the MAX30100 IC, using a red LED (660nm) and infrared LED (880–900nm) to measure blood oxygen and pulse rate optically.
The module communicates over I2C (SDA, SCL) and runs on 3.3V–5V thanks to onboard LDO regulators and typically proper level-shifting, while the sensor IC itself operates internally at 1.8V–3.3V. It draws roughly 600µA during active measurement and drops to just 0.7µA in standby.
A 14-bit ADC digitizes the optical signal, and integrated ambient light cancellation improves signal-to-noise ratio across varying lighting conditions, with operation rated from -40°C to +85°C.
Features:
MAX30100 pulse oximeter/heart rate IC
Purple PCB (GY-MAX30100 variant)
I2C interface (SDA, SCL)
Red (660nm) and IR (880–900nm) LED light sources
14-bit ADC resolution
Ultra-low standby current: ~0.7µA
Integrated ambient light cancellation
Onboard LDO regulators with level-shifting
Pin Connections Table 1
Board Sensor Pin Connection MAX30100 VCC/GND/SDA/SCL 3.3V / GND / board SDA / board SCL
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - Arduino Uno
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - Arduino Nano
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - Arduino Mega
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - ESP32
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - ESP8266
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - STM32
MAX30100 Purple Heart Rate & Blood Oxygen Sensor Module for Arduino - Raspberry Pi Pico
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for Arduino Uno: A4=SDA, A5=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for Arduino Nano: A4=SDA, A5=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for Arduino Mega: D20=SDA, D21=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for ESP32: GPIO21=SDA, GPIO22=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for ESP8266: D2=SDA, D1=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for STM32: PB7=SDA, PB6=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
1 //ekostra.com
2 //electronics store in egypt
3 //+201008896258
4
5 // I2C wiring for Raspberry Pi Pico: GPIO4=SDA, GPIO5=SCL
6 #include <Wire.h>
7 #include "MAX30105.h" // SparkFun library - also covers MAX30100/30102 register-compatible reads
8
9 MAX30105 particleSensor;
10
11 void setup () {
12 Serial.begin (115200 );
13 Wire.begin();
14 if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
15 Serial.println ("MAX3010x not found - check wiring!");
16 while (1 ) delay (10 );
17 }
18 particleSensor.setup (); // default sensor settings (LED brightness, sample rate...)
19 }
20
21 void loop () {
22 long irValue = particleSensor.getIR();
23
24 if (irValue < 50000 ) {
25 Serial.println ("No finger detected");
26 } else {
27 Serial.print ("IR: "); Serial.print (irValue);
28 Serial.print (" Red: "); Serial.println (particleSensor.getRed());
29 // Real BPM/SpO2 needs the library's beat-detection / SpO2 algorithm on top of these raw readings.
30 }
31
32 delay (20 );
33 }
Project Notes: I2C optical heart-rate/SpO2 sensor.