Как подключить датчик пульса к компьютеру

Обновлено: 03.07.2024

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

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

Начиная с максимально простого и доступного, состояние здоровья сердца и сердечно-сосудистой системы можно определять по частоте сердечных сокращений или по пульсу. Пульс — это важнейший показатель качества физиологических процессов в организме, позволяющий судить о здоровом состоянии организма и его тренированности, о различных заболеваниях организма, причем не только сердца, но и других органов и систем. Пульс — это толчок крови в сосудах при сокращении сердца, производящий колебания стенок кровеносных сосудов. Пульс характеризуется следующими пара метрами: частота, ритм, напряжение и наполнение.

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

Одним из самых распространенных и недорогих способов является оптический метод, который при должном подходе может давать достаточно точный результат. В самом простом варианте можно использовать светодиод и фотодиод, с последнего просто снимается сигнал. При сокращении сердца кровь по сосудам движется неравномерно в зависимости от работы сердца и сосудов. В соответствии с этой неравномерностью будет изменяться отраженный или просвечивающий сигнал от светодиода на фотодиоде. Усилив этот сигнал можно получить не только количество сокращений сердца по амплитудам сигнала, но и приблизительную кардиограмму.





Технические характеристики датчика пульса:

  • Напряжение питания от 3 до 5 В
  • Ток потребления при напряжении питания примерно 2 мА
  • Диаметр модуля 16 мм
  • Тип выходного сигнала аналоговый
  • Способ детектирования сердечных сокращений по отраженному сигналу

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


В качестве минусов данного метода необходимо отметить, что для получения стабильного результата нужно прикладывать датчик к пальцу с некоторым позиционированием и определенной силой прижатия (не сильно, но и не слабо), аналогично для мочки уха и шеи (т.к. на шее располагаются крупные артерии, именно там получается самый четкий результат). Также при измерении любое движение будет искажать результат. При использовании схема должна быть защищена от контакта с другими проводящими объектами, чтобы не допустить искажения и ослабления сигнала.



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


Схема построена на базе микроконтроллера STM32F103C8T6. В качестве индикатора используется TFT LCD дисплей разрешением 240х320 c интерфейсом SPI на базе контроллера ILI9341. Питание схемы 3,3 В (при питании 3,3 В дисплей будет работать), что позволяет использовать Li-ion аккумуляторы при некоторой модернизации схемы для мобильности и безопасности устройства. Датчик пульса подключается к нулевому каналу АЦП1 микроконтроллера. Аналогично осциллографу по измерениям АЦП строится график на экране дисплея. По значению времени между пиками (отмеряется таймером микроконтроллера) кардиограммы определяем частоту пульса в единицу времени. Каждую миллисекунду происходит прерывание, в котором отсчитывается количество миллисекунд между пиками кардиограммы, то есть период. Для перевода в значение сердечных сокращений в минуту применяем формулу:

На экране устройства отображается приблизительная кардиограмма, получаемая с помощью датчика пульса и рассчитанное значение пульса в ударах в минуту. Таким образом, получаем простой недорогой кардиомонитор, функционал которого можно дорабатывать и дополнять.





Итак, получив данные о сердечных сокращениях, можно судить о здоровье следующим образом. У среднестатистического взрослого человека нормальный пульс составляет 60-80 ударов в минуту. У спортсменов это значение значительно ниже и более стабильно при физических нагрузках. У женщин обычно пульс чаще, а у детей в зависимости от возраста значительно чаще, чем у взрослых. Необходимо отметить, что учащение пульса возникает при физической нагрузке, при нервном напряжении, курении, потреблении чая, кофе и алкогольных напитков. Измерьте пульс в то время, когда вас посетили волнения и нервное напряжение. По величине отклонения пульса можно определить, что у вас уже имеется невроз. Наиболее нервные люди, часто волнуясь по пустякам, напрягают свою нервную систему, и тут же сердце реагирует учащенным пульсом, а сосудистая система — увеличением артериального давления. Вначале у таких людей появляется сердечно-сосудистая дистония, невроз сердца, а затем наступают серьезные заболевания сердечно-сосудистой системы. Если ваш пульс реагирует учащением на мелкие неприятности, то необходимо срочно дать отдых организму и заняться собственным оздоровлением. Учащение пульса более 100 ударов в минуту называется тахикардией и требует к себе особого внимания. По этому поводу вы обязательно должны показаться врачу. Понижение пульса до значения ниже 50 ударов в минуту называется брадикардией и также требует к себе особого внимания. По этому поводу вы обязательно должны показаться врачу, если только вы не являетесь спортсменом или не практикуете йогу. При сердечной недостаточности пульс очень медленный и слабый. Сердечная недостаточность требует обязательного вызова врача.

