- Componentes requeridos
- Sensor de pulso SEN-11574
- Diagrama de circuito para la interfaz del sensor de pulso con el microcontrolador PIC
- Explicación del código PIC16F877A para monitor de latidos cardíacos
La frecuencia cardíaca es el parámetro más importante para controlar la salud de cualquier persona. En la era moderna de los dispositivos portátiles, hay muchos dispositivos que pueden medir los latidos del corazón, la presión arterial, los pasos, las calorías quemadas y muchas otras cosas. Estos dispositivos tienen un sensor de pulso en su interior para detectar la frecuencia del pulso. Hoy, también usaremos un sensor de pulso con microcontrolador PIC para contar los latidos del corazón por minuto y el intervalo entre latidos, estos valores se mostrarán en la pantalla LCD de 16x2 caracteres. Utilizaremos el microcontrolador PIC PIC16F877A en este proyecto. Ya conectamos el sensor de pulso con Arduino para el sistema de monitoreo de pacientes.
Componentes requeridos
- Microcontrolador PIC16F877A
- Cristal de 20 Mhz
- Condensador 33pF 2 piezas
- Resistencia de 4.7k 1 pieza
- LCD de 16x2 caracteres
- Potenciómetro de 10K para control de contraste de la pantalla LCD
- SEN-11574 Sensor de pulso
- Correa de velcro
- Adaptador de corriente de 5V
- Tablero de pruebas y cables de conexión
Sensor de pulso SEN-11574
Para medir los latidos del corazón, necesitamos un sensor de pulso. Aquí hemos seleccionado el sensor de pulso SEN-11574 que está fácilmente disponible en tiendas en línea o fuera de línea. Usamos este sensor porque hay códigos de muestra proporcionados por el fabricante, pero ese es un código Arduino. Convertimos ese código para nuestro microcontrolador PIC.
El sensor es realmente pequeño y perfecto para leer los latidos del corazón en el lóbulo de la oreja o en la yema del dedo. Tiene 0.625 ”de diámetro y 0.125” de grosor desde el lado redondo de la PCB.
Este sensor proporciona una señal analógica y el sensor se puede manejar con 3 V o 5 V, el consumo de corriente del sensor es de 4 mA, lo cual es ideal para aplicaciones móviles. El sensor viene con tres alambres con un cable de conexión de 24 ”de largo y un conector macho berg en el extremo. Además, el sensor viene con una correa de velcro para los dedos para usarlo en la punta de los dedos.
El esquema del sensor de pulso también lo proporciona el fabricante y también está disponible en sparkfun.com.
El esquema del sensor consta de un sensor óptico de frecuencia cardíaca, circuitos o filtros RC de cancelación de ruido, que se pueden ver en el diagrama esquemático. R2, C2, C1, C3 y un amplificador operacional MCP6001 se utilizan para una salida analógica amplificada confiable.
Hay algunos otros sensores para la monitorización de los latidos del corazón, pero el sensor de pulso SEN-11574 se usa ampliamente en proyectos de electrónica.
Diagrama de circuito para la interfaz del sensor de pulso con el microcontrolador PIC
Aquí hemos conectado el sensor de pulso a través de un 2 nd pin del microcontrolador unidad. Como el sensor proporciona datos analógicos, necesitamos convertir los datos analógicos en señales digitales haciendo los cálculos necesarios.
El oscilador Crystal de 20Mhz está conectado a través de dos pines OSC de la unidad del microcontrolador con dos condensadores cerámicos de 33pF. La pantalla LCD está conectada a través del puerto RB del microcontrolador.
Explicación del código PIC16F877A para monitor de latidos cardíacos
El código es un poco complejo para principiantes. El fabricante proporcionó códigos de muestra para el sensor SEN-11574, pero fue escrito para la plataforma Arduino. Necesitamos convertir el cálculo para nuestro microchip, PIC16F877A. El código completo se proporciona al final de este proyecto con un video de demostración. Y los archivos C de apoyo se pueden descargar desde aquí.
Nuestro flujo de código es relativamente simple e hicimos los pasos usando una caja de interruptor . Según el fabricante, necesitamos obtener los datos del sensor cada 2 milisegundos. Entonces, usamos una rutina de servicio de interrupción de temporizador que activará una función cada 2 milisegundos.
Nuestro flujo de código en la declaración de cambio será así:
Caso 1: lea el ADC
Caso 2: Calcule el latido del corazón y el IBI
Caso 3: muestra el latido del corazón y el IBI en la pantalla LCD
Caso 4: IDLE (no hacer nada)
Dentro de la función de interrupción del temporizador, cambiamos el estado del programa al Caso 1: Leer el ADC cada 2 milisegundos.
Entonces, en la función principal , definimos el estado del programa y todos los casos de interruptores .
void main () { system_init (); main_state = READ_ADC; while (1) { cambiar (estado_principal) { caso READ_ADC: { adc_value = ADC_Read (0); // 0 es el número de canal main_state = CALCULATE_HEART_BEAT; romper; } caso CALCULATE_HEART_BEAT: { calculate_heart_beat (adc_value); main_state = SHOW_HEART_BEAT; romper; } case SHOW_HEART_BEAT: { if (QS == true) {// Se encontró un latido // Se han determinado BPM e IBI // Auto cuantificado "QS" verdadero cuando Arduino encuentra un latido QS = falso; // restablece la bandera de Quantified Self para la próxima vez // 0.9 utilizado para obtener mejores datos. en realidad no debería usarse 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; romper; caso IDLE: { descanso; } predeterminado: { } } } }
Estamos utilizando dos periféricos de hardware del PIC16F877A: Timer0 y ADC.
Dentro del archivo timer0.c, TMR0 = (uint8_t) (tmr0_mask & (256 - (((2 * _XTAL_FREQ) / (256 * 4)) / 1000)));
Este cálculo proporciona la interrupción del temporizador de 2 milisegundos. La fórmula de cálculo es
// TimerCountMax - (((retraso (ms) * Focs (hz)) / (PreScale_Val * 4)) / 1000)
Si vemos la función timer_isr , es-
vacío timer_isr () { estado_principal = READ_ADC; }
En esta función, el estado del programa cambia a READ_ADC cada 2 ms.
Luego, la función CALCULATE_HEART_BEAT se toma del código de ejemplo de Arduino.
void calculate_heart_beat (int adc_value) { Señal = adc_value; sampleCounter + = 2; // realiza un seguimiento del tiempo en mS con esta variable int N = sampleCounter - lastBeatTime; // monitorea el tiempo desde el último latido para evitar ruido // encuentra el pico y el valle de la onda de pulso if (Signal <thresh && N> (IBI / 5) * 3) {// evita el ruido dicrótico esperando 3/5 del último IBI si (Señal <T) {// T es el valle T = Señal; // realizar un seguimiento del punto más bajo en la onda de pulso } } …………. ………………………..
Además, el código completo se proporciona a continuación y se explica bien en los comentarios. Estos datos del sensor de latidos cardíacos se pueden cargar en la nube y monitorear a través de Internet desde cualquier lugar, lo que lo convierte en un sistema de monitoreo de latidos cardíacos basado en IoT. Siga el enlace para obtener más información.
Descargue los archivos C de soporte para este proyecto de sensor de pulso PIC desde aquí.