- Необходимые компоненты
- Датчик пульса SEN-11574
- Схема подключения импульсного датчика к микроконтроллеру PIC
- PIC16F877A Пояснение кода для монитора сердечного ритма
Частота сердечных сокращений - самый важный параметр в мониторинге здоровья любого человека. В современную эпоху носимых устройств существует множество устройств, которые могут измерять сердцебиение, артериальное давление, шаги, количество сожженных калорий и многое другое. Внутри этих устройств есть датчик пульса для определения частоты пульса. Сегодня мы также будем использовать датчик пульса с микроконтроллером PIC для подсчета ударов сердца в минуту и интервала между ударами, эти значения в дальнейшем будут отображаться на ЖК-дисплее размером 16x2 символа. В этом проекте мы будем использовать микроконтроллер PIC16F877A PIC. Мы уже подключили датчик пульса к Arduino для системы мониторинга пациентов.
Необходимые компоненты
- Микроконтроллер PIC16F877A
- Кристалл 20 МГц
- Конденсатор 33пФ 2 шт.
- Резистор 4,7 кОм 1 шт.
- ЖК-дисплей 16x2 символов
- Поток 10K для контроля контрастности ЖК-дисплея
- SEN-11574 Датчик пульса
- Ремешок на липучке
- Адаптер питания 5 В
- Макетная плата и соединительные провода
Датчик пульса SEN-11574
Для измерения сердцебиения нам понадобится датчик пульса. Здесь мы выбрали датчик пульса SEN-11574, который легко доступен в онлайн- или офлайн-магазинах. Мы использовали этот датчик, поскольку от производителя предоставлены образцы кодов, но это код Arduino. Мы преобразовали этот код для нашего микроконтроллера PIC.
Датчик действительно маленький и идеально подходит для считывания сердцебиения через мочку уха или на кончике пальца. Его диаметр составляет 0,625 дюйма, а толщина - 0,125 дюйма со стороны круглой печатной платы.
Этот датчик выдает аналоговый сигнал, и датчик может работать с напряжением 3 В или 5 В, ток, потребляемый датчиком, составляет 4 мА, что отлично подходит для мобильных приложений. Датчик поставляется с трехжильным кабелем с 24-дюймовым соединительным кабелем и штекером Berg на конце. Кроме того, датчик поставляется с ремешком на липучке, чтобы носить его на кончике пальца.
Схема датчика импульсов также предоставляется производителем и также доступна на сайте sparkfun.com.
Схема датчика состоит из оптического датчика сердечного ритма, RC-цепи шумоподавления или фильтров, которые можно увидеть на принципиальной схеме. R2, C2, C1, C3 и операционный усилитель MCP6001 используются для надежного усиленного аналогового выхода.
Есть несколько других датчиков для мониторинга сердечного ритма, но датчик пульса SEN-11574 широко используется в проектах электроники.
Схема подключения импульсного датчика к микроконтроллеру PIC
Здесь мы подключили датчик импульсов ко 2- му выводу блока микроконтроллера. Поскольку датчик выдает аналоговые данные, нам необходимо преобразовать аналоговые данные в цифровой сигнал, выполнив необходимые вычисления.
Кристалл осциллятор 20Mhz соединен через два OSC штифтов блока микроконтроллера с двумя керамическими конденсаторами 33pF. LCD подключен через RB порт микроконтроллера.
PIC16F877A Пояснение кода для монитора сердечного ритма
Код немного сложен для новичков. Производитель предоставил образцы кодов для датчика SEN-11574, но он был написан для платформы Arduino. Нам нужно преобразовать расчет для нашей микросхемы PIC16F877A. Полный код приведен в конце этого проекта с демонстрационным видео. А вспомогательные файлы C можно скачать отсюда.
Наш поток кода относительно прост, и мы сделали шаги, используя случай переключателя . По заявлению производителя, нам необходимо получать данные с датчика каждые 2 миллисекунды. Итак, мы использовали процедуру обработки прерывания таймера, которая запускает функцию каждые 2 миллисекунды.
Наш код в операторе switch будет выглядеть следующим образом:
Случай 1: прочитать АЦП
Случай 2: Рассчитайте сердцебиение и IBI
Случай 3: Показать сердцебиение и IBI на ЖК-дисплее
Случай 4: IDLE (ничего не делать)
Внутри функции прерывания таймера мы меняем состояние программы на Случай 1: считывание АЦП каждые 2 миллисекунды.
Итак, в функции main мы определили состояние программы и все варианты переключения .
недействительным main () { system_init (); main_state = READ_ADC; while (1) { переключатель (main_state) { case READ_ADC: { adc_value = ADC_Read (0); // 0 - номер канала main_state = CALCULATE_HEART_BEAT; сломать; } case CALCULATE_HEART_BEAT: { calculate_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; сломать; } case SHOW_HEART_BEAT: { if (QS == true) {// Было обнаружено сердцебиение // Были определены BPM и IBI // Количественная оценка "QS" true, когда Arduino обнаруживает сердцебиение QS = false; // сбросить флаг Quantified Self в следующий раз // 0.9 используется для получения более точных данных. фактически не следует использовать BPM = BPM * 0.9; IBI = IBI / 0,9; lcd_com (0x80); lcd_puts ("BPM: -"); lcd_print_number (BPM); lcd_com (0xC0); lcd_puts ("IBI: -"); lcd_print_number (IBI); } } main_state = IDLE; сломать; case IDLE: { перерыв; } по умолчанию: { } } } }
Мы используем два аппаратных периферийных устройства PIC16F877A: Timer0 и ADC.
Внутри файла timer0.c
TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Это вычисление обеспечивает прерывание таймера на 2 миллисекунды. Формула расчета:
// TimerCountMax - (((задержка (мс) * Focs (Гц)) / (PreScale_Val * 4)) / 1000)
Если мы видим функцию timer_isr , это -
void timer_isr () { main_state = READ_ADC; }
В этой функции состояние программы изменяется на READ_ADC каждые 2 мсек.
Затем функция CALCULATE_HEART_BEAT берется из примера кода Arduino.
void calculate_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; // отслеживаем время в миллисекундах с помощью этой переменной int N = sampleCounter - lastBeatTime; // отслеживаем время с момента последнего удара, чтобы избежать шума // находим пик и впадину пульсовой волны if (Signal <thresh && N> (IBI / 5) * 3) {// избегаем дихротического шума, ожидая 3/5 последнего IBI if (Signal <T) {// T - корыто T = Signal; // отслеживаем самую низкую точку пульсовой волны } } …………. ………………………..
Далее полный код приведен ниже и хорошо объяснен в комментариях. Эти данные датчика сердечного ритма могут быть дополнительно загружены в облако и отслеживаться через Интернет из любого места, что делает его системой мониторинга сердечного ритма на основе IoT, перейдите по ссылке, чтобы узнать больше.
Загрузите файлы Supporting C для этого проекта PIC Pulse Sensor здесь.