Ритм пульса определяется интервалами между отдельными пульсовыми ударами. У здорового человека пульсовые временные интервалы всегда одинаковы. Аритмия - это неправильность пульса, характеризуемая неодинаковыми интервалами. Неритмичный пульс может иметь несколько разновидностей. Экстрасистолия - это аритмия, связанная с появлением на интервале лишнего удара. Мерцательная аритмия характеризуется беспорядочностью пульса. Пароксизмальная тахикардия — это внезапное сильное сердцебиение.

В этом уроке мы разберём, как подключить датчик пульса к Arduino и измерять сердечный ритм. Для работы воспользуемся оптическим датчиком Pulse Sensor.

Принцип работы датчика пульса



Датчик импульсов, с которым мы будем работать, представляет собой, фотоплетизмограф, который является хорошо известным медицинским устройством, используемым для мониторинга сердечного ритма.

Фотоплетизмограмма — метод регистрации кровяного потока с использованием источника инфракрасного или светового излучения и фоторезистора или фототранзистора.

Фоторезистор меняет сопротивление в зависимости от количества поглощённого света. Чем больше кровяной поток, тем меньше света поглощается в тканях организма, следовательно, больше света приходит на фоторезистор.

Фотоплетизмограмма позволяет измерять объёмный пульс крови, вызванный периодическим изменением кровяного объёма при каждом ударе сердца, частоту сердцебиения, вариабельность сердечного ритма.

Принцип действия фотоплетизмограммы:

Сигнал сердечного пульса, который выходит из фотоплетизмографа имеет форму волны.

Подключение датчика к Ардуино

Для соединения с микроконтроллером у Pulse Sensor имеется три вывода. Подключаем их к Ардуино по следующей схеме:

Pulse SensorGNDVCCOUT
Arduino UnoGND+5VA0

Принципиальная схема:


Внешний вид макета:


Программа:

Для того, чтобы наша Ардуино подружилась с датчиком пульса, нужно установить PulseSensor Playground Library.

Заходим в меню Эскиз > Include Library > Manage Library, вбиваем в поиске PulseSensor и устанавливаем последнюю версию среди найденных результатов.

После того, как библиотека успешно установилась, выбираем в меню Файл > Образцы > PulseSensor Playground > GettingStartedProject.

Листинг нашей программы:

Компилируем проект и прошиваем в Ардуино.

В результате мы должны увидеть мигающий диод в такт нашему пульсу, когда подносим руку или палец к датчику пульса.

Аппарат для наблюдения сердечного ритма

Теперь немного усложним нашу схему и сделаем аналог прибора, который используют в больницах, чтобы отслеживать пульс пациента. Для этого добавим зуммер и светодиод, о которых рассказывалось в предыдущих уроках (Ардуино: динамик и Ардуино: управление светодиодом). Принцип действия нашего устройства будет следующим: при подключении датчика пульса должны срабатывать световой и звуковой сигналы в такт сердцебиению, при отсутствии пульса звучит непрерывный сигнал с зуммера.

Примерный вид модели прибора:


График пульса, полученный по показаниям с нашего прибора:


Прибор в действии:

Следует отметить, что значение для данных сенсора (переменная Threshold) равно 550 в нашем примере, но оно может изменяться при использовании прибора разными людьми.


Около года назад я приобрел данный девайс для контроля частоты сердечных сокращений (далее - ЧСС) во время тренировок. Датчик отлично подсоединяется к телефону, умным часам по Bluetooth, но обычно, фитнесс-приложения, анализирующие подобного рода данные требуют либо подписки, либо нагружены излишне сложными аналитиками, которые мне, как рядовому пользователю не очень интересны. Поэтому у меня родилась идея написать свое приложение для контроля ЧСС во время тренировок для IOS на Swift.

Немного теории о технологии Bluetooth LE

