Подключение пульсоксиметра и датчика сердечного ритма MAX30102 к Arduino

Подключение пульсоксиметра и датчика сердечного ритма MAX30102 к Arduino

Создаёте ли вы фитнес-трекер, разрабатываете носимое устройство для мониторинга здоровья или просто интересуетесь, как бьётся ваше сердце — MAX30102 представляет собой компактный и мощный датчик, который предоставляет биометрические данные в реальном времени буквально на кончиках ваших пальцев. Этот маломощный модуль с интерфейсом I2C способен измерять как частоту сердечных сокращений, так и уровень кислорода в крови (SpO2).

Благодаря простому интерфейсу и широкой доступности MAX30102 является отличным инструментом для студентов, любителей электроники, инженеров, преподавателей и даже мобильных разработчиков и разработчиков игр, которые хотят добавить в свои проекты данные о здоровье в реальном времени.

В этом практическом руководстве вы узнаете, как работает датчик MAX30102, как подключить его к Arduino, и рассмотрите несколько практических примеров, включая обнаружение присутствия, измерение температуры, частоты сердечных сокращений и уровня кислорода в крови.

Давайте начнём и воплотим ваш проект мониторинга здоровья в жизнь — удар за ударом!

Обзор оборудования модуля MAX30102

В основе модуля лежит MAX30102 — небольшой, но мощный датчик от Analog Devices, предназначенный для измерения частоты сердечных сокращений и уровня кислорода в крови (SpO2). Этот датчик является улучшенной версией более старого `MAX30100 `_.

Датчик включает в себя:

  • Два специальных светодиода — красный и инфракрасный (ИК) — для направления света в кожу

  • Фотодетектор — для измерения отражённого света

  • Специальную оптику и обработку сигналов — для обеспечения точности показаний

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Этот датчик часто встречается в устройствах мониторинга здоровья, таких как фитнес-трекеры и умные часы, благодаря его компактности, надёжности и энергоэффективности.

Требования к питанию

MAX30102 требует два разных напряжения для работы: 1,8 вольт для основного чипа и 3,3 вольта для красного и ИК-светодиодов. К счастью, модуль оснащён встроенными стабилизаторами напряжения, поэтому вам не нужно обеспечивать оба напряжения отдельно.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

На обратной стороне платы есть небольшая паяльная перемычка, которая позволяет выбрать между логическими уровнями 3,3V или 1,8V. Это важно при подключении к различным типам микроконтроллеров. По умолчанию установлено 3,3V, что подходит для популярных микроконтроллеров, таких как Arduino или ESP32. Вы можете изменить эту настройку, если ваш микроконтроллер использует логику 1,8V.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Одна из лучших особенностей MAX30102 — его низкое энергопотребление. При нормальной работе он потребляет менее 600 мкА, а в режиме ожидания — всего 0,7 мкА, что делает его идеальным для устройств с батарейным питанием.

Встроенный датчик температуры

MAX30102 также имеет встроенный датчик температуры. Это помогает повысить точность измерений сердечного ритма и уровня кислорода в крови, компенсируя изменения окружающей температуры.

Этот датчик температуры достаточно точен. Он может измерять внутреннюю температуру чипа (также называемую температурой кристалла) в диапазоне от -40°C до +85°C с точностью ±1°C.

Интерфейс I2C

Для связи с микроконтроллером MAX30102 использует простой двухпроводный интерфейс I2C.

Датчик имеет фиксированный адрес для этой связи:

  • 0xAE для записи данных

  • 0xAF для чтения данных

Буфер FIFO

MAX30102 собирает данные быстрее, чем микроконтроллер может их обработать. Это может привести к проблемам, например, к потере важных данных, если микроконтроллер не готов вовремя их прочитать. Для предотвращения этого MAX30102 имеет специальную область памяти, называемую буфером FIFO (First In, First Out — «первым вошёл, первым вышел»). Этот буфер работает как временное хранилище. Он позволяет датчику продолжать сбор данных о частоте сердечных сокращений и уровне кислорода в крови, даже если микроконтроллер занят другой задачей. Позже, когда микроконтроллер будет готов, он может прочитать сохранённые измерения из буфера.

