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

Монитор сердечного ритма (переносной и беспроводной с использованием ЭКГ)

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

устройство УЭКГ
Для фактического измерения BPM. Он может отправлять данные по протоколу, совместимому с nRF24
× 1
Arduino Nano R3
× 1
Модуль nRF24 (общий)
Здесь подойдет любой модуль. Требуется для получения данных BPM от uECG
× 1
Кольцо Adafruit NeoPixel:светодиод WS2812 5050 RGB
× 1
LiPo аккумулятор
Любая батарея емкостью 200+ мАч
× 1

Необходимые инструменты и машины

Паяльник (общий)

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

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

Эта версия решает все эти проблемы:ее можно носить на запястье, поэтому вы можете видеть ее, не сводя глаз с дороги, и она беспроводная, поэтому нет искажения показаний, она действительно работает для бега и позволяет отслеживать нагрузку на сердце.

1. Компоненты

Как и в предыдущем проекте, всю тяжелую работу выполняет uECG - он измеряет данные и вычисляет BPM на борту. Но также, когда он переключается в режим прямого соединения, он отправляет всю эту информацию (вместе с данными ЭКГ высокого разрешения, которые мы здесь не используем) по радиопротоколу, совместимому с обычным чипом nRF24. Итак, второй критический компонент - это модуль nRF24. А у Arduino Nano есть как раз тот размер, который подходит под маленькое светодиодное кольцо, поэтому я использую его в качестве контроллера (но на самом деле здесь все будет работать так же хорошо).

2. Схема

Подключить модуль nRF24 непросто, вам нужно подключить все провода SPI (MISO, MOSI, SCK, CS), а также провод включения микросхемы и источник питания. И если вы хотите, чтобы он был достаточно маленького размера - все контактные разъемы должны быть удалены, а провода припаяны непосредственно к контактным площадкам. Таким образом, для подключения одного nRF требуется 7 проводов, 14 точек пайки. Хорошая новость заключается в том, что в остальном все просто:для светодиодного кольца требуется 1 провод для передачи данных и 2 провода питания, а еще 2 провода питания входят в разъем аккумулятора.

Список подключений выглядит следующим образом:
nRF24 контакт 1 (GND) - Arduino GND
nRF24 контакт 2 (Vcc) - Arduino 3.3v
nRF24 контакт 3 (Chip Enable) - Arduino D9
nRF24 контакт 4 (SPI:CS) - Arduino D8
nRF24 контакт 5 (SPI:SCK) - Arduino D13
nRF24 контакт 6 (SPI:MOSI) - Arduino D11
nRF24 контакт 7 ( SPI:MISO) - Питание светодиода Arduino D12
- Питание 5 В от Arduino
Светодиодное кольцо GND - Заземление Arduino
Светодиодное кольцо DI - D5 Arduino
Положительный полюс батареи (красный) - 5 В от Arduino
Отрицательный полюс батареи (черный) - GND Arduino
(обратите внимание, что для батареи требуется разъем, чтобы ее можно было отсоединить и зарядить)

Важное примечание:вы не можете подключать провода MOSI, MISO, SCK к любым другим контактам Arduino. Аппаратное обеспечение SPI находится на D11, D12, D13 и не будет работать, если оно не подключено к ним. Все остальные пины можно изменить (если вы внесете соответствующие изменения в программу).

3. Программа

Единственная сложность в программном обеспечении - это настройка радиочастотного канала. Я потратил довольно много времени, пытаясь заставить его работать, прежде чем понял, что uECG и nRF24 используют другой порядок битов для адреса канала. Когда я исправил это, все начало работать сразу :) В основном мы просто читаем входящие пакеты, используем их 5-й байт как BPM и фильтруем его (RF-канал зашумлен, поэтому время от времени вы получаете случайное значение вместо правильного чтения, и аппаратный CRC отключен по соображениям совместимости). После этого BPM преобразуется в цвет и количество активных пикселей, и все.

  #include  