Bluetooth Low Energy - очень популярный и распространённый протокол обмена данными, который мы используем повсеместно и который становится все популярнее с каждым днем. У меня даже чайник на кухне управляется дистанционно через BLE. Low energy, кстати, гораздо сниженное энергопотребление в отличие от "голого" Bluetooth, настолько сниженное, что устройство готово общаться по данному протоколу на одной батарейке несколько месяцев, а то и лет.

Конечно, цитировать и переписывать спецификацию протокола BLE 5.2 нет никакого смысла, поэтому ограничимся основными понятиями.

Центральное и периферийное устройство

В зависимости от использования и назначения, устройство Bluetooth может быть:

Центральным (главным) - получает данные от периферийного устройства (наш телефон)

Периферийным - устройство, которое отправляет данные на центральное устройство (датчик ЧСС)

Рекламные пакеты данных протокола

Рекламные или оповещательные данные отправляются с периферийного устройства в виде пакетов, которые содержат в себе основную информацию об устройстве: его название, а также его функциональные возможности. Задача центрального устройства, получить их, прочитать, а после выделить из списка периферии необходимый для подключения девайс.

Объем рекламных пакетов не очень большой и вместить всю информацию об устройстве не способен. Чтобы получить доступ ко всем возможностям и характеристикам устройства, необходимо выполнить подключение, после чего считать его данные, которые, в свою очередь, могут быть предоставлены в виде:

Сервиса (услуг) - набор данных, описывающих функции устройства. В нашем случае мы увидим службу получения ЧСС.

Характеристик - дополнительных описаний сервисов устройства. Например характеристика изменения сердечного ритма в секунду, а также положения датчика на теле.

Перейдем к написанию кода

Создадим проект в Xcode с одноимённым названием, после чего добавим несколько необходимых Label в Main.storyboard и перетянем outlets этих labels во View Controller, закрепим их с помощью constraints, а также скроем их для первоначального изображения в методе viewDidLoad, как я сделал это на изображении:


Я создал outlets для текстовых значений "121" и "грудь", другие же текстовые значения просто закрепил на view, так как изменений в них делать мы не планируем.

Отладку и демонстрацию работы необходимо совершать на реальном устройстве, так как симулятор не поддерживает возможность работы по протоколу Bluetooth.


В файле Info.plist проекта необходимо добавить свойство: Bluetooth Always Usage Description и прикрепить к нему описание, чтобы уведомить пользователя об использовании данных по Bluetooth при первом запуске приложения. Если данное свойство не добавить в список, то приложение "упадет" с одноименной ошибкой. Не забывайте про это!

Подключаем библиотеку Bluetooth

Тут все просто, для подключения библиотеки воспользуемся следующей строчкой:

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

Для начала создадим переменную центрального (главного) устройства в проекте рядом с объявлением других переменных:

Теперь, чтобы получить доступ к методам необходимо назначить ViewController делегатом, но предварительно подпишем его под протокол CBCentralManagerDelegate. Сделать это предлагаю в extension ViewController, так будет рациональнее.

Xcode на такое пользовательское действие отреагирует ошибкой: "Type 'ViewController' does not conform to protocol 'CBCentralManagerDelegate'", оповещая, что данный протокол требует обязательную реализацию метода: "func centralManagerDidUpdateState(_ central: CBCentralManager)". Нажмем "fix", добавив этот метод в проект. Данный метод нужен для автоматической проверки состояния центрального менеджера, которого мы создали ранее.

Чтобы отобразить все состояния центрального менеджера, в теле метода "func centralManagerDidUpdateState(_ central: CBCentralManager)" напишем:

Xcode автоматически предложит вставить все возможные состояния данного условия, соглашаемся с ним. А в каждом из состояний напишем функцию print("это состояние"):

Теперь нам осталось проинициализировать переменную "centralManager" и задать ей делегирование. Сделаем это в методе "viewDidLoad", а в качестве параметра очереди напишем "nil", определяя всю работу про Bluetooth в главной очереди.

Поиск Bluetooth устройств

Центральный менеджер ждет дальнейших указаний, и сейчас он их получит. Для этого в методе "centralManagerDidUpdateState" в случае ".poweredOn" после метода "print" пишем:

Менеджер начнет сканировать все доступные вокруг устройства, а чтобы мы смогли увидеть их в консоли приложения, необходимо реализовать метод делегата в extension ViewController ниже метода "centralManagerDidUpdateState" следующим образом:

