Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Pulsometro.cpp@0:f96c8036901e, 2015-04-20 (annotated)
- Committer:
- Nachus01
- Date:
- Mon Apr 20 03:32:22 2015 +0000
- Revision:
- 0:f96c8036901e
Puls?metro
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |