Electrocardiograma: consiste en monitorear la señal cardia de una persona. Proporcionando el numero de latidos por minuto.

Dependencies:   mbed TextLCD Keypad

main.cpp

Committer:
LeonardoLG
Date:
2019-05-31
Revision:
0:2e353d06d153

File content as of revision 0:2e353d06d153:

/* ###########################################################################
**    Archivo        : main.c
**    Proyecto       : FRDM-KL46Z_Plantilla
**    Procesador     : MKL46Z256VLL4
**    Herramienta    : Mbed
**    Version        : Driver 01.01
**    Compilador     : GNU C Compiler
**    Fecha/Hora     : 24-05-2019, 00:48, # CodeGen: 0
**    Descripción    :
**         
**         This Proyect Measures the heart rate in one minute. and shows it on a 20X4 LCD screen.
**   Componentes     : GPIO, Timer, etc ,DisplayLCD,KeyPad,Dispay 7segmentos,"AD8232 with electrodes for heart".
**   Configuraciones : Includes, Stacks y Drivers externos
**   Autores         :
**         ATEAM Development Group:
**          -Josué Leonardo López García and
**          - Antulio Morgado Valle
**
**   Versión        : Beta
**   Revisión       : A
**   Release        : 0
**   Bugs & Fixes   :
**   Date           : 24/05/2019
**                    Added support for Led_RGB
**                    22/09/2018 
**                    Added LCD Menu, Beta version (with bugs)
**
* ###########################################################################/

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:  Includes
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
#include "mbed.h"
#include "TextLCD.h" //Este archivo contiene la libreria para manipular el DiplayLCD
#include "Keypad.h" //Este archivo contiene la libreria para manipular el TecladoMatricial
//#include "MyNewTLCD.h" //Este archivo contiene la libreria para dibujar la señal de onda
/*
:...............................................................................
:  Definiciones
:...............................................................................
*/
#define TRUE 1
#define FALSE 0

/*
+-------------------------------------------------------------------------------
|  Configuración de Puertos 
+-------------------------------------------------------------------------------
*/
DigitalIn Digital(PTE1); //Confifuracion de una entrada digital 
DigitalIn Digital1(PTE0);//Confifuracion de una otra entrada digital 
DigitalOut LedG(LED1);
DigitalOut LedR(LED2);
BusOut SalidaSeg(PTB18,PTC10,PTC11,PTC7,PTB19,PTC4,PTC6,PTC0);//Confifuracion de la salida de segmentos del Diplay 7Seg 
BusOut SalidaDig(PTA12,PTD3,PTA2,PTA1);//Confifuracion de la salida de Digitos del Diplay 7Seg 
TextLCD lcd(PTE20,PTE21,PTE22,PTE23,PTB20,PTE30,TextLCD::LCD20x4); // rs, e, d4-d7 Confifuracion de la salida del DiplayLCD y sus datos
Keypad TecMat(PTE16,PTE6,PTE3,PTE2,PTE31,PTE19,PTE18,PTE17);//Confifuracion de puertos para el Teclado Matricial
DigitalOut gpo(D0);
DigitalOut led(LED_RED);
AnalogIn A(A0);//Confifuracion de la Entrada Analogica 
Timer relog;  //Timer que fungira como contador en segundos para monitoriar el tiempo
/*
+-------------------------------------------------------------------------------
|  Variables Globales de Usuario 
+-------------------------------------------------------------------------------
*/

uint16_t cont_1ms=0,scan_rate=0,counter=500,flag1,flag2,flag3,cont_10ms=0,cont_100ms=0,cont_1s=0;//Declaracion e inicializacion de los contadores y banderas
int16_t i=0;
uint16_t Digito[]={0x01,0x02,0x04,0x08};//Orden de los Digitos del Display de 7Seg
uint16_t Number[]={0x81,0xE7,0x49,0x43,0x27,0x13,0x11,0xC7,0x01,0x03,0xFF};
char key; //Variable de tipo caracter que sera designada por el teclado matricial
int released=1,tiemp=0,j=0;//inicializacion de variables de las funciones
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/