Запускаем приложение. И теперь в консоли мы можем увидеть множество всех доступных для подключения устройств. Замечательно! Одним из них и является необходимый для подключения пульсометр. Но чтобы упростить поиск пульсометра, можно воспользоваться некоторой хитростью, которую я сейчас покажу.

Идентификатор служб UUID

Я ранее упомянул наличие данного идентификатора в протоколе Bluetooth как уникальную характеристику для различных устройств, поэтому могу сказать вам, что пульсометры обладают таким уникальным UUID для своей непосредственной службы измерения ЧСС. Список всех UUID можно также найти в спецификации, из которой я нашел нужный: "0x180D". Добавим новую константу в проект над объявленными ранее outlets:

Также обновим метод "centralManager.scanForPeripherals(withServices: nil)" добавив в него вышенаписанный идентификатор пульсометра:

Теперь центральный менеджер находится в поиске устройств с данным UUID, и после некоторого времени в консоли появиться заветное устройство:

<CBPeripheral: 0x280214000, identifier = D5A5CD3E-33AC-7245-4294-4FFB9B986DFC, name = COOSPO H6 0062870, state = disconnected>

Теперь необходимо создать переменную в проекте, с которой мы сможем связать данное устройство, для этого рядом с "var centralManager: CBCentralManager!" напишем:

А в методе "didDiscover peripheral" свяжем найденное устройство с вышеобъявленной переменной и прекратим поиск новых устройств с помощью метода:

Подключаемся к пульсометру

Для этого напишем под строкой "centralManager.stopScan()":

Нам уже удалось подключиться к пульсометру, но чтобы это действительно увидеть, необходимо реализовать еще один метод делегата "didConnect peripheral" ниже метода "didDiscover peripheral", который автоматически вызывается при подключении нового устройства:

Собираем проект, запускаем на устройстве и видим в консоле заветное "Соединение установлено". Хороший результат, теперь двигаемся дальше.

Получаем список сервисов с пульсометра

После того, как соединение установлено, необходимо сделать запрос об услугах (сервисах), которые данный пульсометр готов предоставить. Для этого после установки соединения вызовем метод "heartRatePeripheral.discoverServices()" в методе "didConnect", который примет следующий вид:

Запрос на получение сервисов сделан, а чтобы их увидеть и начать с ними работать, необходимо расширить класс протоколом "CBPeripheralDelegate" в самом низу нашего проекта и вызвать метод "peripheral(_:didDiscoverServices:)" следующим образом:

Метод получает сервисы, сообщает об этом центральному менеджеру и выводит их в консоль. В данный момент консоль будет пуста, так как необходимо делегировать данный протокол периферийному устройству "heartRatePeripheral". Сделаем это после инициализации периферийного устройства в следующем методе:

Отлично, делегат обьявлен, метод получения сервисов написан, запустим программу на телефоне и получим в консоль список служб пульсометра:

<CBService: 0x2824b4340, isPrimary = YES, UUID = Heart Rate>

<CBService: 0x2824b4240, isPrimary = YES, UUID = Battery>

<CBService: 0x2824b4280, isPrimary = YES, UUID = Device Information>

<CBService: 0x2824b4200, isPrimary = YES, UUID = 8FC3FD00-F21D-11E3-976C-0002A5D5C51B>

Не все сервисы нам интересны и оставить необходимо лишь первый. Для этого можно провести так называемую фильтрацию с помощью идентификатора UUID в методе "heartRatePeripheral.discoverServices()"

Вот теперь список служб отобразится в виде "<CBService: 0x2824b4340, isPrimary = YES, UUID = Heart Rate>", из которой мы сможем извлечь нужные нам характеристики - ящики (№ шкафа мы уже получили).

Достаем характеристики из шкафа

Шкаф-сервис нам известен, осталось посмотреть, что он предлагает и получить это. Сделаем запрос на получение характеристик, для этого в теле метода "didDiscoverServices - peripheral" реализуем метод - поиск:

Теперь доступный сервис будет посылать свои характеристики, а увидеть мы их сможем в самостоятельном методе делегата "CBPeripheralDelegate" под названием "didDiscoverCharacteristicsFor". Реализуем его и выведем в консоль все доступные характеристики:

Запускаем программу, видим, что характеристики получены, а консоль заполнилась следующими строками:

<CBCharacteristic: 0x28024c120, UUID = 2A37, properties = 0x10, value = , notifying = NO>