Буфер FIFO MAX30102 может хранить до 32 наборов измерений. Это даёт микроконтроллеру достаточно времени для завершения других задач перед возвратом за данными.

Прерывания

MAX30102 поддерживает функцию прерываний, позволяющую датчику отправлять оповещения микроконтроллеру при наступлении определённых событий. Существует пять различных типов оповещений:

  • Power Ready: Сигнализирует, когда датчик включился или восстановился после просадки питания (brownout).

  • Новые данные готовы: Сигнализирует каждый раз, когда получена новая выборка сердечного ритма или уровня кислорода в крови.

  • Компенсация фонового освещения: Предупреждает, когда фоновое освещение слишком сильное и мешает измерениям.

  • Температура готова: Сигнализирует, когда завершено измерение внутренней температуры кристалла.

  • FIFO почти заполнен: Предупреждает, когда FIFO почти заполнен и новые данные могут быть потеряны.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Эти оповещения отправляются через специальный вывод INT, который обычно находится в состоянии HIGH. При возникновении прерывания вывод переходит в LOW и остаётся в этом состоянии до тех пор, пока микроконтроллер не проверит и не сбросит прерывание.

Технические характеристики

Вот технические характеристики:

Подробную информацию о датчике MAX30102 можно найти в техническом описании.

Как работает пульсоксиметр и датчик сердечного ритма MAX30102?

MAX30102 — это оптический датчик, который измеряет частоту сердечных сокращений и уровень кислорода в крови с помощью света. Он имеет два специальных светодиода — красный и инфракрасный (ИК) — и фотодетектор.

Вы можете задаться вопросом, зачем этому датчику нужны два разных цвета света. Причина в том, что эти световые лучи имеют разные длины волн: красный свет имеет длину волны 660 нанометров, а инфракрасный — 880 нанометров. Благодаря разным длинам волн они по-разному взаимодействуют с нашей кровью, что помогает датчику выполнять два различных измерения.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

MAX30102 работает, направляя оба луча света на тонкую часть тела, например, на кончик пальца или мочку уха. Эти области идеальны, потому что кожа достаточно тонкая, чтобы свет легко проникал. Когда свет проходит через кожу, часть его поглощается кровью, а остальная часть отражается обратно. Фотодетектор на датчике измеряет, сколько света вернулось. Этот процесс известен как `фотоплетизмография (PPG) `_ — по сути, это измерение изменений объёма крови с помощью света.

MAX30102 выполняет две основные функции: измерение частоты сердечных сокращений и уровня кислорода в крови (SpO2).

Измерение частоты сердечных сокращений

Кровь переносит кислород с помощью белка, называемого гемоглобином. Когда гемоглобин несёт кислород (так называемый оксигемоглобин, или HbO2), он поглощает больше инфракрасного света.

Каждый раз, когда сердце сокращается, свежая богатая кислородом кровь поступает в палец. Поскольку эта кровь содержит много оксигемоглобина, она поглощает больше инфракрасного света. Это означает, что меньше инфракрасного света отражается обратно к фотодетектору.

Между ударами сердца в пальце чуть меньше оксигенированной крови, поэтому меньше инфракрасного света поглощается и больше света достигает детектора.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Непрерывно излучая инфракрасный свет и измеряя эти изменения в количестве обнаруженного света, датчик может видеть паттерн, соответствующий вашему сердцебиению. Он подсчитывает эти «импульсы» изменяющейся интенсивности света, чтобы вычислить, сколько раз ваше сердце бьётся в минуту — вашу частоту сердечных сокращений!

Измерение уровня кислорода в крови (пульсоксиметрия)

Для измерения уровня кислорода в крови MAX30102 хитроумно использует оба луча — красный и инфракрасный. Ключевая идея заключается в том, что оксигемоглобин (HbO2) и дезоксигемоглобин (Hb) поглощают свет по-разному:

  • Оксигемоглобин поглощает больше инфракрасного света (880nm)

  • Дезоксигемоглобин поглощает больше красного света (660nm)

