Cara program Sensor Detak jantung dan oksigen darah MAX30102 pada Arduino Uno

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

  1. Arduino Uno
    Sebagai mikrokontroler utama.
  2. Sensor MAX30102
    Digunakan untuk mendeteksi detak jantung dan kadar oksigen darah.
  3. Kabel Jumper
    Untuk menghubungkan sensor ke Arduino Uno.
  4. Breadboard
    Untuk mempermudah koneksi.

Skema Koneksi

Berikut adalah skema koneksi antara sensor MAX30102 dan Arduino Uno:

Pin MAX30102Pin Arduino Uno
VIN5V
GNDGND
SCLA5 (I2C SCL)
SDAA4 (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

By Vahrel

Mau Konsultasi & Diskusi ?