Skip to content

MAX30102 – Dokumentace a použití

Popis

MAX30102 je optický senzor pro měření srdeční frekvence (HR) a saturace kyslíkem (SpO₂). Používá červenou (RED) a infračervenou (IR) LED + fotodiodu. Komunikuje přes I2C (adresa 0x57).


Používané knihovny / protokoly

  • I2C
  • Wire.h
  • MAX30105.h (SparkFun)
  • heartRate.h

Zapojení


Inicializace (I2C + senzor)

cpp
#include <Wire.h>
#include "MAX30105.h"

MAX30105 sensor;

void setup() {
    Serial.begin(115200);
    Wire.begin();

    if (!sensor.begin(Wire)) {
        Serial.println("MAX30102 nenalezen");
        while (1);
    }

    sensor.setup();
}

Základní příkazy

Kontrola zařízení:

cpp
Wire.beginTransmission(0x57);
if (Wire.endTransmission() == 0) {
    Serial.println("Senzor nalezen");
}

Čtení hodnot:

cpp
long ir = sensor.getIR();
long red = sensor.getRed();

Kontrola prstu:

cpp
if (ir < 50000) {
    Serial.println("Přilož prst");
}

Nastavení LED:

cpp
sensor.setPulseAmplitudeRed(0x0A);
sensor.setPulseAmplitudeIR(0x0A);

FIFO práce se vzorky

cpp
sensor.check();

while (sensor.available()) {
    long ir = sensor.getFIFOIR();
    sensor.nextSample();
}

Měření srdeční frekvence (BPM)

cpp
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"

MAX30105 sensor;

const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float bpm;
int avg;

void setup() {
    Serial.begin(115200);
    Wire.begin();

    if (!sensor.begin(Wire)) {
        while (1);
    }

    sensor.setup();
    sensor.setPulseAmplitudeRed(0x0A);
    sensor.setPulseAmplitudeIR(0x0A);
}

void loop() {
    long ir = sensor.getIR();

    if (checkForBeat(ir)) {
        long delta = millis() - lastBeat;
        lastBeat = millis();

        bpm = 60 / (delta / 1000.0);

        if (bpm > 20 && bpm < 255) {
            rates[rateSpot++] = (byte)bpm;
            rateSpot %= RATE_SIZE;

            avg = 0;
            for (byte i = 0; i < RATE_SIZE; i++)
                avg += rates[i];

            avg /= RATE_SIZE;
        }
    }

    Serial.print("BPM=");
    Serial.print(bpm);
    Serial.print(" AVG=");
    Serial.println(avg);
}

Výpočet SpO₂

cpp
R = (AC_red / DC_red) / (AC_ir / DC_ir)  
SpO₂ ≈ 110 - 25 * R

Typické použití

  • chytré hodinky
  • zdravotnické IoT
  • fitness zařízení

Poznámky

  • prst musí být v klidu
  • minimalizuj okolní světlo
  • stabilní napájení (ideálně 3.3V)

Debug

  • hodnoty 0 → špatný kontakt
  • šum → špatné zapojení
  • nenalezen → problém I2C

I2C Scanner

cpp
#include <Wire.h>

void setup() {
    Wire.begin();
    Serial.begin(115200);

    for (byte i = 1; i < 127; i++) {
        Wire.beginTransmission(i);
        if (Wire.endTransmission() == 0) {
            Serial.print("Found: 0x");
            Serial.println(i, HEX);
        }
    }
}

void loop() {}

Související

  • I2C komunikace
  • biosignály
  • digitální filtrace

Dokumentace