En el mundo de la electrónica y la tecnología, la posibilidad de conectar dispositivos y sensores a placas de desarrollo como Arduino abre un sinfín de posibilidades para la creación de proyectos innovadores. En este artículo, exploraremos cómo conectar el oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 a Arduino para poder medir de forma precisa y sencilla la saturación de oxígeno en la sangre y la frecuencia cardíaca. ¡Descubre cómo realizar esta conexión y comienza a crear tus propios dispositivos de monitoreo de salud!
El oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 es un sensor biométrico plug-and-play de bajo consumo basado en I2C. Puede ser utilizado por estudiantes, aficionados, ingenieros, fabricantes y desarrolladores de juegos y dispositivos móviles que deseen incorporar datos de frecuencia cardíaca en vivo en sus proyectos.
Descripción general del hardware del módulo MAX30102
El módulo cuenta con el MAX30102, un IC moderno (sucesor del MAX30100) con oxímetro de pulso integrado y sensor de frecuencia cardíaca de Analog Devices. Combina dos LED, un fotodetector, óptica optimizada y procesamiento de señales analógicas de bajo ruido para detectar señales de oximetría de pulso (SpO2) y frecuencia cardíaca (FC).
Detrás de la ventana, en un lado, el MAX30102 tiene dos LED: un LED ROJO y un LED IR. Del otro lado hay un fotodetector muy sensible. La idea es encender un solo LED a la vez para detectar la cantidad de luz reflejada hacia el detector y usar la firma para medir los niveles de oxígeno en sangre y la frecuencia cardíaca.
Requisitos de energía
El chip MAX30102 requiere dos voltajes de suministro diferentes: 1,8 V para el IC y 3,3 V para los LED ROJO e IR. Por tanto el módulo dispone de reguladores de 3,3V y 1,8V.
En la parte posterior de la placa encontrará un puente de soldadura que le permite elegir entre niveles lógicos de 3,3 V y 1,8 V. De forma predeterminada, se selecciona un nivel lógico de 3,3 V, que es compatible con los niveles lógicos de Arduino. Sin embargo, también puede elegir un nivel lógico de 1,8 V según sus necesidades. Esto le permite conectar el módulo a cualquier microcontrolador con niveles de 5V, 3.3V o incluso 1.8VE/A.
Una de las características más importantes del MAX30102 es su bajo consumo de energía: el MAX30102 consume menos de 600 μA durante las mediciones. También es posible poner el MAX30102 en modo de espera, donde sólo consume 0,7 μA. Este bajo consumo energético permite su implementación en dispositivos que funcionan con baterías como teléfonos móviles, wearables o relojes inteligentes.
Sensor de temperatura en chip
El MAX30102 cuenta con un sensor de temperatura en chip que se puede utilizar para compensar cambios ambientales y calibrar mediciones.
Este es un sensor de temperatura razonablemente preciso que mide la “temperatura del chip” en el rango de -40°C a +85°C con una precisión de ±1°C.
interfaz I2C
El módulo utiliza una interfaz I2C simple de dos cables para comunicarse con el microcontrolador. Tiene una dirección I2C fija: 0xAEMALEFICIO (para operación de escritura) y 0xAFMALEFICIO (para el proceso de lectura).
Búfer FIFO
El MAX30102 integra un búfer FIFO para almacenar muestras de datos. El FIFO tiene un banco de memoria de 32 muestras, lo que significa que puede almacenar hasta 32 muestras de SpO2 y frecuencia cardíaca. El búfer FIFO puede liberar al microcontrolador de la lectura de cada nuevo patrón de datos del sensor, ahorrando energía al sistema.
Interrumpe
El MAX30102 se puede programar para generar una interrupción, lo que permite que el microcontrolador host realice otras tareas mientras se recopilan datos del sensor. La interrupción se puede activar para 5 fuentes diferentes:
- Listo para el poder: Se activa cuando se enciende o después de un corte de energía.
- Nuevos datos listos: Se activa después de recopilar cada muestra de datos de SpO2 y FC.
- Supresión de luz ambiental: Se activa cuando la función de supresión de luz ambiental del fotodiodo SpO2/HR alcanza su límite máximo, lo que afecta la salida del ADC.
- temperatura lista: Se activa cuando se completa una conversión de temperatura interna del chip.
- FIFO casi lleno: Se activa cuando el FIFO está lleno y se pierden datos futuros.
La línea INT es una línea de drenaje abierta y, por lo tanto, la resistencia integrada la eleva a ALTO. Cuando ocurre una interrupción, el pin INT pasa a BAJO y permanece BAJO hasta que se borra la interrupción.
Especificaciones técnicas
Aquí están las especificaciones técnicas:
Fuente de alimentación | 3,3 V a 5,5 V |
Consumo de corriente | ~600μA (durante las mediciones) |
~0,7μA (en modo de espera) | |
Longitud de onda del LED rojo | 660 nanómetro |
Longitud de onda del LED infrarrojo | 880 nanómetro |
Rango de temperatura | -40 ˚C a +85 ˚C |
Precisión de temperatura | ±1˚C |
Puede encontrar información detallada sobre el sensor MAX30102 en la hoja de datos.
¿Cómo funciona el oxímetro de pulso y sensor de frecuencia cardíaca MAX30102?
El MAX30102 o cualquier otro pulsioxímetro óptico y sensor de frecuencia cardíaca consta de un par de LED de alta intensidad (ROJO e IR, ambos con diferentes longitudes de onda) y un fotodetector. Las longitudes de onda de estos LED son 660 nm y 880 nm respectivamente.
El MAX30102 envía ambas luces al dedo o al lóbulo de la oreja (o prácticamente a cualquier lugar donde la piel no sea demasiado gruesa para que ambas luces puedan penetrar fácilmente el tejido) y mide la cantidad de luz reflejada usando un fotodetector. Este método se llama detección de pulso por luz. Fotopletismograma.
El funcionamiento del MAX30102 se puede dividir en dos partes: medición de la frecuencia cardíaca y oximetría de pulso (midiendo el nivel de oxígeno en la sangre).
Medición de frecuencia cardíaca
La hemoglobina oxigenada (HbO2) de la sangre arterial tiene la propiedad de absorber la luz IR. Cuanto más roja es la sangre (cuanto mayor es el nivel de hemoglobina), más luz IR se absorbe. A medida que la sangre se bombea a través del dedo con cada latido del corazón, la cantidad de luz reflejada cambia, creando una forma de onda cambiante en la salida del fotodetector. A medida que continúe iluminando y tomando medidas con el fotodetector, recibirá rápidamente una medición del pulso de la frecuencia cardíaca.
Oximetría de pulso
La oximetría de pulso se basa en el principio de que la cantidad de luz ROJA e IR absorbida varía según la cantidad de oxígeno en la sangre. El siguiente gráfico muestra el espectro de absorción de la hemoglobina oxigenada (HbO2) y la hemoglobina libre de oxígeno (Hb).
Como puede ver en el gráfico, la sangre desoxigenada absorbe más luz ROJA (660 nm), mientras que la sangre oxigenada absorbe más luz IR (880 nm). Midiendo la proporción de luz IR y ROJA recibida por el fotodetector, se calcula el nivel de oxígeno (SpO2) en la sangre.
¿Sabías?
La medición de la saturación de oxígeno de la hemoglobina (HbO2) mediante la medición de la absorción de luz roja e infrarroja fue introducida en 1935 por un médico alemán, Karl Matthes.
Como inicialmente no existían buenos fotodetectores, se utilizó la banda verde del espectro luminoso en lugar de la banda IR. A medida que avanzó la tecnología, se desarrollaron métodos más confiables y la luz verde fue reemplazada por luz IR.
Configuración de pines del módulo MAX30102
El módulo MAX30102 resalta las siguientes conexiones.
Número de chasis es el pin de alimentación. Puedes conectarlo a la salida de 3,3V o 5V de tu Arduino.
SCL es el pin del reloj I2C, conéctalo a la línea de reloj I2C de tu Arduino.
ASD es el pin de datos I2C, conéctalo a la línea de datos I2C de tu Arduino.
EN T El MAX30102 se puede programar para generar una interrupción por cada pulso. Esta línea es de drenaje abierto y, por lo tanto, la resistencia integrada la lleva a ALTO. Cuando ocurre una interrupción, el pin INT pasa a BAJO y permanece BAJO hasta que se borra la interrupción.
IRD El MAX30102 integra un controlador LED para generar pulsos LED para mediciones de SpO2 y FC. Utilice esta opción si desea controlar el LED IR usted mismo; de lo contrario, déjelo desconectado.
RD El pin es similar al pin IRD pero se usa para controlar el LED rojo. Si no desea controlar el LED rojo usted mismo, déjelo desconectado.
Tierra es el piso.
Cableado de un módulo MAX30102 a un Arduino
Ahora que sabemos todo sobre el módulo, ¡podemos empezar a conectarlo a nuestro Arduino!
Comience conectando el pin VCC a la fuente de alimentación. 3V-5V está bien. Utilice el mismo voltaje en el que se basa la lógica de su microcontrolador. Para la mayoría de los Arduinos, esto es 5V. Para dispositivos lógicos de 3,3 V, utilice 3,3 V. Ahora conecte GND a tierra común.
Conecte el pin SCL al pin de reloj I2C y el pin SDA al pin de datos I2C de su Arduino. Tenga en cuenta que cada placa Arduino tiene diferentes pines I2C que deben conectarse en consecuencia. En las placas Arduino con diseño R3, SDA (línea de datos) y SCL (línea de reloj) se encuentran en los encabezados cerca del pin AREF. También se les conoce como A5 (SCL) y A4 (SDA).
La siguiente figura muestra el cableado.
Instalación de biblioteca
Hay varias bibliotecas disponibles para el sensor MAX30102. Sin embargo, en nuestro ejemplo utilizamos el One by Electrónica SparkFun. Esta biblioteca proporciona la mayoría de las funciones del MAX30102 y proporciona funciones simples y fáciles de usar para calcular la frecuencia del pulso y la SpO2. Puede descargar esta biblioteca a través del Administrador de biblioteca IDE de Arduino.
Para instalar la biblioteca, navegue hasta Sketch > Incluir biblioteca > Administrar bibliotecas…. Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.
Filtra tu búsqueda escribiendo MAX3010x. Buscar Sensor de pulso y proximidad SparkFun MAX3010x Biblioteca. Haga clic en esta entrada y luego seleccione Instalar.
MAX30102 Bocetos de ejemplo
La biblioteca SparkFun_MAX3010x tiene varios bocetos de ejemplo. Puede utilizar estos bocetos de ejemplo como base para desarrollar su propio código.
Para acceder a los bocetos de muestra, navegue hasta Archivo > Ejemplos > Biblioteca de sensores de proximidad y pulso SparkFun MAX3010x. Verá una selección de bocetos de muestra.
Ejemplo 1: lectura de rojo e IR
El primer ejemplo genera los valores brutos (lecturas de infrarrojos y rojo) leídos por el sensor. Cárgalo en tu Arduino y abre el terminal serie para ver los valores impresos.
#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;
void setup() {
Serial.begin(9600);
// Initialize sensor
if (particleSensor.begin() == false) {
Serial.println("MAX30102 was not found. Please check wiring/power.");
while (1);
}
particleSensor.setup(); //Configure sensor. Use 6.4mA for LED drive
}
void loop() {
Serial.print(" R[");
Serial.print(particleSensor.getRed());
Serial.print("] IR[");
Serial.print(particleSensor.getIR());
Serial.println("]");
}
Pase su mano sobre el sensor mientras el sensor está hacia arriba. Deberías notar un cambio en los valores porque tu mano refleja diferentes cantidades de luz.
Los datos seriales pueden ser difíciles de visualizar si solo nos fijamos en los valores. Si está utilizando Arduino IDE v1.6.6+, hay una opción para mostrar los datos en un gráfico Trazador serie Arduino.
Primero, reemplace loop() en el código anterior con este fragmento de código:
void loop() {
Serial.print(particleSensor.getRed());
Serial.print(", ");
Serial.println(particleSensor.getIR());
}
En el IDE de Arduino, seleccione «Herramientas > Trazador serie». Deberías ver una onda similar a la imagen de abajo cuando pasas la mano por el sensor.
Ejemplo 2: detección de presencia
Nuestro próximo experimento muestra cómo el sensor MAX30102 se puede utilizar como sensor de proximidad o reflectancia de uso general y puede servir como base para futuros experimentos y proyectos prácticos.
Este ejemplo funciona recopilando un puñado de mediciones durante la configuración y promediandolas. Este promedio se utiliza luego como valor base. Si el sensor detecta una desviación significativa del promedio, se imprime «¡Hay algo!». Prueba el boceto.
#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;
long samplesTaken = 0; //Counter for calculating the Hz or read rate
long unblockedValue; //Average IR at power up
long startTime; //Used to calculate measurement rate
void setup() {
Serial.begin(9600);
// Initialize sensor
if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) { //Use default I2C port, 400kHz speed
Serial.println("MAX30102 was not found. Please check wiring/power. ");
while (1);
}
//Setup to sense up to 18 inches, max LED brightness
byte ledBrightness = 0xFF; //Options: 0=Off to 255=50mA
byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32
byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
int sampleRate = 400; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
int pulseWidth = 411; //Options: 69, 118, 215, 411
int adcRange = 2048; //Options: 2048, 4096, 8192, 16384
//Configure sensor with these settings
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
particleSensor.setPulseAmplitudeRed(0); //Turn off Red LED
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
//Take an average of IR readings at power up
unblockedValue = 0;
for (byte x = 0 ; x < 32 ; x++) {
unblockedValue += particleSensor.getIR(); //Read the IR value
}
unblockedValue /= 32;
startTime = millis();
}
void loop() {
samplesTaken++;
Serial.print("IR[");
Serial.print(particleSensor.getIR());
Serial.print("] Hz[");
Serial.print((float)samplesTaken / ((millis() - startTime) / 1000.0), 2);
Serial.print("]");
long currentDelta = particleSensor.getIR() - unblockedValue;
Serial.print(" delta[");
Serial.print(currentDelta);
Serial.print("]");
if (currentDelta > (long)100) {
Serial.print(" Something is there!");
}
Serial.println();
}
Vuelva a pasar la mano por el sensor y busque el mensaje «¡Hay algo!» impreso en el terminal serie. Intente probar el rango en el que el sensor puede detectar algo.
Tenga en cuenta que el MAX30102 puede leer hasta 18 bits o valores hasta 262,144. ¡Se puede detectar un movimiento extremadamente pequeño!
Ejemplo 3: lectura de la temperatura
Nuestro siguiente ejemplo genera las lecturas del sensor de temperatura integrado tanto en grados Celsius como en Fahrenheit. Aunque la lectura de temperatura debe usarse para calibrar la frecuencia cardíaca y las mediciones de SpO2, puede resultar útil cuando necesita un sensor de temperatura sensible y de respuesta rápida.
#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;
void setup() {
Serial.begin(9600);
Serial.println("Initializing...");
// Initialize sensor
if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) { //Use default I2C port, 400kHz speed
Serial.println("MAX30102 was not found. Please check wiring/power. ");
while (1);
}
//The LEDs are very low power and won't affect the temp reading much but
//you may want to turn off the LEDs to avoid any local heating
particleSensor.setup(0); //Configure sensor. Turn off LEDs
particleSensor.enableDIETEMPRDY(); //Enable the temp ready interrupt. This is required.
}
void loop() {
float temperature = particleSensor.readTemperature();
Serial.print("temperatureC=");
Serial.print(temperature, 4);
float temperatureF = particleSensor.readTemperatureF();
Serial.print(" temperatureF=");
Serial.print(temperatureF, 4);
Serial.println();
}
Ahora intente calentar el sensor con el dedo o respire ligeramente sobre el sensor. Deberías ver algo como el resultado a continuación.
Ejemplo 4: medición de la frecuencia cardíaca (BPM)
¡Aquí es donde comienza la diversión! En este ejemplo, medimos la frecuencia cardíaca (latidos por minuto o BPM) de la persona que estamos monitoreando.
Advertencia:
Este boceto registra ópticamente la frecuencia cardíaca. Este método es difícil y puede dar lugar a lecturas incorrectas. Por lo tanto, NO lo utilice para diagnósticos médicos reales.
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(115200);
Serial.println("Initializing...");
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 was not found. Please check wiring/power. ");
while (1);
}
Serial.println("Place your index finger on the sensor with steady pressure.");
particleSensor.setup(); //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}
void loop() {
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true) {
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);
if (irValue < 50000)
Serial.print(" No finger?");
Serial.println();
}
Después de cargar el boceto, mantenga el dedo lo más quieto posible sobre el sensor y espere unos segundos hasta que las lecturas tengan sentido. Verás un resultado como este.
¿Tiene problemas para ver los latidos del corazón?
Si tiene problemas para detectar los latidos del corazón, esto es lo que puede hacer.
- Si sujetas el sensor con demasiada fuerza, exprimirás toda la sangre de tus dedos y ¡no habrá ninguna señal! Si lo mantiene demasiado ligero, se producirá ruido debido al movimiento y la luz ambiental. La presión de soldadura por puntos (ni demasiado fuerte ni demasiado suave) en el sensor de pulso produce una señal buena y limpia.
- Una presión diferente puede hacer que la sangre en el dedo fluya de manera diferente y que las lecturas del sensor sean incorrectas. Intente aplicar una presión constante asegurando el sensor a su dedo con una banda elástica u otro dispositivo tensor.
- Pruebe el sensor en diferentes partes de su cuerpo que tengan tejido capilar (por ejemplo, el lóbulo de la oreja o el labio inferior).
Ejemplo 5 – Medición de la saturación de oxígeno (SpO2)
En nuestro último ejemplo, medimos el nivel de oxígeno en sangre (SpO2) de la persona que estamos monitoreando. Prueba el boceto.
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
MAX30105 particleSensor;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno doesn't have enough SRAM to store 100 samples of IR led data and red led data in 32-bit format
//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples become 16-bit data.
uint16_t irBuffer[100]; //infrared LED sensor data
uint16_t redBuffer[100]; //red LED sensor data
#else
uint32_t irBuffer[100]; //infrared LED sensor data
uint32_t redBuffer[100]; //red LED sensor data
#endif
int32_t bufferLength; //data length
int32_t spo2; //SPO2 value
int8_t validSPO2; //indicator to show if the SPO2 calculation is valid
int32_t heartRate; //heart rate value
int8_t validHeartRate; //indicator to show if the heart rate calculation is valid
byte pulseLED = 11; //Must be on PWM pin
byte readLED = 13; //Blinks with each data read
void setup()
{
Serial.begin(115200); // initialize serial communication at 115200 bits per second:
pinMode(pulseLED, OUTPUT);
pinMode(readLED, OUTPUT);
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
Serial.println(F("MAX30105 was not found. Please check wiring/power."));
while (1);
}
Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));
while (Serial.available() == 0) ; //wait until user presses a key
Serial.read();
byte ledBrightness = 60; //Options: 0=Off to 255=50mA
byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32
byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
byte sampleRate = 100; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
int pulseWidth = 411; //Options: 69, 118, 215, 411
int adcRange = 4096; //Options: 2048, 4096, 8192, 16384
particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
}
void loop()
{
bufferLength = 100; //buffer length of 100 stores 4 seconds of samples running at 25sps
//read the first 100 samples, and determine the signal range
for (byte i = 0 ; i < bufferLength ; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so 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 after first 100 samples (first 4 seconds of samples)
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
//Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second
while (1)
{
//dumping the first 25 sets of samples in the memory and shift the last 75 sets of samples to the top
for (byte i = 25; i < 100; i++)
{
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
//take 25 sets of samples before calculating the heart rate.
for (byte i = 75; i < 100; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data
digitalWrite(readLED, !digitalRead(readLED)); //Blink onboard LED with every data read
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so move to next sample
//send samples and calculation result to terminal program through UART
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);
}
//After gathering 25 new samples recalculate HR and SP02
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
}
}
Después de cargar el boceto, mantenga el dedo lo más quieto posible sobre el sensor y espere unos segundos hasta que las lecturas tengan sentido. Verás un resultado como este.
Conexión del oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 a Arduino
Descripción del Hardware del Módulo MAX30102
El oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 es un sensor biométrico plug-and-play de bajo consumo basado en I2C. Combina dos LEDs, un fotodetector, ópticas optimizadas y procesamiento de señal analógica de bajo ruido para detectar la oximetría del pulso (SpO2) y las señales de frecuencia cardíaca (HR).
El modulo cuenta con el chip MAX30102 de Analog Devices, que integra dos LEDs (rojo e infrarrojo) situados detrás de una ventana, y un fotodetector muy sensible en el otro lado. Este diseño permite medir los niveles de oxígeno en la sangre y la frecuencia cardíaca.
Requisitos de Alimentación
El chip MAX30102 necesita dos voltajes de alimentación diferentes: 1.8V para el IC y 3.3V para los LEDs rojo e infrarrojo. El módulo incluye reguladores de voltaje de 3.3V y 1.8V. Se puede seleccionar entre lógica de 3.3V y 1.8V para conectar el módulo a microcontroladores con niveles de E/S de 5V, 3.3V e incluso 1.8V.
Interfaz I2C
El módulo utiliza una interfaz I2C de dos hilos para la comunicación con el microcontrolador. Tiene una dirección I2C fija: 0xAEHEX (para operaciones de escritura) y 0xAFHEX (para operaciones de lectura).
Funcionamiento del Sensor MAX30102
El MAX30102 funciona mediante la emisión de luces rojas e infrarrojas en el dedo o lóbulo de la oreja, midiendo la cantidad de luz reflejada con un fotodetector. Esta técnica se llama fotopletismografía y se utiliza para medir la frecuencia cardíaca y la oxigenación de la sangre.
Instalación de la Biblioteca
Existe una biblioteca de SparkFun Electronics para el sensor MAX30102 que permite acceder a la mayoría de sus funciones. Puedes descargar esta biblioteca desde el Administrador de Bibliotecas de Arduino.
Ejemplos de Código
La biblioteca SparkFun_MAX3010x incluye varios ejemplos de código para realizar diferentes funciones con el sensor MAX30102. Puedes utilizar estos ejemplos como base para desarrollar tu propio código.
- Ejemplo 1 – Lectura de Rojo e Infrarrojo: Este ejemplo muestra los valores crudos leídos por el sensor.
- Ejemplo 2 – Detección de Presencia: Muestra cómo utilizar el sensor como un sensor de proximidad o reflectancia.
- Ejemplo 3 – Lectura de Temperatura: Muestra cómo leer la temperatura con el sensor.
- Ejemplo 4 – Medición de la Frecuencia Cardíaca: Mide la frecuencia cardíaca (BPM) del usuario.
- Ejemplo 5 – Medición de la Saturación de Oxígeno: Mide el nivel de oxígeno en la sangre (SpO2) del usuario.
Conclusiones
El oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 es un sensor versátil que puede utilizarse en una amplia variedad de aplicaciones. Su bajo consumo de energía, interfaz I2C, y funciones avanzadas lo hacen ideal para proyectos de estudiantes, aficionados, ingenieros y desarrolladores de juegos y aplicaciones móviles. Con su capacidad para medir la frecuencia cardíaca y la oxigenación de la sangre en tiempo real, el MAX30102 ofrece un amplio abanico de posibilidades para la monitorización de la salud y el desarrollo de dispositivos portátiles.
Referencias:
– Datasheet del MAX30102: [Enlace](#)
– Biblioteca SparkFun MAX3010x Pulse and Proximity Sensor: [Enlace](#)
¡Explora todo el potencial del sensor MAX30102 y comienza a integrar mediciones en tiempo real de la frecuencia cardíaca y la oxigenación de la sangre en tus proyectos con Arduino!
¡Me encantó este tutorial! Realmente ayuda a entender cómo conectar el oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 a Arduino de manera clara y sencilla. ¡Gracias por compartir tu conocimiento! 🤩🔌
¡Interesante tutorial! Me encanta cómo explican paso a paso cómo realizar la conexión. ¡Definitivamente voy a probarlo en mi Arduino! 🤓👍
¡Qué genial este tutorial! Me encanta la forma en que explican cómo conectar estos dispositivos a Arduino, ¡definitivamente lo voy a probar en mi proyecto! 🤓🔧
Qué buen aporte, me parece súper útil para quienes quieren monitorear su frecuencia cardíaca de manera sencilla. ¡Gracias por compartir! 👌🏼🔋
¡Qué chévere este tutorial! Me parece muy útil y fácil de seguir para conectar el oxímetro de pulso y sensor de frecuencia cardíaca MAX30102 a Arduino. Definitivamente lo voy a probar en mi próximo proyecto. ¡Gracias por compartir! 🤓🔌👏