#ifdef __AVR__
#include
#endif
#include
#include
#include
#include
int rf_cen =9; // Вывод включения микросхемы nRF24
int rf_cs =8; // вывод nRF24 CS
RF24 rf (rf_cen, rf_cs);
// адрес канала - жестко задан на стороне uECG
uint8_t pipe_rx [8] ={0x0E, 0xE6, 0x0D, 0xA7, 0 , 0, 0, 0};
// Какой вывод на Arduino подключен к NeoPixels?
#define PIN 5
// Сколько NeoPixels подключено к Arduino?
uint8_t v =0;
if (a &0x80) v | =0x01;
if (a &0x40) v | =0x02;
if (a &0x20) v | =0x04;
if (a &0x10) v | =0x08;
if (a &0x08) v | =0x10;
if (a &0x04) v | =0x20;
if (a &0x02) v | =0x40;
if (a &0x01) v | =0x80;
return v;
}
void setup () {
pixels.begin (); // Это инициализирует библиотеку NeoPixel.
for (int i =0; i pixels.setPixelColor(i, pixels.Color (1,1,1));
}
pixels.show ();
// nRF24 требует относительно медленного SPI, вероятно, будет работать и на 2 МГц
SPI.begin ();
SPI.setBitOrder (MSBFIRST );
SPI.beginTransaction (SPISettings (1000000, MSBFIRST, SPI_MODE0));
for (int x =0; x <8; x ++) // nRF24 и uECG имеют разный порядок битов для адреса канала
pipe_rx [x] =swapbits (pipe_rx [x]);
// настроить параметры радио
rf.begin ();
rf.setDataRate (RF24_1MBPS);
rf.setAddressWidth (4);
rf.setChannel (22);
rf.setRetries (0, 0);
rf.setAutoAck (0);
rf.disableDynamicPayloads ( );
rf.setPayloadSize (32);
rf.openReadingPipe (0, pipe_rx);
rf.setCRCLength (RF24_CRC_DISABLED);
rf.disableCRC ();
rf.startListening (); // прослушивание данных uECG
// Обратите внимание, что uECG нужно переключить в режим сырых данных (долгим нажатием кнопки)
// для отправки совместимых пакетов, по умолчанию он отправляет данные в режиме BLE
// который не может быть получен nRF24
}
long last_pix_upd =0;
byte in_pack [32];
int rf_bpm =0;
int bpm_hist [5]; // поскольку мы отключили CRC, необходимо фильтровать входящие данные
void loop ()
{
if (rf.available ())
{
rf.read ( in_pack, 32);
int bb =in_pack [5]; // BPM находится в 5-м байте пакета
// подробная структура пакета находится в документации uECG
// поскольку у нас нет CRC по соображениям совместимости, нам нужно фильтровать
// входящие данные, радиоканал может быть шумным. Мы сравниваем последние 5
// полученных значений BPM и используем одно только в том случае, если все 5 были одинаковыми.
// Поскольку uECG отправляет около 100 пакетов в секунду,
// любая заметная задержка в отображении данных
for (int n =0; n <5-1; n ++) // сдвиг массива истории ударов в минуту на 1
bpm_hist [n] =bpm_hist [n + 1];
bpm_hist [4] =bb; // добавляем новое значение ударов в минуту
for (int n =0; n <5; n ++) // проверяем, все ли равны
if (bpm_hist [n]! =bb) bb =-1;
if (bb> 0) // если да - сохранить как новые полученные BPM
rf_bpm =bb;
}
long ms =millis ();
if ( ms - last_pix_upd> 10) // не обновляйте пиксели слишком часто
{
int r, g, b;
last_pix_upd =ms;
int bpm =rf_bpm;
int max_bright =160; // значение максимальной яркости, max 255. Но вам не всегда нужно максимальное значение :)
float dd =25; // изменение BPM между цветовыми тонами (синий-> зеленый-> желтый-> розовый-> красный)
float t1 =90, t2, t3, t4; // t1 - "базовый" BPM, ниже t1 будет синий
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ / код для изменения цвета в зависимости от того, в каком диапазоне t1 ... t4 мы сейчас находимся
if (bpm иначе, если (уд / мин иначе, если (уд / мин иначе, если (уд / мин иначе {r =max_bright; г =0; b =0; }
int on_pixels =(bpm-80) / 8; // поскольку он предназначен для работы, я не
// показываю что-либо менее 80 ударов в минуту, поэтому он более чувствителен в
// области высокой нагрузки
for (int i =0; i {
// пиксели устанавливаются от последнего к первому без особой причины,
// будут работать так же нормально, если установить от первого до последнего
if (i else pixels.setPixelColor (NUMPIXELS-i-1, pixels.Color (0, 0,0)); // выключаем все остальные светодиоды
}
pixels.show ();
}
}

4. Сборка браслета

Когда все провода припаяны, программа мигает, и вы подтвердили, что данные УЭКГ получены - пора собрать все вместе.

Я выбрал очень простой способ скрепить все вместе - термоклей. Поскольку сами детали уже почти подходят (Nano подходит по размеру внешнего кольца, модуль nRF24 подходит по размеру внутреннего кольца, а батарея, хотя и не подходит ни к какой части, почему-то не сильно мешает - не уверен, как это работает, но я просто приклеил это там и как-то действительно было нормально :) Затем я пришил его к какому-то случайному браслету, который у меня был под рукой (остатки от паяльной станции, лента, которая используется для заземления при пайке), и все!

5. Тестирование

Для тестирования я пошел на пробежку, и все сработало отлично, за исключением одного сюрприза. Я использовал такие настройки, что при 192 ударах в минуту горели все светодиоды, так как по всем рекомендациям такая частота пульса слишком высока для моих параметров. Сюрпризом было то, что я превысил его всего за несколько минут бега, даже не замечая этого. Я даже подумал, что это может быть ошибка датчика, но нет - когда я остановился, он не сразу отключился, вместо этого было медленное расслабление (датчик на 100% надежен, когда нет большого движения). Получается, что какое-то время я тренируюсь намного выше своего порога здоровья (по крайней мере, того, что должно быть здоровым для стандартного взрослого человека моего возраста / веса). Это интересно:я с детства увлекался (любительским) спортом, но в подростковом возрасте у меня были проблемы с сердцем, и со временем они, казалось, исчезли. Но по опыту знаю, что любая нагрузка выше, чем быстрая ходьба, была для меня действительно сложной, но я продолжал тренироваться - и со временем это увеличивало мой лимит до такой степени, что теперь я считаю себя в хорошей форме. И теперь у меня есть вопрос - мой BPM просто выше обычного из-за проблем с сердцем в подростковом возрасте, или я действительно слишком сильно напрягаюсь, не осознавая этого? В любом случае придется что-то с этим делать - либо увеличивать максимальный BPM на мониторе, либо тренироваться менее интенсивно. :)

P.S. Удивительно, но уЭКГ очень хорошо работает как датчик ЭМГ - вы можете прочитать об этом в моем проекте Robotic Hand Control

Код

  • bpm_watch.ino
bpm_watch.ino Arduino
 #include  #ifdef __AVR__ #include  # endif # include  #include  #include  #include  int rf_cen =9; // включение микросхемы nRF24 pinint rf_cs =8; // nRF24 CS pinRF24 rf (rf_cen, rf_cs); // адрес канала - жестко запрограммирован на стороне uECGuint8_t pipe_rx [8] ={0x0E, 0xE6, 0x0D, 0xA7, 0, 0, 0, 0}; // Какой вывод на Arduino подключен к NeoPixels? #Define PIN 5 // Сколько NeoPixels подключено к Arduino? #Define NUMPIXELS 16 адрес использует перестановку битов // инвертировать битовый порядок в одном байте uint8_t v =0; если (a &0x80) v | =0x01; если (a &0x40) v | =0x02; если (a &0x20) v | =0x04; если (a &0x10) v | =0x08; если (a &0x08) v | =0x10; если (a &0x04) v | =0x20; если (a &0x02) v | =0x40; если (a &0x01) v | =0x80; return v;} установка void () {пикселей.begin (); // Это инициализирует библиотеку NeoPixel. для (int я =0; я <ЧИСЛО; я ++) {пикселей.setPixelColor (я, пикселей.Цвет (1,1,1)); } pixel.show (); // nRF24 требует относительно медленного SPI, вероятно, будет работать и на 2 МГц SPI.begin (); SPI.setBitOrder (MSBFIRST); SPI.beginTransaction (SPISettings (1000000, MSBFIRST, SPI_MODE0)); for (int x =0; x <8; x ++) // nRF24 и uECG имеют разный порядок битов для адреса канала pipe_rx [x] =swapbits (pipe_rx [x]); // настраиваем параметры радио rf.begin (); rf.setDataRate (RF24_1MBPS); rf.setAddressWidth (4); rf.setChannel (22); rf.setRetries (0, 0); rf.setAutoAck (0); rf.disableDynamicPayloads (); rf.setPayloadSize (32); rf.openReadingPipe (0, pipe_rx); rf.setCRCLength (RF24_CRC_DISABLED); rf.disableCRC (); rf.startListening (); // прослушивание данных uECG // Обратите внимание, что uECG следует переключить в режим необработанных данных (долгим нажатием кнопки) // для отправки совместимых пакетов, по умолчанию он отправляет данные в режиме BLE, // которые не могут быть получены nRF24} long last_pix_upd =0; byte in_pack [32]; int rf_bpm =0; int bpm_hist [5]; // поскольку мы отключили CRC, необходимо отфильтровать входящие данные, чтобы избежать loop () {if (rf.available ()) {rf.read (in_pack, 32); int bb =in_pack [5]; // BPM расположен в 5-м байте пакета // подробная структура пакета находится в документации uECG // поскольку у нас нет CRC по соображениям совместимости, нам нужно фильтровать // входящие данные, радиоканал может быть шумным. Мы сравниваем последние 5 // полученных значений BPM и используем одно только в том случае, если все 5 были одинаковыми. // Поскольку uECG отправляет около 100 пакетов в секунду, это не вызовет // какой-либо заметной задержки в отображении данных для (int n =0; n <5-1; n ++) // сдвинуть массив истории ударов в минуту на 1 bpm_hist [n ] =bpm_hist [n + 1]; bpm_hist [4] =bb; // добавляем новое значение ударов в минуту для (int n =0; n <5; n ++) // проверяем, все ли равны if (bpm_hist [n]! =bb) bb =-1; if (bb> 0) // если да - сохранить как новый полученный BPM rf_bpm =bb; } long ms =millis (); if (ms - last_pix_upd> 10) // не обновляйте пиксели слишком часто {int r, g, b; last_pix_upd =мс; int bpm =rf_bpm; int max_bright =160; // значение максимальной яркости, max 255. Но вам не всегда нужно максимальное значение :) float dd =25; // изменение BPM между цветовыми тонами (синий-> зеленый-> желтый-> розовый-> красный) float t1 =90, t2, t3, t4; // t1 - "базовый" BPM, ниже t1 будет синий t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; // код для изменения цвета в зависимости от того, в каком диапазоне t1 ... t4 мы сейчас находимся if (bpm  

Схема

Нет документа.

nrf24_led_ring_o2Gij5oigT.fzz

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

  1. Renesas и Altran разрабатывают носимый чипсет с использованием 3db Access UWB
  2. Монитор окружающей среды и качества воздуха своими руками
  3. Датчик температуры Python и Raspberry Pi
  4. Следите за температурой в доме с помощью Raspberry Pi
  5. Удаленный монитор сердечного ритма
  6. Создание монитора Ambilight с помощью Arduino
  7. Вольтметр своими руками с использованием Arduino и смартфона
  8. Монитор сердечного ритма с использованием Интернета вещей
  9. Датчики, встроенные в одежду, монитор сердечного ритма
  10. Материалы и компоненты, изготовленные на станках с ЧПУ