Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

От KY-039 до частоты пульса

Компоненты и расходные материалы

Arduino UNO
× 1
датчик сердцебиения KY-039
× 1
Перемычки (общие)
× 1

Об этом проекте

В комплекте 37 датчиков для Arduino , есть датчик сердцебиения. Название слишком много обещает. Люди склонны думать, что он предоставляет цифровой номер через I2C или что-то подобное, число, которое представляет собой частоту сердечных сокращений. Датчик предоставляет просто "аналоговое" значение от 0 до 1023, показывающее, сколько инфракрасного света получает датчик света, или на самом деле насколько что-то затемняет датчик света . Чем выше значение, тем меньше инфракрасного света.

Вкратце:поместите палец между ИК-светодиодом и световым транзистором датчика. Ваше сердцебиение расширяет кровеносные сосуды в пальце, что фильтрует ИК-излучение. Это создает пульсирующий сигнал.

В этом проекте я описываю, как этот сигнал преобразуется в частоту сердцебиения, например, 66 ударов в минуту (ударов в минуту).

Простые шаги

Если вы просто прочитаете и нанесете на график значения с датчика KY-039, вы получите что-то вроде этого:

Значения представляют собой целые числа. Не очень точно. Вместо этого вычислите среднее значение группы из них и нанесите среднее значение. Вы получите это:

Здесь уже можно увидеть пульс сердца. Получите разницу во времени между каждым значительным нарастанием пульса. Исходя из этого, вы можете рассчитать частоту сердечных сокращений в ударах в минуту.

(Небольшой зигзагообразный узор на изображении выше вызван искусственным освещением, 50 Гц, это еще одна вещь, с которой приходится иметь дело.)

Объяснение шагов

Вот простой код для вывода всего, что вы читаете с датчика KY-039:

  // Скрипт теста монитора пульсаint sensorPin =0; void setup () {Serial.begin (9600);} void loop () {while (1) {Serial.print (analogRead (sensorPin)); Serial.print ('\ n'); Серийный принт ('\ n'); }}  

Вы можете получить что-то вроде этого:

Поскольку это заголовок из окна монитора последовательного порта, считывающего последовательный вывод с вашего Arduino на скорости 9600 бод, весь процесс синхронизируется с помощью Serial.print () функция, которая установит скорость чтения и построения значений. В любом случае кривая очень неровная, потому что она варьируется от 360 до 383 и имеет только целые значения.

Сглаживание

Чтобы получить более плавный вывод, снимите с датчика в среднем 20 последних показаний. Вот как я это делаю. Я определяю константу, говорящую, сколько показаний я хочу:

  #define samp_siz 20  

Затем у меня есть массив, содержащий это количество чтений:

  int читает [samp_siz];  

Для каждого нового показания я вычитаю самое старое показание из суммы и добавляю самое новое показание к сумме. В массиве я заменяю самое старое чтение самым новым.

  reader =analogRead (sensorPin); // считываем сумму сенсора - =reads [ptr]; // вычитаем самое старое чтение из суммы sum + =reader; // добавляем самое новое чтение к сумме чтения [ptr] =reader; // сохраняем последнее чтение в массиве last =float (sum) / samp_siz; // вычисляем среднее теперь ptr ++; // обновить индекс массива, иметь ptr% =samp_siz; // он перезапускается с 0 при необходимости  

При размере массива 20 и скорости передачи 9600 бод в последовательном мониторе я мог бы получить такой график:

Здесь вы видите реальное сердцебиение в виде крутой восходящей кривой. Но вы также видите небольшой зигзагообразный узор. Меньший зигзаг исходит от моего кухонного света, комнату освещают три светодиодные лампы. Электросеть в моем доме - 240 В, 50 Гц переменного тока. Итак, 50 раз в секунду интенсивность света возрастает, по-видимому, также в ИК-диапазоне. Я бы хотел сгладить этот шум 50 Гц. Он должен работать, если я считываю значения с датчика в течение периода 20 мс и беру среднее значение всех значений. Посмотрим ...

  n =0; начало =миллис (); reader =0 .; сделать {читатель + =аналоговое чтение (сенсорпин); // считываем и добавляем значения ... n ++; now =millis (); } while (теперь  

С помощью этого фрагмента я снимаю показания датчика порциями по 20 мс, что сглаживает мерцание 50 Гц, вызванное искусственным светом. Если вы живете в стране с частотой 60 Гц, используйте вместо этого фрагменты по 16,67 мс. Или 16667 мкс.

Поскольку я уже сглаживаю кривую на участках по 20 мс, мне на самом деле не нужен массив, который я использовал ранее, но поскольку он есть и его размер легко изменить, я оставляю его там. А использование массива размером 5, кажется, сглаживает последний раздражающий шум. Вот что у меня есть сейчас:

Последнее, что мне нужно сделать, это распознать любую часть повторяющегося узора. Так как подъем более ровный, я иду на это. Обратите внимание на то, что значения оси Y сильно различаются на всех графиках. Я действительно не могу полагаться только на абсолютные значения. Я могу полагаться только на подъем и спад кривой. Математики говорили бы о производной. Я доволен, если найду n последовательные возрастающие значения, где n может быть удобным регулируемым значением. Я начинаю с 5. Для этого у меня есть rise_threshold . константа, определенная в коде. Когда я нахожу 5 последовательных возрастающих значений, я знаю, что нахожусь в нижней части кривой, идущей вверх. Мне нужно время. Я жду падающей кривой, затем жду следующих 5 возрастающих значений и отмечаю время. Затем распечатываю соответствующий BPM.

Я сделал тест и подсчитано как многие подряд рост значения там являются в кривая и найдено вне там были между 10 и 15 Итак если Я количество в 5, Я будет большинство конечно знать Я найдено начало из сердцебиение.

Поскольку я печатаю только после каждого биения сердца, печати будет не так много. Будет больше времени на считывание сенсора. Я могу уловить более частые шумы, которых я не увижу, потому что плоттер не включен. Посмотрим, как это работает.

Окончательный код

  #define samp_siz 4 # define rise_threshold 5 // Скрипт теста монитора пульсаint sensorPin =0; void setup () {Serial.begin (9600);} void loop () {float reads [samp_siz], sum; long int сейчас, ptr; плавать последним, читатель, начать; float first, second, third, before, print_value; bool возрастает; int rise_count; int n; long int last_beat; for (int i =0; i  before) {rise_count ++; if (! rise &&rise_count> rise_threshold) {// Хорошо, мы обнаружили восходящую кривую, что подразумевает сердцебиение. // Записываем время с момента последнего удара, отслеживаем два предыдущих // раза (первый, второй, третий), чтобы получить средневзвешенное значение. // Флаг подъема не позволяет нам обнаружить такое же повышение // более чем один раз. возрастание =истина; первый =миллис () - last_beat; last_beat =миллис (); // Вычислить средневзвешенное значение частоты сердечных сокращений // по трем последним ударам print_value =60000. / (0,4 * первое + 0,3 * второе + 0,3 * третье); Serial.print (print_value); Serial.print ('\ n'); Серийный принт ('\ n'); третий =второй; второй =первый; }} else {// Хорошо, кривая падает вверх =false; rise_count =0; } before =last; ptr ++; ptr% =samp_siz; }}  

Работает неплохо. Вот видео.

Обратите внимание, что крошечный светодиод RX на Arduino мигает синхронно с моим сердцем. Просто потому, что когда есть сердцебиение, частота вычисляется и выводится на серийный номер, на котором мигает светодиод. Когда палец немного шевелится, будут считывания ошибок.

Дальнейшее развитие

Сейчас скорость печати рассчитывается на основе последних трех ударов. Но было бы правильнее рассчитать его, скажем, на 15-секундном периоде. Я мог бы сохранить 15 последовательных значений скорости, вычислить среднее значение, затем исключить пять значений, которые наиболее далеки от среднего, и вычислить новое среднее. Это в значительной степени обеспечило бы надежное и стабильное измерение частоты сердечных сокращений.

Тестировал датчик только на жене и на себе. Каждый шаг в усилении сигнала я делал на основе предыдущих показаний. У кого-то еще может быть другой вид сердцебиения, вызывающий кривую другой формы, что требует другого подхода для определения биения. Может быть, легче распознать падающую кривую. Или на самом верху. А что будет, если пульс 180 - 200 ударов в минуту? Сложнее найти восходящую кривую.

Код

  • Окончательная версия
Финальная версия C / C ++
Программа считывает сердцебиение и выводит частоту в последовательном окне.
 #define samp_siz 4 # define rise_threshold 4 // Скрипт теста монитора пульсаint sensorPin =0; void setup () {Serial.begin (9600);} void loop () {float читает [samp_siz], сумма; long int сейчас, ptr; плавать последним, читатель, начать; float first, second, third, before, print_value; bool возрастает; int rise_count; int n; long int last_beat; for (int i =0; i  before) {rise_count ++; if (! rise &&rise_count> rise_threshold) {// Хорошо, мы обнаружили восходящую кривую, что подразумевает сердцебиение. // Записываем время с момента последнего удара, отслеживаем два предыдущих // раза (первый, второй, третий), чтобы получить средневзвешенное значение. // Флаг повышения не позволяет нам регистрировать одно и то же повышение более одного раза. возрастание =истина; первый =миллис () - last_beat; last_beat =миллис (); // Вычислить средневзвешенное значение частоты сердечных сокращений // по трем последним ударам print_value =60000. / (0,4 * первое + 0,3 * второе + 0,3 * третье); Serial.print (print_value); Serial.print ('\ n'); Серийный принт ('\ n'); третий =второй; второй =первый; }} else {// Хорошо, кривая падает вверх =false; rise_count =0; } before =last; ptr ++; ptr% =samp_siz; }} 

Схема


Производственный процесс

  1. Датчик цвета - работа и приложения
  2. Ультратонкий датчик внешней освещенности OPT3007
  3. Потоковая передача данных датчика с пластины PPDAQC Pi с использованием InitialState
  4. Датчик температуры и освещенности Raspberry Pi
  5. Солнечный свет подъездной дороги к узлу беспроводного датчика MSP430
  6. Датчик освещенности с поддержкой голоса и SMS с использованием Raspberry Pi и Twilio
  7. Windows 10 IoT Core - считывание пульса
  8. Датчик освещенности Raspberry Pi:простое руководство по LDR
  9. Цифровой датчик освещенности
  10. Удаленный монитор сердечного ритма