Ignacius Berendes / Mbed 2 deprecated Pulsometer

Dependencies:   mbed

Committer:
Nachus01
Date:
Mon Apr 20 03:32:22 2015 +0000
Revision:
0:f96c8036901e
Puls?metro

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nachus01 0:f96c8036901e 1 #include "mbed.h"
Nachus01 0:f96c8036901e 2
Nachus01 0:f96c8036901e 3 //Esta entrada recibe la señal cardiaca amplificada.
Nachus01 0:f96c8036901e 4 AnalogIn S(A0);
Nachus01 0:f96c8036901e 5
Nachus01 0:f96c8036901e 6
Nachus01 0:f96c8036901e 7 //Salidas:
Nachus01 0:f96c8036901e 8
Nachus01 0:f96c8036901e 9 //Se usa el led para indicar el estado del sistema.
Nachus01 0:f96c8036901e 10 DigitalOut Red(LED1);
Nachus01 0:f96c8036901e 11 DigitalOut Grn(LED2);
Nachus01 0:f96c8036901e 12 DigitalOut Blu(LED3);
Nachus01 0:f96c8036901e 13
Nachus01 0:f96c8036901e 14 //Debido a que no se espera que una frecuencia cardiaca sea mayor que 199, se usan dos Bus para contolar displays de 7 segmentos que expresan
Nachus01 0:f96c8036901e 15 //las decenas y unidades de la misma, y un LED para indicar si esta contiene una centena o no.
Nachus01 0:f96c8036901e 16 BusOut dec(D0,D1,D2,D3,D4,D5,D6);
Nachus01 0:f96c8036901e 17 BusOut uni(D8,D9,D10,D11,D12,D13,D14);
Nachus01 0:f96c8036901e 18 DigitalOut cen(D7);
Nachus01 0:f96c8036901e 19
Nachus01 0:f96c8036901e 20
Nachus01 0:f96c8036901e 21 //Variables:
Nachus01 0:f96c8036901e 22
Nachus01 0:f96c8036901e 23 float f=0; //La frecuencia promedió durante el último ciclo de medición.
Nachus01 0:f96c8036901e 24 float crit=0.5f; //Voltaje crítico: valor con el que se compara S para determinar si hay un pulso o no.
Nachus01 0:f96c8036901e 25 int t=0; //Almacena el tiempo transcurrido en el ciclo de medición.
Nachus01 0:f96c8036901e 26 int p=0; //Cuenta la cantidad de pulsos que han ocurrido en el ciclo.
Nachus01 0:f96c8036901e 27 int v0=0; //Indica si el valor actual de S es mayor que el voltaje crítico.
Nachus01 0:f96c8036901e 28 int v1=0; //Conserva el valor de v0 en la iteración anterior del ciclo.
Nachus01 0:f96c8036901e 29 int r=5; //Resolución: la longitud en segundos del ciclo de medición.
Nachus01 0:f96c8036901e 30 int u=0; //Las unidades del valor de f.
Nachus01 0:f96c8036901e 31 int d=0; //Las decenas del valor de f.
Nachus01 0:f96c8036901e 32 int c=0; //Las centenas del valor de f.
Nachus01 0:f96c8036901e 33 int ub=0; //El número a escribir en el Bus de las unidades para desplegarlas en su display correspondiente.
Nachus01 0:f96c8036901e 34 int db=0; //El número a escribir en el Bus de las decenas para desplegarlas en su display correspondiente.
Nachus01 0:f96c8036901e 35 int cb=0; //Toma un valor de 0 si la frecuencia no tiene centenas y de 1 en caso contrario.
Nachus01 0:f96c8036901e 36
Nachus01 0:f96c8036901e 37
Nachus01 0:f96c8036901e 38 //Misceláneo:
Nachus01 0:f96c8036901e 39
Nachus01 0:f96c8036901e 40 Timer tmr; //Un temporizador determina cuándo se termina cada ciclo de medición.
Nachus01 0:f96c8036901e 41
Nachus01 0:f96c8036901e 42
Nachus01 0:f96c8036901e 43 //Funciones:
Nachus01 0:f96c8036901e 44
Nachus01 0:f96c8036901e 45 void R() //Se utiliza para indicar que hay un error, el LED indicador permanece en rojo hasta que se reinicia el sistema.
Nachus01 0:f96c8036901e 46 {
Nachus01 0:f96c8036901e 47 while(1)
Nachus01 0:f96c8036901e 48 {
Nachus01 0:f96c8036901e 49 Red=0;
Nachus01 0:f96c8036901e 50 Grn=1;
Nachus01 0:f96c8036901e 51 Blu=1;
Nachus01 0:f96c8036901e 52 }
Nachus01 0:f96c8036901e 53 }
Nachus01 0:f96c8036901e 54
Nachus01 0:f96c8036901e 55 void G() //Estado natural del indicador. Se usa para decir que el sistema está encendido y funcionando, pero no se encuentra en ninguno de los otros estados.
Nachus01 0:f96c8036901e 56 {
Nachus01 0:f96c8036901e 57 Red=1;
Nachus01 0:f96c8036901e 58 Grn=0;
Nachus01 0:f96c8036901e 59 Blu=1;
Nachus01 0:f96c8036901e 60 }
Nachus01 0:f96c8036901e 61
Nachus01 0:f96c8036901e 62 void B() //El indicador se enciende en azul para indicar que S es mayor que el voltaje crítico, durante un pulso.
Nachus01 0:f96c8036901e 63 {
Nachus01 0:f96c8036901e 64 Red=1;
Nachus01 0:f96c8036901e 65 Grn=1;
Nachus01 0:f96c8036901e 66 Blu=0;
Nachus01 0:f96c8036901e 67 }
Nachus01 0:f96c8036901e 68
Nachus01 0:f96c8036901e 69 void getf() //Get Frequency: Esta función calcula la frecuencia promedio de la señal S en un intervalo dado por la resolución r.
Nachus01 0:f96c8036901e 70 {
Nachus01 0:f96c8036901e 71 tmr.reset(); //Al inicio de cada ciclo de medición se reinicia el temporizador.
Nachus01 0:f96c8036901e 72 p=0;
Nachus01 0:f96c8036901e 73 while(t<r) //La duración del ciclo está dada por r.
Nachus01 0:f96c8036901e 74 {
Nachus01 0:f96c8036901e 75 v1=v0; //Al comienzo de cada iteración, v1 adquiere el valor que tenía v0.
Nachus01 0:f96c8036901e 76 if(S.read()>crit)
Nachus01 0:f96c8036901e 77 {
Nachus01 0:f96c8036901e 78 v0=1; //Cuando S supera al voltaje crítico, v0 toma un valor de 1
Nachus01 0:f96c8036901e 79 if (v0>v1) //La primera vez que sucede esto, se cuenta el pulso.
Nachus01 0:f96c8036901e 80 {
Nachus01 0:f96c8036901e 81 p++;
Nachus01 0:f96c8036901e 82 }
Nachus01 0:f96c8036901e 83 else //De la segunda vez consecutiva en adelante, el indicador marca que hay un pulso.
Nachus01 0:f96c8036901e 84 {
Nachus01 0:f96c8036901e 85 B();
Nachus01 0:f96c8036901e 86 }
Nachus01 0:f96c8036901e 87 }
Nachus01 0:f96c8036901e 88 else //Una vez que S se encuentra por debajo del valor crítico, v0 vuelve a ser 0 y el inicador vuelve a su estado natural.
Nachus01 0:f96c8036901e 89 {
Nachus01 0:f96c8036901e 90 v0=0;
Nachus01 0:f96c8036901e 91 G();
Nachus01 0:f96c8036901e 92 }
Nachus01 0:f96c8036901e 93 t=tmr.read(); //El rastreo del temporizador se hace después de cada medición.
Nachus01 0:f96c8036901e 94 }
Nachus01 0:f96c8036901e 95 G(); //El indicador es azul únicamente si hay un pulso y se está midiendo.
Nachus01 0:f96c8036901e 96 f=(60/r)*(p/t); //La expresión p/t es la frecuencia en pulsos cada ciclo, por lo que se multiplica por 60/r para obtener ppms.
Nachus01 0:f96c8036901e 97 c=floor(f/100);
Nachus01 0:f96c8036901e 98 d=floor(f/10)-(10*c); //se separan el valor de f en centenas, decenas y unidades.
Nachus01 0:f96c8036901e 99 u=f-(10*d)-(100*c);
Nachus01 0:f96c8036901e 100 }
Nachus01 0:f96c8036901e 101
Nachus01 0:f96c8036901e 102 void printd() //Print Display: Despliega el valor los valores de c, d y u en sus correspondientes salidas.
Nachus01 0:f96c8036901e 103 {
Nachus01 0:f96c8036901e 104 if(c<2) //Normalmente, c es binario, por lo que se avisa de un error caso contrario
Nachus01 0:f96c8036901e 105 {
Nachus01 0:f96c8036901e 106 if(c==0)
Nachus01 0:f96c8036901e 107 {
Nachus01 0:f96c8036901e 108 cb=0; //cb será el valor que tome la salida digital de las centenas.
Nachus01 0:f96c8036901e 109 }
Nachus01 0:f96c8036901e 110 else if(c==1)
Nachus01 0:f96c8036901e 111 {
Nachus01 0:f96c8036901e 112 cb=1;
Nachus01 0:f96c8036901e 113 }
Nachus01 0:f96c8036901e 114 else
Nachus01 0:f96c8036901e 115 {
Nachus01 0:f96c8036901e 116 R();
Nachus01 0:f96c8036901e 117 }
Nachus01 0:f96c8036901e 118 }
Nachus01 0:f96c8036901e 119 else
Nachus01 0:f96c8036901e 120 {
Nachus01 0:f96c8036901e 121 R();
Nachus01 0:f96c8036901e 122 }
Nachus01 0:f96c8036901e 123
Nachus01 0:f96c8036901e 124 if(d==0) //Para cada valor que pueden tomar los dígitos hay un número decimal que se debe aplicar al Bus para desplegarlo.
Nachus01 0:f96c8036901e 125 {
Nachus01 0:f96c8036901e 126 db=119;
Nachus01 0:f96c8036901e 127 }
Nachus01 0:f96c8036901e 128 else if(d==1)
Nachus01 0:f96c8036901e 129 {
Nachus01 0:f96c8036901e 130 db=36;
Nachus01 0:f96c8036901e 131 }
Nachus01 0:f96c8036901e 132 else if(d==2)
Nachus01 0:f96c8036901e 133 {
Nachus01 0:f96c8036901e 134 db=93;
Nachus01 0:f96c8036901e 135 }
Nachus01 0:f96c8036901e 136 else if(d==3)
Nachus01 0:f96c8036901e 137 {
Nachus01 0:f96c8036901e 138 db=109;
Nachus01 0:f96c8036901e 139 }
Nachus01 0:f96c8036901e 140 else if(d==4)
Nachus01 0:f96c8036901e 141 {
Nachus01 0:f96c8036901e 142 db=46;
Nachus01 0:f96c8036901e 143 }
Nachus01 0:f96c8036901e 144 else if(d==5)
Nachus01 0:f96c8036901e 145 {
Nachus01 0:f96c8036901e 146 db=107;
Nachus01 0:f96c8036901e 147 }
Nachus01 0:f96c8036901e 148 else if(d==6)
Nachus01 0:f96c8036901e 149 {
Nachus01 0:f96c8036901e 150 db=123;
Nachus01 0:f96c8036901e 151 }
Nachus01 0:f96c8036901e 152 else if(d==7)
Nachus01 0:f96c8036901e 153 {
Nachus01 0:f96c8036901e 154 db=37;
Nachus01 0:f96c8036901e 155 }
Nachus01 0:f96c8036901e 156 else if(d==8)
Nachus01 0:f96c8036901e 157 {
Nachus01 0:f96c8036901e 158 db=127;
Nachus01 0:f96c8036901e 159 }
Nachus01 0:f96c8036901e 160 else if(d==9)
Nachus01 0:f96c8036901e 161 {
Nachus01 0:f96c8036901e 162 db=111;
Nachus01 0:f96c8036901e 163 }
Nachus01 0:f96c8036901e 164 else
Nachus01 0:f96c8036901e 165 {
Nachus01 0:f96c8036901e 166 R();
Nachus01 0:f96c8036901e 167 }
Nachus01 0:f96c8036901e 168
Nachus01 0:f96c8036901e 169 if(u==0) //Lo mismo sucede para las unidades que para las decenas. Se indica error en caso de que alguna variable tome un valor no válido.
Nachus01 0:f96c8036901e 170 {
Nachus01 0:f96c8036901e 171 ub=119;
Nachus01 0:f96c8036901e 172 }
Nachus01 0:f96c8036901e 173 else if(u==1)
Nachus01 0:f96c8036901e 174 {
Nachus01 0:f96c8036901e 175 ub=36;
Nachus01 0:f96c8036901e 176 }
Nachus01 0:f96c8036901e 177 else if(u==2)
Nachus01 0:f96c8036901e 178 {
Nachus01 0:f96c8036901e 179 ub=93;
Nachus01 0:f96c8036901e 180 }
Nachus01 0:f96c8036901e 181 else if(u==3)
Nachus01 0:f96c8036901e 182 {
Nachus01 0:f96c8036901e 183 ub=109;
Nachus01 0:f96c8036901e 184 }
Nachus01 0:f96c8036901e 185 else if(u==4)
Nachus01 0:f96c8036901e 186 {
Nachus01 0:f96c8036901e 187 ub=46;
Nachus01 0:f96c8036901e 188 }
Nachus01 0:f96c8036901e 189 else if(u==5)
Nachus01 0:f96c8036901e 190 {
Nachus01 0:f96c8036901e 191 ub=107;
Nachus01 0:f96c8036901e 192 }
Nachus01 0:f96c8036901e 193 else if(u==6)
Nachus01 0:f96c8036901e 194 {
Nachus01 0:f96c8036901e 195 ub=123;
Nachus01 0:f96c8036901e 196 }
Nachus01 0:f96c8036901e 197 else if(u==7)
Nachus01 0:f96c8036901e 198 {
Nachus01 0:f96c8036901e 199 ub=37;
Nachus01 0:f96c8036901e 200 }
Nachus01 0:f96c8036901e 201 else if(u==8)
Nachus01 0:f96c8036901e 202 {
Nachus01 0:f96c8036901e 203 ub=127;
Nachus01 0:f96c8036901e 204 }
Nachus01 0:f96c8036901e 205 else if(u==9)
Nachus01 0:f96c8036901e 206 {
Nachus01 0:f96c8036901e 207 ub=111;
Nachus01 0:f96c8036901e 208 }
Nachus01 0:f96c8036901e 209 else
Nachus01 0:f96c8036901e 210 {
Nachus01 0:f96c8036901e 211 R();
Nachus01 0:f96c8036901e 212 }
Nachus01 0:f96c8036901e 213 cen.write(cb);
Nachus01 0:f96c8036901e 214 dec.write(db); //Finalmente, se envia cada valor a la salida correspondiente.
Nachus01 0:f96c8036901e 215 uni.write(ub);
Nachus01 0:f96c8036901e 216 }
Nachus01 0:f96c8036901e 217
Nachus01 0:f96c8036901e 218 int main()
Nachus01 0:f96c8036901e 219 {
Nachus01 0:f96c8036901e 220 G();
Nachus01 0:f96c8036901e 221 tmr.start(); //El temporizador se inicia una sola vez, antes de entrar en el bucle de funcionamiento.
Nachus01 0:f96c8036901e 222 while(1) //Se alterna entre medición de frecuencia y despliegue de información.
Nachus01 0:f96c8036901e 223 {
Nachus01 0:f96c8036901e 224 getf();
Nachus01 0:f96c8036901e 225 printd();
Nachus01 0:f96c8036901e 226 }
Nachus01 0:f96c8036901e 227 }