Точный измерятель пульса на фоторезисторе и Arduino: сборка и настройка
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Digilent OpenScope MZ | 1 | Оцифровка сигнала для настройки (опционально, можно другой осциллограф) |
| Arduino UNO | 1 | Подсчёт пульса и вывод BPM |
| Операционный усилитель 4-канальный (TI, напр. TL084) | 1 | Фильтр + два усилителя + виртуальная земля |
| Компаратор высокой скорости (TI, напр. TLV3501) | 1 | Превращает аналоговый сигнал в цифровые импульсы |
| Многооборотный потенциометр 10 кОм (25 оборотов) | 2 | Точная установка порогов компаратора (R3, R4) |
| Однооборотный потенциометр 100 кОм | 1 | Лучше взять многооборотный для точной настройки усиления |
| Однооборотный потенциометр 10 кОм | 1 | Настройка усиления фильтра (R7) |
| Конденсатор 100 мкФ | 1 | Питание / развязка |
| Конденсатор 100 нФ | 1 | Развязка питания ОУ |
| Резистор 10 кОм | 2 | Или один 20 кОм для делителя с фоторезистором |
| Резистор 4.75 кОм | 1 | |
| Резистор 82 кОм | 1 | Можно собрать из двух 100 кОм потенциометров |
Приложения и онлайн-сервисы
- Arduino IDE — прошивка микроконтроллера
- Digilent WaveForms Live — просмотр формы сигнала в браузере (для OpenScope)
О проекте
Введение
Проект вдохновлен видео CapitanoRed, где автор сделал пульсометр на фоторезисторе для осциллографа. Я захотел повторить и добавить Arduino для расчёта и отображения ЧСС. Так можно одновременно смотреть форму волны на осциллографе и получать цифровое значение пульса.
Принцип работы
При сокращении сердца давление крови пульсирует. В тонких местах (палец, мочка уха) эти пульсации меняют прохождение света. Глаза не улавливают это, но фоторезистор — да. Его сопротивление меняется с интенсивностью света.


Цепь:
- Фоторезистор + 20 кОм — делитель напряжения. Больше свет → выше напряжение.
- Amp1 — фильтр низких частот, убирает высокочастотный шум.
- Amp2 — инвертирующий усилитель, максимизирует амплитуду пульса.
- Amp3 — создаёт виртуальную землю 2.5 В, центрируя сигнал для максимального размаха 0–5 В.

Компаратор (Cmp) — специальный ОУ, выдающий только HIGH (5 В) или LOW (0 В). С гистерезисом (разными порогами включения/выключения) он генерирует один квадратный импульс на удар сердца, игнорируя шум и дикротический зубчик.

Подготовка фоторезистора
Надёжно изолируйте выводы (термоусадка, лак). Напряжения тела могут искажать показания при контакте с кожей.

Настройка усилителя (R7)
Начните с ~375 Ом на стороне фильтра. Наблюдайте сигнал в WaveForms Live. Увеличьте усиление (уменьшайте резистанс), пока пульс не станет чётким, но без обрезания вершин.







Установка порогов компаратора (R3, R4, R5)
Используйте многооборотные потенциометры для R3, R4. R5 — любой резистор 10–100 кОм (точно измеренный). Приложен Excel-калькулятор (comparator calcs.xlsx) для расчёта R3/R4 по заданным порогам Vl (нижний) и Vh (верхний).
В WaveForms Live: Time=1s, Trigger=OFF, Offset Ch1/Ch2=2.5V, Samples=1000 (lock). Запустите RUN, приложите палец к фоторезистору. Найдите удобное положение (лучше первый сустав указательного). Остановите захват, включите CURSORS → Voltage, установите курсоры: один чуть ниже пика, второй — ниже дикротического зубчика. Считайте напряжения → введите в калькулятор → выставьте R3, R4.

Код Arduino (счётчик частоты + скользящее среднее)
#define INT0 3
float frequency; long timeCount; int counter; long pulseStart;
int inputPin = 3; boolean low; float freqAvg; float total;
void setup() {
attachInterrupt(digitalPinToInterrupt(INT0), intrruption, CHANGE);
counter = 0; timeCount = 0; frequency = 0; low = false;
Serial.begin(9600); total = 15;
}
void loop() {
timeCount = millis();
while (millis() - timeCount < 5000) { frequency = counter; }
if (frequency > 3) {
total += frequency; total -= freqAvg; freqAvg = total / 3;
}
showHR(); counter = 0;
}
void intrruption() {
if (digitalRead(3) == 0) { fallDetect(); low = true; }
else if (digitalRead(3) == 1) { widthCheck(); }
}
void fallDetect() { pulseStart = millis(); }
void widthCheck() {
long pulseEnd = millis();
if ((pulseEnd - pulseStart > 200) && (pulseEnd - pulseStart < 800) && low) {
counter++; low = false;
}
}
void showHR() {
Serial.print("Heart rate = ");
Serial.println(freqAvg * 12); // 5-секундные окна → *12 = BPM
}
Интерпретирует импульсы от компаратора (пин 3). Отбраковывает импульсы короче 200 мс и длиннее 800 мс. Скользящее среднее за 15 секунд (3 окна по 5 с) сглаживает случайные пропуски.
Перспективы улучшения
- Добавить собственный ИСТОЧНИК СВЕТА (красный LED) для независимости от окружающего освещения. Проба с LED дала хорошие результаты.
- Авто-режиминг на Arduino: анализ пиков/впадин на аналоговом входе → установка порогов через цифровые потенциометры → прерывания по цифровому сигналу компаратора для точного счёта.
Файлы проекта
comparator calcs.xlsx — калькулятор порогов компаратора (скачать)Arduino Heart Rate Counter — скетч (приведён выше)
Схема (Fritzing)
hr_monitor_tnffXlVQQV.fzz
Производственный процесс
- Внешний дефибриллятор: история, дизайн и производство
- Искусственное сердце: технологии, история и перспективы
- Искусственные клапаны сердца: типы, история и инновации будущего
- Современные ЭКГ-аппараты: технологии, производство и будущие инновации
- Обнаружение молний с Raspberry Pi и AS3935: практическое руководство
- Считывание пульса сердечного ритма на Windows 10 IoT Core на Raspberry Pi — пошаговое руководство
- Система удалённого мониторинга сердечного ритма с алертами AWS IoT
- Измерение магнитной сигнатуры ядра одиночного атома
- Интегрированные датчики сердечного ритма в умной одежде: надежный носимый мониторинг
- Защитите сердце: важные привычки для месяца здоровья сердца в феврале