Создание монитора сердечного ритма Arduino: схемы и код
Для кого эта статья:
- Студенты и любители электроники, желающие освоить Arduino и медицинские технологии.
- Инженеры и разработчики, интересующиеся DIY-проектами в области здравоохранения.
Специалисты в области робототехники и программирования, стремящиеся улучшить свои навыки в создании медицинских устройств.
Создание собственного монитора сердечного ритма на Arduino — это не просто увлекательный DIY-проект, а настоящий шаг в мир персональной медицинской электроники. Представьте: вы собираете устройство, которое может отслеживать ваше сердцебиение во время тренировок, контролировать ваше состояние в периоды стресса или стать основой для более сложных проектов в области здравоохранения. От выбора правильного пульсометра до написания эффективного кода — каждый этап этого проекта открывает новые возможности для технического творчества и практического применения ваших навыков программирования. 💓🔧
Хотите углубить свои навыки программирования для работы с Arduino и другими платформами? Обучение Python-разработке от Skypro — идеальный шаг вперёд. Овладев Python, вы сможете создавать более сложные медицинские приложения, которые будут взаимодействовать с вашим Arduino-монитором сердечного ритма, анализировать данные и строить прогнозы. Python и Arduino — мощный тандем для любого разработчика медицинских гаджетов!
Основы мониторинга сердечного ритма с Arduino
Мониторинг сердечного ритма с помощью Arduino основан на принципе фотоплетизмографии — метода, измеряющего изменения объема крови через оптические датчики. Когда сердце сокращается, кровь перекачивается по телу, вызывая микроскопические изменения в оптических свойствах тканей, которые можно обнаружить с помощью светодиода и фотодиода или фототранзистора. 📊
Arduino в этой системе выполняет три ключевые функции:
- Подаёт питание на датчик пульса
- Считывает аналоговые значения с датчика через АЦП
- Обрабатывает полученные данные для расчёта частоты сердечных сокращений (ЧСС)
Существует два основных типа датчиков для измерения пульса, совместимых с Arduino:
| Тип датчика | Принцип работы | Преимущества | Недостатки |
|---|---|---|---|
| Оптические (PPG) | Измерение отраженного света от кровеносных сосудов | Простота установки, неинвазивность | Чувствительность к движению, влияние внешнего освещения |
| Электрические (ЭКГ) | Регистрация электрической активности сердца | Высокая точность, детальная информация | Сложность установки, требуются электроды |
Для начинающих оптимальным выбором является оптический датчик (например, популярный модуль Pulse Sensor или датчики на базе MAX30100/MAX30102), так как он прост в подключении и предоставляет достаточную точность для большинства DIY-проектов. 🔍
Антон Кравцов, инженер-электронщик по медицинскому оборудованию
Мой первый опыт создания монитора сердечного ритма на Arduino начался после того, как мне понадобилось недорогое решение для тестирования алгоритмов обработки ЭКГ-сигналов. Коммерческие устройства стоили тысячи долларов, а мне требовалась лишь базовая функциональность.
Я приобрёл Arduino Nano и простой датчик Pulse Sensor Amped. После нескольких часов подключения и калибровки я получил свой первый график сердцебиения на экране ноутбука. Качество сигнала меня удивило — с правильным расположением датчика на мочке уха я смог получить стабильные показания даже в движении.
Самым сложным оказалась фильтрация шумов. Пришлось добавить дополнительные конденсаторы и переработать алгоритм обработки сигнала, но результат превзошёл ожидания. Теперь этот самодельный прибор используется в нашей лаборатории для предварительного тестирования перед испытаниями на профессиональном оборудовании.

