Sensor MAX30102 adalah modul canggih yang dapat digunakan untuk mengukur detak jantung dan kadar oksigen dalam darah (SpO2). Dalam artikel ini, kita akan membahas langkah-langkah memprogram sensor ini menggunakan Arduino Uno, sehingga Anda dapat memantau data biometrik dengan mudah.
Komponen yang Dibutuhkan
- Arduino Uno
Sebagai mikrokontroler utama. - Sensor MAX30102
Digunakan untuk mendeteksi detak jantung dan kadar oksigen darah. - Kabel Jumper
Untuk menghubungkan sensor ke Arduino Uno. - Breadboard
Untuk mempermudah koneksi.
Skema Koneksi
Berikut adalah skema koneksi antara sensor MAX30102 dan Arduino Uno:
| Pin MAX30102 | Pin Arduino Uno |
|---|---|
| VIN | 5V |
| GND | GND |
| SCL | A5 (I2C SCL) |
| SDA | A4 (I2C SDA) |
Catatan: Pastikan sensor MAX30102 Anda sudah memiliki modul pendukung I2C.

Langkah Pemrograman
1. Persiapan Perpustakaan
Sebelum mulai menulis kode, Anda perlu menginstal pustaka berikut di Arduino IDE:
- SparkFun MAX3010x Sensor Library
Untuk membaca data dari sensor MAX30102. - MAX30102 SpO2 Algorithm
Algoritma untuk menghitung SpO2 dan detak jantung.
2. Kode Program
Berikut adalah program untuk membaca data detak jantung dan kadar oksigen darah:
#include <Arduino.h>
#include <Wire.h>
#include "MAX30105.h" // Include MAX30105 sensor library
#include "spo2_algorithm.h" // Include SpO2 calculation algorithm
MAX30105 particleSensor; // Create an instance of the MAX30105 class
#define MAX_BRIGHTNESS 255 // Define maximum LED brightness
// Adjust buffer size based on the microcontroller's memory capacity
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
uint16_t irBuffer[100]; // Buffer for IR data (16-bit for memory-limited devices)
uint16_t redBuffer[100]; // Buffer for red LED data
#else
uint32_t irBuffer[100]; // Buffer for IR data (32-bit for devices with more memory)
uint32_t redBuffer[100]; // Buffer for red LED data
#endif
int32_t bufferLength = 100; // Length of data buffer
int32_t spo2; // Variable to store calculated SpO2 value
int8_t validSPO2; // Flag indicating if SpO2 calculation is valid
int32_t heartRate; // Variable to store calculated heart rate
int8_t validHeartRate; // Flag indicating if heart rate calculation is valid
void proses_sensor_max30102() {
// Collect 100 samples and output raw red and IR data
for (byte i = 0; i < bufferLength; i++) {
while (!particleSensor.available()) particleSensor.check(); // Wait for new data
redBuffer[i] = particleSensor.getRed(); // Store red LED data
irBuffer[i] = particleSensor.getIR(); // Store IR data
particleSensor.nextSample(); // Move to next sample
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer[i], DEC);
}
// Calculate heart rate and SpO2 from the first 100 samples
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// Continuously update heart rate and SpO2 values with new samples
while (1) {
// Shift the last 75 samples to the beginning and fill the remaining with new data
for (byte i = 25; i < 100; i++) {
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
// Collect new samples to refill the buffer
for (byte i = 75; i < 100; i++) {
while (!particleSensor.available()) particleSensor.check(); // Wait for new data
redBuffer[i] = particleSensor.getRed(); // Store new red data
irBuffer[i] = particleSensor.getIR(); // Store new IR data
particleSensor.nextSample(); // Move to next sample
// Output raw data and calculated heart rate/SpO2 values
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);
Serial.print(F(", HR="));
Serial.print(heartRate, DEC);
Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);
Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);
}
// Recalculate heart rate and SpO2 with the updated buffer
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
}
}
void setup()
{
Serial.begin(9600);
Serial.begin(115200); // Initialize serial communication
// Initialize MAX30105 sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println(F("MAX30105 not found. Check wiring/power."));
while (1)
; // Halt execution if sensor not found
}
// Sensor configuration settings
byte ledBrightness = 60; // LED brightness (0-255)
byte sampleAverage = 4; // Averaging (1, 2, 4, 8, 16, 32)
byte ledMode = 3; // LED mode (1=Red, 2=Red+IR, 3=Red+IR+Green)
byte sampleRate = 200; // Sampling rate (50, 100, 200, 400, 800, 1000, 1600, 3200)
int pulseWidth = 411; // Pulse width (69, 118, 215, 411)
int adcRange = 4096; // ADC range (2048, 4096, 8192, 16384)
// Apply configuration settings to the sensor
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
}
}
void loop(){
proses_sensor_max30102();
}
Selamat Mencoba!!
Semoga Berhasil!!
Kalau teman-teman berminat jasa bisa wa kami di kontak whatsapp dibawah ini atau bisa cek tiktok kami disini : @labrobotika

