# SPDX-FileCopyrightText: 2018 Kattni Rembor for Adafruit Industries; 2023 Vladimir Lebedev
#
# SPDX-License-Identifier: MIT
import board
import analogio
import time
pulse = analogio.AnalogIn(board.IO9)
# Сколько раз считываем показания подряд за один сэмпл
NUM_OVERSAMPLE = 10
# Сколько сэмплов усредняем
NUM_SAMPLES = 20
# Промежуток между сэмплами в секундах
SAMPLE_TIME = 0.025
# Кольцевой буфер для сэмплов
samples = [0] * NUM_SAMPLES
last_time = time.monotonic()
beats = 0
while True:
for i in range(NUM_SAMPLES):
# Считываем показания датчика максимально быстро
oversample = 0
for s in range(NUM_OVERSAMPLE):
oversample += float(pulse.value)
# ...и усредняем их
samples[i] = oversample / NUM_OVERSAMPLE
# Находим среднее среди всех снятых сэмплов
mean = sum(samples) / float(len(samples))
# Если в предыдущем сэмпле значение было меньше среднего,
# а стало больше среднего - значит произошёл удар сердца
if samples[i] - mean <= 0 and samples[i - 1] - mean > 0:
beats += 1
print('.', end='')
# Каждые 10 секунд подсчитываем среднее количество ударов
if time.monotonic() - last_time > 10:
print()
print("BPM:", beats * 60 / (time.monotonic() - last_time))
beats = 0
last_time = time.monotonic()
time.sleep(SAMPLE_TIME)