Как получить 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, чтобы начать цикл заново
}
//****************************************************************************************************
@Bholu, 👍2
Обсуждение1 ответ
Я думаю, что критерий ibeats не нужен в цикле, потому что принятые условные операторы имеют первую часть, которая не будет учтена при следующем прохождении цикла.
Выполните «if», «else if» для четырех условных операторов и завершите «else» на строке сброса, где все логические значения становятся ложными, тем самым позволяя вернуться к первому снимку millis() для импульса № 1 и т. д.
Выполните всего два расчёта BPM для четырёх снимков millis() для определения действительно независимых интервалов: интервалов 2-1 и 4-3. Среднее значение этих двух интервалов можно вычислить и затем нормализовать до 60 секунд, чтобы получить точное значение BPM для этого раунда сбора данных.
Сохраните или пересмотрите ibeats для других целей.
- Объединение кода для нескольких датчиков в одной программе
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Как использовать триггерный контакт ультразвукового датчика и зачем он нужен?
- Какой тип разъема использует система GROVE?
- Как получить данные о весе с датчиков стеклянных электронных весов для ванной?
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Получение BPM из данного кода
ваш эскиз не содержит отладочного кода... добавьте его... без него вы не сможете точно определить проблему, @jsotola
Вам не нужно знать, когда происходят второй и третий импульсы... получите временную метку первого импульса... определите второй и третий импульсы... рассчитайте BPM, используя первый и четвертый импульсы, @jsotola
Похоже, вы действительно хотите реализовать *скользящее среднее*. Вам нужно среднее время четырёх предыдущих ударов (точнее, трёх предыдущих интервалов), и каждый раз, когда появляется новый интервал, вы «забываете» самый старый и добавляете самый новый, вычисляя среднее значение трёх., @Majenko
Временная метка, используемая для вашей задачи, будет использоваться только один раз, чтобы обеспечить полностью независимое вычисление частоты сердечных сокращений (BPM). Например, первый и второй импульсы могут образовать одну независимую пару и привести к оценке BPM. Затем третий и четвёртый импульсы могут образовать вторую независимую пару и дать оценку интервала и BPM. Без этой независимости вы могли бы просто получить разницу временных меток между N+1 импульсами и нормализовать её до 60 секунд для вычисления частоты сердечных сокращений (ударов) в минуту., @DLSmith