//funcion1
uint16_t Letra(uint8_t L){    //Funcion encargada de recibir un numero para despues codificarlo y poder ser mostrado en el display de 7Seg
        if(L=='0')return 0x81;
        else if(L=='1')return 0xE7;
        else if(L=='2')return 0x49;
        else if(L=='3')return 0x43;
        else if(L=='4')return 0x27;
        else if(L=='5')return 0x13;
        else if(L=='6')return 0x11;
        else if(L=='7')return 0xC7;
        else if(L=='8')return 0x01;
        else if(L=='9')return 0x03;
        else if(L=='A'||L=='a')return 0x05;
        else if(L=='B'||L=='b')return 0x31;
        else if(L=='C'||L=='c')return 0x99;
        else if(L=='D'||L=='d')return 0x61;
        else if(L=='E'||L=='e')return 0x19;
        else if(L=='F'||L=='f')return 0x1D;
        else if(L=='G'||L=='g')return 0x03;
        else if(L=='H'||L=='h')return 0x25;
        else if(L=='I'||L=='i')return 0xFD;
        else if(L=='J'||L=='j')return 0xE1;
        else if(L=='K'||L=='k')return 0x29;
        else if(L=='L'||L=='l')return 0xB9;
        else if(L=='M'||L=='m')return 0x85;
        else if(L=='N'||L=='n')return 0x75;
        else if(L=='O'||L=='o')return 0x81;
        else if(L=='P'||L=='p')return 0x0D;
        else if(L=='Q'||L=='q')return 0x07;
        else if(L=='R'||L=='r')return 0x7D;
        else if(L=='S'||L=='s')return 0x13;
        else if(L=='T'||L=='t')return 0x39;
        else if(L=='U'||L=='u')return 0xF1;
        else if(L=='V'||L=='v')return 0xA1;
        else if(L=='W'||L=='w')return 0xD1;
        else if(L=='X'||L=='x')return 0x3D;
        else if(L=='Y'||L=='y')return 0x23;
        else if(L=='Z'||L=='z')return 0x5B;
        else if(L=='-')return 0x7F;
        else if(L=='=')return 0x7B;
        else if(L=='.')return 0xFE;
        else if(L==' ')return 0xFF;
        else return 0xFF;
}

//funcion2
void barrido(){//Funcion que se encarga del barrido del display de 7Seg 
    cont_1ms++;
    scan_rate++;
    counter--;
    if(scan_rate==2)
    {
        scan_rate=0;          
        flag1=TRUE;
    }
    if(scan_rate==1)
    {         
        flag3=TRUE;
    }        
    if (cont_1ms>=10)
    {
        cont_10ms++;
        cont_1ms=0;
    }      
    if (cont_10ms>=10)
    {
        cont_100ms++;
        cont_10ms=0;
    }    
    if (cont_100ms>=10)
    {
        cont_1s++;
        cont_100ms=0;
    }    
    if (cont_1s>=10) 
    {
        cont_1s=0;
    }
    if (!counter)
    {
        counter=500;
        flag2=TRUE;            
    }
    }

//funcion3

void teclado()
{//Funcion se encarga de asignar un caracter a la variable key dependiendo del estado del teclado matricial
      key=TecMat.ReadKey();
    if(key=='\0')
    released=1;
    if((key!='\0') && (released==1))
    {
        lcd.printf("%c",key);
        released=0;  

        }
} 

//funcion4

void WelcomToECG(void){
        //Esta funcion se encarga de dar la bienvenida al ECG y dar instrucciones al usuario para su correcto funcionamiento    
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Bienvenido al ECG.");
        lcd.locate(0,1);
        lcd.printf("Por favor coloca los");
        lcd.locate(0,2);
        lcd.printf("electrodos referente"); 
        lcd.locate(0,3);
        lcd.printf("al triangulo de");wait(5);
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Eithoven.");wait(3);
        lcd.cls();
        lcd.printf("Tiempo de espera: 3 seg.");wait(05);
        lcd.cls();
lcd.locate(0,0);
lcd.printf("Por favor, mantenga");
lcd.locate(0,1);
lcd.printf("presionada la tecla ");
lcd.locate(0,2);
lcd.printf("A Si ya tiene");
lcd.locate(0,3);
lcd.printf("los electrodos ");wait(6);
lcd.cls();
    }

    
/*
#===============================================================================
|
|               P R O G R A M A     P R I N C I P A L
|
#=============================================================================== 
*/