На графике спектра поглощения ниже показано, как оксигемоглобин и дезоксигемоглобин поглощают различные длины волн света с разной интенсивностью.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Сравнивая, сколько красного и инфракрасного света поглощается, MAX30102 может рассчитать, какой процент вашего гемоглобина несёт кислород. Этот процент и есть ваш уровень SpO2, который показывает, насколько хорошо ваша кровь насыщена кислородом.

Распиновка модуля MAX30102

Давайте подробнее рассмотрим назначение каждого вывода:

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

VIN — это вывод питания. Его можно подключить к 3,3V или 5V, в зависимости от логического уровня вашего микроконтроллера.

SCL — вывод тактирования, используемый для связи по I2C.

SDA — вывод данных, используемый для связи по I2C.

INT — вывод прерывания. MAX30102 можно настроить на генерацию прерывания при наступлении определённых событий, как описано выше. Этот вывод обычно находится в состоянии HIGH, но переходит в LOW при возникновении прерывания и остаётся в нём до тех пор, пока микроконтроллер не прочитает и не сбросит прерывание.

IRD — подключение земли для инфракрасного светодиода внутри модуля. К этому выводу ничего подключать не нужно — он обслуживается внутренне микросхемой.

RD — аналогично IRD, это подключение земли для красного светодиода внутри модуля. Оставьте этот вывод неподключённым.

GND — это вывод заземления.

Подключение модуля MAX30102 к Arduino

Теперь, когда мы изучили всё о модуле MAX30102, пора подключить его к Arduino и запустить!

Сначала подключите вывод VIN модуля к источнику питания 3,3V или 5V. Напряжение должно соответствовать логическому уровню вашего Arduino — большинство используют 5V, но если вы используете плату на 3,3V, используйте 3,3V. Затем подключите вывод GND к земле Arduino.

Далее подключите вывод SCL на датчике к выводу SCL на Arduino, а SDA — к SDA. На большинстве плат Arduino (например, Uno) это те же выводы, что и A5 (SCL) и A4 (SDA).

Оставьте выводы IRD и RD неподключёнными.

Вот краткая справочная таблица подключений:

MAX30102 ModuleArduino
VCC5V
GNDGND
SCLSCL or A5
SDASDA or A4

На схеме ниже показано, как именно всё подключить:

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Установка библиотеки

Связь с MAX30102 была бы довольно сложной, если бы нам пришлось писать весь код самостоятельно. К счастью, `SparkFun Electronics `_ создали полезную библиотеку, которая значительно упрощает задачу.

Для установки библиотеки:

  1. Сначала откройте Arduino IDE. Затем нажмите на значок Менеджера библиотек на левой боковой панели.

  2. Введите «MAX3010x» в строке поиска для фильтрации результатов.

  3. Найдите SparkFun MAX3010x Pulse and Proximity Sensor Library от SparkFun Electronics.

  4. Нажмите кнопку Install, чтобы добавить её в Arduino IDE.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

После установки библиотеки вы готовы писать код и начать сбор данных с датчика.

Пример 1 — Чтение необработанных значений красного и ИК-света

Первый пример показывает, как считывать необработанные значения инфракрасного (ИК) и красного света с датчика.

#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("]");
}

После загрузки кода на Arduino откройте монитор последовательного порта. Направьте датчик вверх и проведите рукой над ним. Вы заметите, что числа меняются по мере того, как ваша рука отражает разное количество света обратно к датчику.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Визуализация данных

Просто смотреть на числа может быть неудобно. Лучший способ понять, что происходит — увидеть данные в виде графика с помощью Serial Plotter в Arduino IDE.

Для этого замените функцию loop() в вашем скетче на версию ниже:

void loop() {
  Serial.print(particleSensor.getRed());
  Serial.print(", ");
  Serial.println(particleSensor.getIR());
}

