MAX30100 Heart Rate and SpO2 Sensor Module – Black PCB
The MAX30100 is a compact and efficient sensor module that combines pulse oximetry and heart rate monitoring into a single device. This module uses red and infrared LEDs to measure the oxygen saturation level in the blood (SpO2) and heart rate (BPM), making it ideal for health monitoring , wearables , and biometric projects .
This version features a black PCB , giving it a sleek appearance while delivering reliable performance in compact or portable setups.
Key Features
Measures both heart rate and blood oxygen saturation (SpO2)
Integrated red and IR LEDs , photodetector, and signal processing
I2C digital interface – easy to use with Arduino and other microcontrollers
Low power consumption , suitable for portable/wearable devices
Compact design with black PCB
Ideal for health monitoring, IoT medical devices, fitness wearables, and academic projects
Specifications
Parameter
Value
Operating Voltage
1.8V to 3.3V (use with 3.3V logic)
Interface
I2C
Functions
Heart Rate & SpO2 Measurement
LEDs
Red and Infrared
PCB Color
Black
Dimensions
Approx. 15mm x 14mm
Compatibility
Arduino, ESP8266, ESP32, Raspberry Pi, STM32
Package Includes
⚠️ Note: For best accuracy, minimize motion and avoid strong ambient light during use.
Pin Connections Table 1
Board Sensor Pin Connection MAX30100 VCC/GND/SDA/SCL 3.3V / GND / board SDA / board SCL
MAX30100 Black Heart Rate - Arduino Uno
MAX30100 Black Heart Rate - Arduino Nano
MAX30100 Black Heart Rate - Arduino Mega
MAX30100 Black Heart Rate - ESP32
MAX30100 Black Heart Rate - ESP8266
MAX30100 Black Heart Rate - STM32
MAX30100 Black Heart Rate - 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.