int main()
{
 
    Ticker timer;//Declaracion de un timer usado en el barrido del display
    timer.attach_us(&barrido,500);
    
      uint16_t longitud=63;//Se designa una longitud para el mensaje que queremos mostrar
    int16_t j=0,e=0;
    while(e<3){//Lazo principal del corrimiento del display el corrimiento solo se hara 2 veces
        uint8_t Cadena[]="HOLA ESIME ZACATENCO ING EN COMUNICACIONES Y ELECTRONICA ";
        uint8_t Apaga[]=" ";
        if (flag1==TRUE){
            SalidaSeg = Letra(Apaga[0]);
            SalidaDig = Digito[-i+3];
            SalidaSeg = Letra(Cadena[i+j-5]);
        
            i++;
            if(i==4)i=0;
            if(j==longitud)j=0;
            LedR=!LedR;
            flag1=FALSE;
            
        }    
       if (flag2==TRUE){
           LedG=!LedG;
           flag2=FALSE;
           j++;
       } 
       e++;
    }
    
    
    
   
  //Inicio del Programa, se muestra en el DisplayLCD
Inicio:
      key=NULL;
    lcd.printf("ELECTROCARDIOGRAMA");wait(4);
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("Hola!");
    lcd.locate(0,1);
    lcd.printf("Este dispositivo");
    lcd.locate(0,2);
    lcd.printf("mide el ritmo "); 
    lcd.locate(0,3);
    lcd.printf("cardiaco.");wait(4);
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("Por favor, mantenga");
    lcd.locate(0,1);
    lcd.printf("presionada la tecla");
    lcd.locate(0,2);
    lcd.printf("Por 3 Seg,segun su ");
    lcd.locate(0,3);
    lcd.printf("Eleccion ");wait(4);
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("0 Para Salir");
    lcd.locate(0,1); 
    lcd.printf("1 Para Inicio");
    lcd.locate(0,2); 
    lcd.printf("2 Para Ingresar al ECG");wait(3);
    lcd.cls();wait(3);
    teclado();

while(1)
 {   //Lazo principal si se presiona la tecla '2' Entra al programa para medir el ritmo cardiaco 
     if(key=='2')
    {
 WelcomToECG();
 teclado();
 if(key=='A')  lcd.printf("Detectando Senal cardiaca");wait(3);
     lcd.cls();   
    
 for(int i=0;relog.read()<=60;i++)//Incializacion del timer para que empiece en 0 seg y termine en 60seg/1minuto 
{          
  if(i==0)//nos aseguramos que este en 0seg
  relog.start();  //empieza a contar 
  if(Digital==1||Digital1==1)//Condicion de entradas digitales "las entradas estan sicronizadas y son complementarias, es decir si una es 1 la otra es 0"
  j++;//Cuenta los pulsos e incrementa en un minuto, segun los pulso que hayan recibido las entradas digitales
  }
    lcd.cls();
   lcd.locate(0,0);
   lcd.printf("tiempo:%f",relog.read());wait(4);//muestra el tiempo que tardo en ejecutarse en segundos
   lcd.cls();
   lcd.locate(0,0);
   lcd.printf("Ritmo Cardiaco:%d",j);//Muestra cuantos 1 logicos detecto en un minuto, equivalente a los ritmos cardiacos
   lcd.locate(0,1);
   lcd.printf("Latidos/minuto");    
}
    
    
    
    
    else if(key=='0')//Si la variable key='0' sale del programa 
     {  
        lcd.locate(0,1); 
        lcd.printf("Hasta Luego");
        lcd.locate(0,2); 
        lcd.printf("Un gusto servirle :)"); 
         wait(3);
        lcd.cls();
       
        exit(-1);
         }
    else if(key=='1')
    {             //Si la variable key='1' redirecciona el programa a la parte de codigo denominada "Inicio"
    lcd.cls();
    lcd.cls();
    goto Inicio;
    }

    key=NULL; //Se borra el contenido de la variable key para no ocacionar problemas posteriores
}   
    //Fin del programa
}
/* END main */
/*
____________________________
|
|  Funciones Prototipo
|___________________________
*/


uint16_t Letra(uint8_t L);
void barrido(void);
void teclado(void);
void WelcomToECG(void);