Необходимые компоненты и датчики для проекта
Для создания функционального монитора сердечного ритма вам потребуются как основные компоненты, так и дополнительные модули, которые расширят возможности вашего устройства. Давайте разберёмся, что именно нужно приобрести для успешного воплощения проекта. 🛒
Основные компоненты:
- Arduino (UNO, Nano или Pro Mini) — мозг вашей системы
- Датчик пульса (Pulse Sensor, MAX30100, MAX30102 или AD8232) — для считывания сердечного ритма
- Макетная плата и соединительные провода — для сборки прототипа
- USB-кабель — для программирования и питания Arduino
- Дисплей (LCD 16x2, OLED SSD1306) — для визуализации данных
- Резисторы (220 Ом, 10 кОм) — для стабильной работы схемы
- Конденсаторы (0.1 мкФ, 1 мкФ) — для фильтрации помех
Дополнительные компоненты для расширенной функциональности:
- Модуль Bluetooth HC-05 или ESP8266/ESP32 — для беспроводной передачи данных
- Модуль SD-карты — для сохранения долгосрочных измерений
- Аккумулятор Li-Po и контроллер зарядки — для мобильности устройства
- Кнопки или тактовые переключатели — для управления интерфейсом
- Зуммер или светодиоды — для звуковой и визуальной индикации
При выборе датчика пульса стоит учитывать особенности каждого типа, чтобы выбрать наиболее подходящий для ваших целей:
| Модель датчика | Тип | Интерфейс | Напряжение | Особенности | Цена (прибл.) |
|---|---|---|---|---|---|
| Pulse Sensor Amped | Оптический | Аналоговый | 3-5В | Простота использования, готовая библиотека | $12-25 |
| MAX30100 | Оптический | I2C | 1.8-3.3В | Измерение пульса и SpO2 | $3-8 |
| MAX30102 | Оптический | I2C | 1.8-3.3В | Улучшенная версия MAX30100, более точная | $5-12 |
| AD8232 | ЭКГ | Аналоговый | 3.3В | ЭКГ-подобный сигнал, требуются электроды | $15-30 |
Для начинающих рекомендую использовать Pulse Sensor Amped из-за его простоты и обилия учебных материалов. Для более продвинутых проектов с измерением кислорода в крови подойдёт MAX30102. Если же вам нужен максимально детализированный сигнал, стоит обратить внимание на модуль AD8232 для ЭКГ-мониторинга. 🧠
Схемы подключения пульсометра к Arduino
Правильное подключение датчика пульса к Arduino — ключевой шаг к созданию надёжного монитора сердечного ритма. Разберём несколько типовых схем подключения наиболее популярных датчиков. 🔌
Подключение Pulse Sensor Amped:
- Красный провод (VCC) → 5V на Arduino
- Чёрный провод (GND) → GND на Arduino
- Фиолетовый провод (Signal) → Аналоговый пин A0 на Arduino
Это базовая схема подключения, которая работает для большинства проектов. Для повышения стабильности сигнала рекомендую добавить фильтрующий конденсатор 1-10 мкФ между VCC и GND рядом с датчиком.
Подключение MAX30100/MAX30102 через I2C:
- VIN → 3.3V на Arduino (важно: эти датчики работают на 3.3V!)
- GND → GND на Arduino
- SCL → A5 на Arduino UNO/Nano (или соответствующий пин SCL)
- SDA → A4 на Arduino UNO/Nano (или соответствующий пин SDA)
- INT → Пин D2 на Arduino (опционально, для прерываний)
Если ваша Arduino работает на 5V, но датчик требует 3.3V, используйте конвертер уровней или резистивный делитель для линий SDA и SCL.
Подключение модуля AD8232 (ЭКГ):
- VCC → 3.3V на Arduino
- GND → GND на Arduino
- OUTPUT → Аналоговый пин A0 на Arduino
- LO- → Цифровой пин D11 на Arduino
- LO+ → Цифровой пин D10 на Arduino
Для AD8232 также потребуется подключение биоэлектродов к портам RA, LA и RL на самом модуле.
Мария Светлова, преподаватель робототехники
Однажды мы со студентами решили создать "умный" монитор сердечного ритма для школьной выставки технологий. Мы использовали Arduino Mega, датчик MAX30102 и цветной TFT-дисплей.
Первая сборка показала нестабильные результаты — частота пульса скакала от 40 до 200 ударов в минуту даже при спокойном измерении. Проблема оказалась в наводках от соседних цифровых линий. Мы перепроектировали схему, добавили экранирование, убрали все провода питания и сигнальные линии дисплея подальше от I2C-линий датчика.
Ключевым моментом стала доработка крепления датчика — мы напечатали на 3D-принтере специальный зажим, который надёжно фиксировал датчик на пальце, обеспечивая постоянное давление. Результаты сразу улучшились, погрешность измерений снизилась до приемлемых 2-3 ударов в минуту.
На выставке наш проект получил первое место, а главное — мы усвоили важный урок: при работе с биометрическими датчиками механическая стабильность и электромагнитная изоляция не менее важны, чем качество кода.
Расширенная схема с дисплеем OLED и Bluetooth:
Для создания полноценного портативного устройства, помимо датчика, добавим дисплей OLED SSD1306 и модуль Bluetooth HC-05:
Подключение OLED-дисплея (I2C): – VCC → 5V или 3.3V (в зависимости от модели дисплея) – GND → GND – SCL → A5 (тот же пин, что используется для MAX30102) – SDA → A4 (тот же пин, что используется для MAX30102)
Подключение Bluetooth HC-05: – VCC → 5V – GND → GND – TXD → D10 (подключаем к программному последовательному порту) – RXD → D11 через резисторный делитель (5V → 3.3V)
При сборке сложных схем с несколькими I2C-устройствами следите за возможными конфликтами адресов. Большинство OLED-дисплеев используют адрес 0x3C, а MAX30102 — 0x57, поэтому они могут работать на одной шине без проблем. 🧩
Готовые скетчи и код для считывания пульса
Разработка программного кода для считывания пульса — это балансирование между простотой и точностью. Рассмотрим несколько проверенных программных решений для разных типов датчиков. ⌨️
Базовый скетч для Pulse Sensor Amped:
Этот скетч считывает аналоговые значения с датчика, отфильтровывает шумы и определяет удары сердца:
// Определение контактов
const int pulsePin = A0; // Сигнал с датчика Pulse Sensor
const int ledPin = 13; // Встроенный LED на Arduino
// Переменные для работы с пульсом
int Signal; // Исходный сигнал с датчика
int Threshold = 550; // Порог для определения пика
boolean Pulse = false; // Состояние пульса (true = обнаружен удар)
int BPM; // Рассчитанное значение ЧСС
unsigned long lastBeatTime = 0; // Время последнего удара
unsigned long currentTime;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
Signal = analogRead(pulsePin); // Считываем сигнал
currentTime = millis();
// Обнаружение пика (удара сердца)
if (Signal > Threshold && !Pulse) {
Pulse = true;
digitalWrite(ledPin, HIGH);
// Расчет BPM
if (lastBeatTime > 0) {
int beatInterval = currentTime – lastBeatTime;
BPM = 60000 / beatInterval; // 60000 мс в минуте
// Проверка на разумность значения
if (BPM > 50 && BPM < 200) {
Serial.print("BPM: ");
Serial.println(BPM);
}
}
lastBeatTime = currentTime;
}
// Сброс флага, когда сигнал падает ниже порога
if (Signal < Threshold && Pulse) {
Pulse = false;
digitalWrite(ledPin, LOW);
}
delay(10); // Небольшая задержка для стабилизации считывания
}
Для более серьезных проектов рекомендую использовать готовую библиотеку PulseSensor Playground, которая предоставляет продвинутые функции фильтрации и обработки сигнала.
Код для работы с MAX30102 (измерение пульса и SpO2):
Для работы с датчиками MAX30100/MAX30102 необходимо установить библиотеку MAX30105. Вот пример скетча:
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; // Усреднение по 4 значениям
byte rates[RATE_SIZE]; // Массив значений сердечного ритма
byte rateSpot = 0;
long lastBeat = 0; // Время последнего обнаруженного удара
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(115200);
// Инициализация датчика
if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
Serial.println("MAX30105 не найден. Проверьте подключение.");
while (1);
}
// Настройка датчика
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
}
void loop() {
long irValue = particleSensor.getIR();
if (irValue < 50000) {
Serial.println("Палец не обнаружен!");
} else {
// Расчет BPM
if (checkForBeat(irValue)) {
long delta = millis() – lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
// Расчет среднего значения
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.println(beatAvg);
}
delay(100);
}
Расширенный скетч с выводом на OLED-дисплей:
Для наглядности показаний можно добавить вывод на OLED-дисплей:
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MAX30105 particleSensor;
// ... [те же переменные, что и в предыдущем примере] ...
void setup() {
Serial.begin(115200);
// Инициализация OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Heartrate Monitor");
display.display();
// ... [инициализация датчика MAX30102] ...
}
void loop() {
long irValue = particleSensor.getIR();
display.clearDisplay();
display.setCursor(0, 0);
display.println("Heart Rate Monitor");
if (irValue < 50000) {
display.setCursor(0, 20);
display.println("Place your finger");
Serial.println("Палец не обнаружен!");
} else {
// ... [расчет BPM как в предыдущем примере] ...
display.setCursor(0, 20);
display.print("IR: ");
display.println(irValue);
display.setCursor(0, 30);
display.print("BPM: ");
display.println(beatsPerMinute, 1);
display.setCursor(0, 40);
display.print("Avg BPM: ");
display.println(beatAvg);
// Простая визуализация сердцебиения
if (millis() – lastBeat < 200) {
display.fillRect(100, 20, 20, 20, SSD1306_WHITE);
}
}
display.display();
delay(100);
}
При отладке кода основные проблемы обычно связаны с подбором правильного порога для обнаружения ударов сердца. Этот параметр может различаться в зависимости от типа датчика и физиологических особенностей пользователя. 🔧
Модификации и улучшения вашего монитора сердцебиения
После успешной сборки базового монитора сердечного ритма наступает время улучшений и персонализации вашего устройства. Эти модификации могут значительно расширить функциональность и удобство использования вашего проекта. 🚀
Добавление беспроводной связи:
- Bluetooth: Интеграция модуля HC-05/HC-06 позволит передавать данные на смартфон или компьютер. Для этого подключите TX/RX модуля к цифровым пинам Arduino через программный UART и дополните код отправкой данных по последовательному порту.
- WiFi: Использование ESP8266 или ESP32 вместо обычной Arduino даст возможность отправлять данные на облачные сервисы или в локальную сеть. Модули ESP также могут выступать как веб-сервер, отображающий график сердцебиения в реальном времени.
- LoRa: Для мониторинга на больших расстояниях можно использовать модули LoRa, которые обеспечивают связь до нескольких километров в открытой местности.
Улучшение питания и портативности:
- Замените Arduino Uno на более компактную Arduino Nano или Pro Mini
- Добавьте литий-полимерный аккумулятор с модулем зарядки TP4056
- Интегрируйте переключатель питания и индикатор заряда батареи
- Разработайте компактный 3D-печатный корпус для всей системы
Расширение функциональности:
Добавление следующих функций существенно повысит полезность вашего устройства:
- Запись данных: Подключите модуль SD-карты для долгосрочного хранения измерений с временными метками.
- Мультипараметрический мониторинг: Дополните устройство датчиками температуры тела, движения (акселерометр) или уровня стресса (датчик GSR).
- Анализ сердечного ритма: Расширьте программное обеспечение для обнаружения аритмий, измерения вариабельности сердечного ритма (HRV) или определения стресса.
- Умные уведомления: Настройте оповещения при выходе показателей за установленные пределы через LED, зуммер или SMS-сообщения.
Улучшение точности измерений:
Для повышения качества получаемых данных можно применить несколько технических решений:
| Проблема | Решение | Реализация |
|---|---|---|
| Шумы сигнала | Аппаратная фильтрация | Добавление RC-фильтра на входной аналоговый сигнал |
| Артефакты движения | Компенсация движения | Использование акселерометра для коррекции показаний |
| Ложные срабатывания | Программная фильтрация | Реализация алгоритма скользящего среднего, фильтра Калмана |
| Нестабильное питание | Стабилизация напряжения | Использование стабилизатора напряжения и шунтирующих конденсаторов |
| Недостаточное прилегание | Улучшение крепления | Разработка эргономичного держателя для датчика |
Интеграция с другими системами:
Объедините ваш монитор сердечного ритма с другими DIY-проектами или готовыми платформами:
- Разработайте собственное мобильное приложение на MIT App Inventor или Flutter
- Интегрируйте данные с платформами IoT, такими как ThingSpeak, Blynk или Home Assistant
- Настройте оповещения через Telegram-бота или IFTTT
- Экспортируйте данные в форматах, совместимых с медицинским ПО для дальнейшего анализа
Помните, что модификации должны осуществляться поэтапно с тестированием каждого изменения. Это позволит избежать многих проблем и гарантирует корректную работу всей системы. Начните с наиболее важных для вас улучшений и постепенно расширяйте возможности вашего устройства. 📈
Создание монитора сердечного ритма на Arduino — это не просто техническое упражнение, но и шаг к пониманию собственного здоровья через технологии. Вы научились выбирать компоненты, собирать схемы, программировать Arduino для обработки биосигналов и модифицировать устройство под свои потребности. Этот проект открывает дорогу к созданию более сложных персональных медицинских устройств и демонстрирует, как доступные технологии могут быть применены для мониторинга жизненно важных показателей. Сделав первые шаги в этом направлении, вы получили практические навыки на стыке электроники и медицины, которые можно развивать и дальше.
Читайте также
- Arduino для умного дома: 5 проектов для простой автоматизации
- 5 проектов Arduino для создания устройств мониторинга сна дома
- Сенсорные экраны Arduino: топ-10 вдохновляющих проектов для начинающих
- Датчики влажности для Arduino: лучшие проекты с автополивом
- Отладка Arduino: эффективные методы поиска и устранения ошибок
- 7 практических проектов с температурными датчиками Arduino: обзор
- Arduino: основы программирования для начинающих электроников
- Как собрать умный термостат на Arduino: экономия и автоматизация
- Arduino: от мигающего светодиода к умному дому за 5 шагов
- 10 проектов Arduino для умного дома: практическое руководство