В Arduino IDE выберите Tools > Serial Plotter. Когда вы проведёте рукой над датчиком, вы увидите две линии на графике — одну для красного света и одну для инфракрасного. Этот график значительно упрощает понимание того, как датчик реагирует на движения вашей руки.

Теперь попробуйте аккуратно приложить палец к датчику. Вы увидите живой график вашего сердцебиения на экране.

Пример 2 — Измерение частоты сердечных сокращений (BPM)

Одна из самых интересных вещей, которые можно сделать с MAX30102 — это измерить частоту сердечных сокращений в ударах в минуту (BPM).

Предупреждение:

Этот датчик использует свет для обнаружения пульса. Многие факторы могут повлиять на показания, такие как движение или положение пальца. Поэтому он отлично подходит для обучения и экспериментов, но не является надёжным для медицинского использования.

#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(9600);
  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();
}

После загрузки скетча на Arduino аккуратно приложите палец к датчику и держите его как можно неподвижнее. Подождите несколько секунд, пока датчик собирает данные. Вскоре вы увидите частоту сердечных сокращений в мониторе последовательного порта.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Проблемы с обнаружением сердцебиения?

Если датчик не обнаруживает ваше сердцебиение правильно, не волнуйтесь! Вот несколько простых способов решения:

  • Не нажимайте на датчик слишком сильно. Если вы слишком сжимаете палец, это препятствует нормальному кровотоку.

  • Не нажимайте слишком слабо. Это может пропускать лишний свет и создавать зашумлённый сигнал.

  • Попробуйте найти «правильное» давление — как если бы вы аккуратно держали монету между пальцами.

  • Попробуйте использовать резинку или скотч, чтобы удерживать палец на датчике неподвижно.

  • Попробуйте другие части тела с тонкой кожей и хорошим кровообращением, например, мочку уха или нижнюю губу.

Пример 3 — Измерение уровня кислорода в крови (SpO2)

Этот пример использует MAX30102 для измерения уровня кислорода в крови (SpO2). Он показывает, сколько кислорода содержится в вашей крови, что обычно составляет от 95% до 100% у здоровых людей. Попробуйте запустить этот скетч.

#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(9600);  // initialize serial communication at 9600 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);
  }
}

После загрузки скетча на Arduino приложите палец к датчику. Не двигайтесь и подождите несколько секунд, пока датчик собирает данные. Показания SpO2 появятся в мониторе последовательного порта, когда датчик накопит достаточно данных для расчёта SpO2.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Пример 4 — Измерение температуры

Как упоминалось ранее, MAX30102 имеет встроенный датчик температуры, который измеряет внутреннюю температуру чипа (температуру кристалла). Хотя этот датчик в основном помогает корректировать (калибровать) показания сердечного ритма и SpO2 с учётом изменений температуры, он также хорошо работает как быстрый термометр.

Этот пример выводит температуру в градусах Цельсия и Фаренгейта.

#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();
}

После запуска скетча попробуйте приложить палец к датчику или слегка подуть на него. Вы должны увидеть небольшое повышение температуры.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

Пример 5 — Обнаружение присутствия

В этом финальном примере вы узнаете, как использовать MAX30102 в качестве датчика приближения или движения.

Вот как это работает: скетч выполняет несколько измерений в начале (во время setup) и усредняет их для установки базовой линии. После этого он постоянно проверяет наличие резких изменений относительно этой базовой линии. Когда что-то перемещается над датчиком — например, ваша рука — он выведет: «Something is there!»

#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();
}

Попробуйте загрузить этот скетч и провести рукой над датчиком. Наблюдайте за сообщением «Something is there!» в мониторе последовательного порта. Вы также можете проверить, на каком расстоянии ваша рука ещё может быть обнаружена.

Interfacing MAX30102 Pulse Oximeter and Heart Rate Sensor with Arduino

MAX30102 невероятно чувствителен — он может обнаруживать мельчайшие движения, потому что способен различать до 262 144 уровней (18 бит) света. Это впечатляющая точность для обнаружения близлежащих объектов!