Как получить BPM с помощью 4 ударов сердца

Я пытаюсь получить среднее значение по трём интервалам для расчёта BPM. Однако при использовании кода ниже частота BPM медленно снижается при использовании датчика. Может ли кто-нибудь проверить, в чём ошибка в коде? Для справки: мне нужно изменить код по ссылке ниже для 4 ударов, чтобы рассчитать BPM. Получение BPM из данного кода

#include <LiquidCrystal.h>

LiquidCrystal lcd(24, 25, 26, 27, 28, 29);

//глобальные переменные

int  ibeats, iInterval1, iInterval2, iInterval3, iCount = 1;
unsigned long iFirstPulse, iSecondPulse, iThirdPulse, iFourthPulse;
bool bIgnoreread = false;
bool bFirstPulse = false, bSecondPulse = false, bThirdPulse = false, bFourthPulse = false;

float BPM, fAverage;

void setup()
{
  //инициализируем последовательный порт USB, шину I2C и ЖК-дисплей
  Serial.begin(115200);         //настройте этот канал связи на случай, если вы захотите устранить неполадки

  lcd.begin(20, 4); delay(2);
  lcd.clear(); delay(2);

  lcd.setCursor(0, 0); lcd.print(" Patient Prober");


}

void loop()
{

  ibeats = analogRead(15); delay(5);// Считываем значение датчика пульса.

  lcd.setCursor(0, 3); lcd.print("BPM:"); lcd.print(BPM); lcd.print(" ");// отображение значения bpm на ЖК-дисплее

  if (ibeats > 780 && bIgnoreread == false)     //как только сигнал станет высоким и bIgnoread станет ложным начальное состояние, внутри оператора if начнется
  {
    if (bFirstPulse == false && iCount == 1) 
    {
      iFirstPulse = millis();   // время, когда пульс высокий для FirstPulse
      bFirstPulse = true;      // чтобы отключить оператор if
    }

    if (bSecondPulse == false && iCount == 2)
    {
      iSecondPulse = millis();
      iInterval1 = iSecondPulse - iFirstPulse;   // первый интервал
      bSecondPulse = true;
    }

    if (bThirdPulse == false && iCount == 3)
    {
      iThirdPulse = millis();
      iInterval2 = iThirdPulse - iSecondPulse;    //Секундный интервал
      bThirdPulse = true;
    }

    if (bFourthPulse == false && iCount == 4)
    {
      iFourthPulse = millis();
      iInterval3 = iFourthPulse - iThirdPulse;    // третий интервал
      bFourthPulse = true;
    }

    bIgnoreread = true; // для выключения, когда миллисекунда присваивается переменной Pulse Когда сигнал высокий
  }

  // сброс всех боллеанов в исходное состояние
  if (ibeats < 300)
  {
    bIgnoreread = false;
    bFirstPulse = false;
    bSecondPulse = false;
    bThirdPulse = false;
    bFourthPulse = false;
    iCount++;               // приращение для помощи в различии, если условие выше
  }

  //если(ibeats==0)iCount++;

  fAverage = ( iInterval1 + iInterval2 + iInterval3) / 3;         // Среднее за интервал
  BPM = (60000.0 / fAverage);                                    // Расчет BPM

  if (iCount > 4)iCount = 1;                                    // сбрасываем icount, чтобы начать цикл заново
}
//****************************************************************************************************

, 👍2

Обсуждение

ваш эскиз не содержит отладочного кода... добавьте его... без него вы не сможете точно определить проблему, @jsotola

Вам не нужно знать, когда происходят второй и третий импульсы... получите временную метку первого импульса... определите второй и третий импульсы... рассчитайте BPM, используя первый и четвертый импульсы, @jsotola

Похоже, вы действительно хотите реализовать *скользящее среднее*. Вам нужно среднее время четырёх предыдущих ударов (точнее, трёх предыдущих интервалов), и каждый раз, когда появляется новый интервал, вы «забываете» самый старый и добавляете самый новый, вычисляя среднее значение трёх., @Majenko

Временная метка, используемая для вашей задачи, будет использоваться только один раз, чтобы обеспечить полностью независимое вычисление частоты сердечных сокращений (BPM). Например, первый и второй импульсы могут образовать одну независимую пару и привести к оценке BPM. Затем третий и четвёртый импульсы могут образовать вторую независимую пару и дать оценку интервала и BPM. Без этой независимости вы могли бы просто получить разницу временных меток между N+1 импульсами и нормализовать её до 60 секунд для вычисления частоты сердечных сокращений (ударов) в минуту., @DLSmith


1 ответ


0

Я думаю, что критерий ibeats не нужен в цикле, потому что принятые условные операторы имеют первую часть, которая не будет учтена при следующем прохождении цикла.

Выполните «if», «else if» для четырех условных операторов и завершите «else» на строке сброса, где все логические значения становятся ложными, тем самым позволяя вернуться к первому снимку millis() для импульса № 1 и т. д.

Выполните всего два расчёта BPM для четырёх снимков millis() для определения действительно независимых интервалов: интервалов 2-1 и 4-3. Среднее значение этих двух интервалов можно вычислить и затем нормализовать до 60 секунд, чтобы получить точное значение BPM для этого раунда сбора данных.

Сохраните или пересмотрите ibeats для других целей.

,