<CBCharacteristic: 0x28024c180, UUID = 2A38, properties = 0x2, value = , notifying = NO>

Видно, что у данной службы две характеристики, имеющие два уникальных идентификатора. Из спецификации на Bluetooth узнаем, что UUID = 2A37 отвечает за измерение ЧСС, а UUID = 2A38 за положение датчика на теле. Положение датчика на теле не самая интересная характеристика в данной теме, но будет полезно считать и ее.

Для удобства добавим в проект два уникальных идентификатора данных характеристик следующим образом:

Характеристики отличаются друг от друга типами свойств. Например, характеристика ЧСС имеет свойство ".notify" т.е. она уведомляет об изменении значения ЧСС, а характеристика положения на теле имеет свойство ".read", т.е. может быть считана напрямую. Данное пояснение необходимо, чтобы правильно получить значения из них.

Положение пульсометра на теле

Характеристика выведена консоль, теперь нужно лишь реализовать метода считывая значений из нее. Для этого напишем запрос на чтение значений "peripheral.readValue(for: characteristic)"

Запрос написан, как вы догадываетесь, нужно реализовать еще один метод "peripheral(_:didUpdateValueFor:error:)" делегата "CBPeripheralDelegate", который будет в асинхронном режиме получать ответ с данного запроса, причем в данном методе напишем конструкцию "switch - case", чтобы была возможность разделить характеристики по уникальному идентификатору:

В консоли после выполнения данной программы появится строка "1 bytes". Это нужный результат, потому что мы пытались вывести объект типа "data".

Чтобы "распасить" данный байт, необходимо снова прибегнуть к спецификации, из которой мы сможем понять, как данный байт заполнен. Ускоряя результат, реализуем ниже функцию получения строки положения на теле датчика ЧСС из этого байта:

И теперь вызовем данную функцию в методе "didUpdateValueFor characteristic", одновременно выводя результат на экран телефона (не забудем показать скрытый label для положения датчика):

Ура! Характеристика успешно получена, прочитана и выведена на экран!


Не совсем ясно, где еще можно носить данный пульсометр, поэтому существует данная характеристика :)

Получение ЧСС и вывод на экран пользователя

Осталось совсем немного, и теперь нужно получить значения из характеристики ЧСС. Как мы помним, у нее тип значения ".notify", поэтому нам нужно как бы "подписаться на нее", чтобы она присылала обновленные значения ЧСС. Для этого нужно выполнить метод "peripheral.setNotifyValue(true, for: characteristic)" в функции "didDiscoverCharacteristicsFor service:

Если запустить приложение, то в консоли появятся стоки:

Unhandled Characteristic UUID: 2A37

Unhandled Characteristic UUID: 2A37

Unhandled Characteristic UUID: 2A37

Именно в этой характеристики и лежат данные о ЧСС. Теперь необходимо провернуть такую же развертку этих данных, обращаясь к спецификации. В некоторых моделях данные могут быть представлены либо 1 либо 2 байтами. Чтобы не получить конфуз, реализуем метод для "парсинга" этих данных в нужном порядке в протоколе "CBPeripheralDelegate".

И, наконец, добавим еще один case в методе "peripheral(_:didUpdateValueFor:error:)", в котором получим ЧСС, а также обновим и покажем label пользовательского интерфейса:


Теперь данные с пульсометра выводятся на экран телефона. Я даже слегка нервничаю :)

Итоги

В целом гайд по использованию Bluetooth для подключения датчика ЧСС вышел немного большим и местами сложным, надеюсь, что основной смысл мне удалось донести. Конечно, есть еще несколько нереализованных методов, которые можно было бы добавить (например, метод переподключения при обрыве соединения), но я посчитал этого набора достаточным, чтобы в меру оценить лаконичность и удобность библиотеки на swift CoreBluetooth.

В данной статье мы рассмотрим устройство для мониторинга сердечного ритма (пульса) на основе платы Arduino через сеть интернет, которое будет измерять пульс с помощью датчика импульсов и показывать измеренное значение пульса в BPM (Beats Per Minute – число ударов сердца в минуту). Также измеренные значения пульса мы с помощью Wi-Fi модуля ESP8266 будем передавать на сервер ThingSpeak, на котором их можно будет посмотреть из любой точки мира. Сервис ThingSpeak отлично подходит для подобных проектов, ранее мы рассматривали работу с ним в статье про мониторинг температуры через интернет.

