INFORMACIÓN
El Sensor Oxímetro y Frecuencia Cardiaca MAX30102 permite medir señales relacionadas con la oximetría de pulso y la frecuencia cardíaca mediante LED internos, fotodetectores y electrónica de bajo ruido. Se comunica mediante interfaz I²C y cuenta con un pin de interrupción configurable. Es compatible con conectores DevLab, Qwiic y STEMMA QT. Incluye 4 header macho y un arnés JST 1mm para conexión Qwiic.
El Sensor Oxímetro y Frecuencia Cardiaca MAX30102 cuenta con un tamaño compacto y bajo consumo de energía, es ideal para dispositivos vestibles, aplicaciones fitness, smartphones y proyectos embebidos de monitoreo biométrico. Es ideal para el uso en proyectos donde se requiere detectar cambios asociados al flujo sanguíneo mediante técnicas ópticas, como en aplicaciones de salud, bienestar, actividad física y monitoreo portátil.
ESPECIFICACIONES Y CARACTERÍSTICAS
- Marca: UNIT Electronics
- País de origen: Hecho en México
- IC:MAX30102
- Tipo: Sensor oxímetro y sensor de frecuencia cardiaca
-
Voltaje de suministro: 3.3V
- Frecuencia de operación: 400 kHz
-
Interfaz: I2C (0x57)
- Temperatura de funcionamiento: -40°C a +85°C
-
Tipo de conector: JST 1,0 mm 4 pines
- Dimensiones:27.94mm x 15.92 mm
- Peso: 3.9 g
DOCUMENTACIÓN Y RECURSOS
INFORMACIÓN ADICIONAL
Test de prueba
A continuación te presentamos una conexión del sensor de luz ambiental con la tarjeta Pulsar C6 realizando la conexión con el arnés JST.

Adicional se requerirá descargar la librería DevLab_MAX30102

El siguiente código mostrara el resultado en del sensor que posterior a 100 muestras detectadas arrojara información del pulso cardiaco, para posteriormente evaluar tu oxigenación las variables utilizadas en el monitor serial serán:
- Valores del sensor IR, Led RED, AC.
- Valor instantáneo y promedio de los pulsos cardiacos: BMP inst y avg
- Posterior al muestreo se visualizara la oxigenación: SpO2
/* Experimental example only. Not for medical diagnosis. */
#include <Wire.h>
#include "DevLab_MAX30102.h"
#include "spo2_algorithm.h"
#define SDA_PIN 6
#define SCL_PIN 7
#define SPO2_SAMPLES 100
MAX30105 sensor;
// Medición BPM
const byte RATE_SIZE = 8; //Para mejorar la velocidad de respuesta de la lectura del sensor cambia de 8 a 4
float rates[RATE_SIZE];
byte rateSpot = 0;
byte validRates = 0;
float bpmInst = 0;
float bpmAvg = 0;
unsigned long lastBeatTime = 0;
bool wasAbove = false;
float irDC = 0;
float pulseSignal = 0;
float threshold = 80;
// Medición SpO2
uint32_t irBuffer[SPO2_SAMPLES];
uint32_t redBuffer[SPO2_SAMPLES];
byte spo2Index = 0;
int32_t spo2;
int8_t validSPO2;
int32_t dummyHR;
int8_t dummyValidHR;
float spo2Avg = 0;
int lastValidSpO2 = 0;
bool spo2Ready = false;
//Umbrales de señales
const long FINGER_THRESHOLD = 8000;
const long SIGNAL_LOW = 25000;
const long SIGNAL_GOOD_MAX = 110000;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println(F("==============================================="));
Serial.println(F(" MAX30102 - BPM + SpO2 "));
Serial.println(F("==============================================="));
Serial.println(F("Esto no es un dispositivo medico"));
Serial.println();
Wire.begin(SDA_PIN, SCL_PIN);
if (!sensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println(F("MAX30102 no detectado"));
while (1);
}
sensor.setup(
50, // LED brightness
4, // Sample average
2, // RED + IR
100, // Sample rate: 100 Hz
411, // Pulse width
16384 // ADC range
);
sensor.setPulseAmplitudeRed(0x50); // Puedes utilizar un valor entre (0x24) a (0x80) para mejorar la lectura del Led
sensor.setPulseAmplitudeIR(0x50); //Puedes utilizar un valor entre (0x24) a (0x80) para mejorar la detección del sensor IR
sensor.setPulseAmplitudeGreen(0);
Serial.println(F("Por favor coloque su dedo indice en el sensor."));
Serial.println(F("Presionar y dejar colocado su dedo por 10 a 20 segundos"));
Serial.println();
}
void loop() {
long irValue = sensor.getIR();
long redValue = sensor.getRed();
if (irValue < FINGER_THRESHOLD) {
Serial.println(F("No se detecto dedo"));
bpmInst = 0;
bpmAvg = 0;
validRates = 0;
rateSpot = 0;
lastValidSpO2 = 0;
spo2Avg = 0;
spo2Ready = false;
spo2Index = 0;
irDC = 0;
threshold = 80;
wasAbove = false;
delay(300);
return;
}
String signalQuality;
if (irValue < SIGNAL_LOW) {
signalQuality = "Low";
} else if (irValue < SIGNAL_GOOD_MAX) {
signalQuality = "Good";
} else {
signalQuality = "Saturated";
}
bool signalUsableForSpO2 =
(irValue >= SIGNAL_LOW && irValue < SIGNAL_GOOD_MAX);
if (irDC == 0) {
irDC = irValue;
}
irDC = (irDC * 0.95) + (irValue * 0.05);
pulseSignal = irValue - irDC;
float absSignal = fabs(pulseSignal);
threshold = (threshold * 0.95) + (absSignal * 0.05);
bool isAbove = pulseSignal > threshold * 0.6;
if (isAbove && !wasAbove) {
unsigned long now = millis();
unsigned long delta = now - lastBeatTime;
if (delta > 300 && delta < 1500) {
bpmInst = 60000.0 / delta;
if (bpmInst >= 45 && bpmInst <= 160) {
rates[rateSpot++] = bpmInst;
rateSpot %= RATE_SIZE;
if (validRates < RATE_SIZE) {
validRates++;
}
float sum = 0;
for (byte i = 0; i < validRates; i++) {
sum += rates[i];
}
bpmAvg = sum / validRates;
}
}
lastBeatTime = now;
}
wasAbove = isAbove;
if (millis() - lastBeatTime > 3000) {
bpmInst = 0;
}
irBuffer[spo2Index] = irValue;
redBuffer[spo2Index] = redValue;
spo2Index++;
if (spo2Index >= SPO2_SAMPLES) {
maxim_heart_rate_and_oxygen_saturation(
irBuffer,
SPO2_SAMPLES,
redBuffer,
&spo2,
&validSPO2,
&dummyHR,
&dummyValidHR
);
if (validSPO2 &&
spo2 >= 60 &&
spo2 <= 100 &&
signalUsableForSpO2) {
lastValidSpO2 = spo2;
if (!spo2Ready) {
spo2Avg = spo2;
spo2Ready = true;
} else {
spo2Avg = (spo2Avg * 0.85) + (spo2 * 0.15);
}
}
spo2Index = 0;
}
String spo2Status = "OK";
if (spo2Ready && spo2Avg < 90) {
spo2Status = "LOW/Check";
} else if (!signalUsableForSpO2) {
spo2Status = "Signal not ideal";
}
char line[240];
if (spo2Ready) {
snprintf(
line,
sizeof(line),
"IR:%6ld | RED:%6ld | AC:%8.1f | "
"BPM inst:%6.1f | BPM avg:%6.1f | "
"SpO2:%5.1f%% | Status:%-16s | Signal:%s",
irValue,
redValue,
pulseSignal,
bpmInst,
bpmAvg,
spo2Avg,
spo2Status.c_str(),
signalQuality.c_str()
);
} else {
snprintf(
line,
sizeof(line),
"IR:%6ld | RED:%6ld | AC:%8.1f | "
"BPM inst:%6.1f | BPM avg:%6.1f | "
"SpO2: --- | Status:%-16s | Signal:%s",
irValue,
redValue,
pulseSignal,
bpmInst,
bpmAvg,
spo2Status.c_str(),
signalQuality.c_str()
);
}
Serial.println(line);
delay(10);
}
Para visualizar la información en el monitor serial tendrás que habilitar USB CDC On Boot : ENABLE (Barra de herramientas >Tools) y los bauds para visualizar la información son a 115200 bauds. El resultado será el siguiente:

Aplicaciones
- Prototipado: Permite desarrollar y probar ideas rápidamente.
- Educación: Adecuado para aprender a utilizar sensores prácticos en tus proyectos.
- Wearables: Compacto y versátil para dispositivos portátiles o vestibles.



























Valoraciones
No hay valoraciones aún.