Внешний вид устройства для мониторинга сердечного пульса на Arduino через интернет

Также ранее на нашем сайте мы рассматривали простой монитор сердечного ритма на основе Arduino, без передачи данных в сеть интернет. Рассматриваемый же в данной статье проект можно отнести к так называемой категории интернета вещей (IOT – Internet of Things).

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Датчик импульсов/пульса (Pulse sensor) (купить на AliExpress).
  3. Wi-Fi модуль ESP8266 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Потенциометр 10 кОм (купить на AliExpress).
  6. Резисторы 1 кОм (купить на AliExpress).
  7. Резисторы 220 Ом (купить на AliExpress).
  8. Светодиод (купить на AliExpress).
  9. Макетная плата.
  10. Соединительные провода.

Работа схемы

Вначале нам необходимо подключить модуль ESP8266 к плате Arduino. Модуль ESP8266 работает от напряжения 3.3V, поэтому если его подключить к контакту 5V платы Arduino, то его можно повредить. Поэтому следует подсоединить контакты VCC и CH_PD модуля ESP8266 к контакту 3.3V платы Arduino. Контакт RX модуля ESP8266 также работает от 3.3V и он также не будет взаимодействовать с платой Arduino если его подключить к ней непосредственно. Поэтому в нашей схеме мы будем использовать делитель напряжения чтобы конвертировать 5V в 3.3V. Подобный делитель напряжения можно сделать с помощью последовательного соединения 3-х резисторов как показано на схеме ниже. Соедините контакт TX модуля ESP8266 к контакту 9 платы Arduino, а контакт RX модуля ESP8266 к контакту 10 платы Arduino при помощи резисторов.
Wi-Fi модуль ESP8266 обеспечивает нашему устройству доступ в сеть интернет. Это достаточно дешевое устройство, которое можно подключить практически к любому микроконтроллеру, поэтому его так часто используют в проектах интернета вещей.

Внешний вид Wi-Fi модуля ESP8266

Затем необходимо подключить датчик импульсов к плате Arduino. Датчик импульсов имеет три контакта. Подсоедините контакт 5V и землю датчика к контактам 5V и земли платы Arduino, а информационный (сигнальный) контакт датчика – к контакту A0 платы Arduino.

Внешний вид датчика импульсов для измерения сердечного пульса

После этого подсоедините светодиод к контакту 13 платы Arduino. Вам не нужно в данном случае использовать резистор поскольку плата Arduino имеет встроенный резистор на контакте 13.

И, наконец, нам останется только подключить ЖК дисплей к плате Arduino. В схеме необходимо будет сделать следующие соединения ЖК дисплея с платой Arduino:

- pin 1 (VEE) – на землю.
- pin 2 (VDD или VCC) - к 5V.
- pin 3 (V0) – к среднему контакту потенциометра 10 кОм, а остальные 2 контакта потенциометра – к контактам VCC и GND. Потенциометр будет использоваться для управления контрастностью ЖК дисплея. Можно использовать потенциометр с сопротивлением больше чем 10 кОм.
- pin 4 (RS) - к pin 12 платы Arduino.
- pin 5 (Read/Write) – к земле платы Arduino. Он используется редко, поэтому мы и замыкаем его на землю.
- pin 6 (E) – к pin 11 платы Arduino. Контакты RS и E являются управляющими контактами ЖК дисплея и используются для передачи данных и символов.
- далее соединяем 4 контакта данных ЖК дисплея:
pin 11 (D4) - к pin 5 платы Arduino.
pin 12 (D5) - к pin 4 платы Arduino.
pin 13 (D6) - к pin 3 платы Arduino.
pin 14 (D7) - к pin 2 платы Arduino.
- pin 15 - к VCC при помощи резистора 220 Ом. Резистор используется для установки яркости черного цвета ЖК дисплея. Чем больше сопротивление резистора, тем более темным будет черный цвет.
- pin 16 – на землю.

Получившаяся схема устройства представлена на следующем рисунке.

Схема устройства для мониторинга сердечного пульса на Arduino через интернет
Конфигурирование сервиса ThingSpeak

Сервис ThingSpeak является очень удобным для проектов из категории интернета вещей. С его помощью можно мониторить данные и управлять нашей системой через сеть интернет, используя каналы и веб-страницы, предоставляемые данным сервисом. Более подробно мы его уже рассматривали в статье про мониторинг состояния погоды через сеть интернет, здесь же ограничимся более кратким его описанием.

Внешний вид главной страницы сайта thingspeak.com

После создания аккаунта идите на вкладку каналы (channels) и создайте там себе новый канал. Заполните имя канала другие необходимые поля. Также поставьте галочку напротив ‘Make Public’ (сделать публичным, общедоступным) и сохраните канал (Save the Channel). После этого ваш канал создан.

Создание нового канала в ThingSpeak.com

После этого переключитесь на вкладку API keys и скопируйте оттуда ваш API key – он вам потребуется при написании кода программы.

Принцип работы проекта

Сначала необходимо прикрепить датчик импульсов (Pulse Sensor) к любой части вашего тела в которой можно обнаружить пульс, например, к пальцу. После этого датчик импульсов будет измерять изменения в объеме крови, которые происходят во время каждого сокращения сердечной мышцы. Эти изменения в объеме крови приводят к изменению интенсивности света через эту часть тела. Затем с помощью платы Arduino необходимо всего лишь конвертировать эти изменения в BPM (число ударов сердца в минуту). Светодиод, подключенный к контакту 13, также будет мигать в соответствии с частотой сердечного ритма.

Далее плата Arduino с помощью модуля ESP8266 будет передавать эти данные на сервис ThingSpeak. На сервисе ThingSpeak эти данные будут отображаться в виде графика, который можно будет посмотреть из любой точки мира. Также измеренный пульс (в BPM) будет отображаться на ЖК дисплее нашего устройства.

График сердечного ритма на ThingSpeak.com
Отображение частоты сердечного ритма на ЖК дисплее

Исходный код программы

Первым делом при написании программы необходимо подключить все используемые библиотеки. Библиотека последовательной связи (Software serial library) используется для задействования режима последовательной связи (то есть последовательного порта) на контактах 9 и 10 платы Arduino. По умолчанию в плате Arduino для последовательной связи используются контакты 0 и 1, но с помощью Software serial library последовательную связь можно организовать и на других контактах платы Arduino. Также необходимо подключить библиотеку для работы с ЖК дисплеем (LiquidCrystal.h) и указать, к каким контактам платы Arduino подключен ЖК дисплей.

Затем необходимо ввести имя пользователя Wi-Fi, пароль и IP адрес модуля ESP8266. Затем введите API key, который вы получили на сервисе ThingSpeak.

Следующая часть кода инициализирует ЖК дисплей и устанавливает бодовую скорость передачи. Скорость передачи необходимо установить в соответствии с тем, какую скорость поддерживает ваш модуль ESP8266. Некоторые модули ESP8266 поддерживают скорость передачи 9600 бод/с, некоторые 115200, а некоторые – другую.

void setup()
<
lcd.begin(16, 2);
lcd.print("circuitdigest.com");
delay(100);
lcd.setCursor(0,1);
lcd.print("Connecting. ");
Serial.begin(9600); //or use default 115200.
esp8266.begin(9600);
Serial.println("AT");
esp8266.println("AT");
delay(5000);
if(esp8266.find("OK")) <
connectWiFi();
>
interruptSetup();
>

Следующая функция void updatebeat() будет передавать данные по IP адресу, который вы ввели, а также устанавливать необходимые значения полей для пульса.

Следующая часть кода соединяет ESP8266 с сетью Wi-Fi, данные для которой вы ввели ранее. Затем эта Wi-Fi сеть будет использоваться для передачи данных на ThingSpeak.

boolean connectWiFi() <
Serial.println("AT+CWMODE=1");
esp8266.println("AT+CWMODE=1");
delay(2000);
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
. .
. .

Следующая часть кода будет считывать значения с датчика импульсов и конвертировать их в BPM (число ударов в минуту). Также она будет управлять миганием светодиода, подключенного к контакту 13, в соответствии с частотой сердечного ритма.

ISR(TIMER2_COMPA_vect) <
cli();
Signal = analogRead(pulsePin);
sampleCounter += 2;
int N = sampleCounter - lastBeatTime;
if(Signal < thresh && N > (IBI/5)*3) <
if (Signal < T) <
T = Signal;
. .
. ..

Читайте также: