NILTON SERIGIOLI
Santo André
2011
ii
NILTON SERIGIOLI
Santo André
2011
iii
SERIGIOLI, Nilton
Monitoramento de sinais biomédicos baseado em computação móvel / Nilton Serigioli —
Santo André : Universidade Federal do ABC, 2011.
AGRADECIMENTOS
Agradeço a Deus, pela proteção e alicerce nos momentos de
insegurança e de fraqueza.
RESUMO
ABSTRACT
SUMÁRIO
LISTA DE ABREVIATURAS
ECG Eletrocardiograma
EMG Eletromiograma
Hb Hemoglobina Reduzida
Kpa Quilopascal
LISTA DE FIGURAS
Figura 1. Sistema de medição biomédica. (Adaptado Carvalho,2008) .. 26
Figura 2. Polarização básica do fotodiodo. ........................................... 31
Figura 3. Curvas características de um fotodiodo para diferentes
intensidades luminosas. ................................................................................... 31
Figura 4. Amplificador de transimpedância . ...................................... 32
Figura 5. Sensor de pressão configurado em uma ponte Wheatstone.
(Webster, 1998)................................................................................................ 36
Figura 6. Esfigmomanometria. (Webster, 1998). .................................. 37
Figura 7. Diagrama de bloco de um esfigmomanômetros automático. .. 38
Figura 8. Ponta de prova de oximetria. (Philips Medical Systems). ...... 39
Figura 9. Absorção. (Philips Medical Systems)...................................... 39
Figura 10. Absorção da hemoglobina. (The Electrode Co. Ltd, 2005) ... 40
Figura 11: Princípio da lei de Beer-Lambert. ......................................... 42
Figura 12. Onda de pulso f(t) ................................................................. 47
Figura 13. Diagrama em blocos da arquitetura do protótipo .................. 50
Figura 14 Protótipo ................................................................................ 51
Figura 16. Medidor de Pressão arterial ................................................. 52
Figura 15. Diagrama de blocos do módulo de pressão arterial.............. 52
Figura 17. Sensor de Pressão MPX2050. (Freescale Semiconductors).53
Figura 18. Gráfico tensão de saída em relação a pressão diferencial. .. 54
Figura 19. Diagrama eletrônico do medidor de pressão. ....................... 55
Figura 20. Amplificador para instrumentação. ....................................... 55
Figura 21. Amplificador para instrumentação INA118P. ........................ 56
Figura 22. Sinal CP da Tensão de Saída do Sensor de Pressão. ......... 58
Figura 23. Sinal das Oscilações da Saída do Amplificador.................... 58
Figura 24. Circuito Eletrônico Módulo de Pressão Arterial .................... 59
Figura 25. Amplificação do sinal do sensor (pressão arterial de
80mmHg).......................................................................................................... 60
Figura 26- Amplificação do sinal do sensor (pressão arterial de
120mmHg)........................................................................................................ 60
Figura 27. Filtro passa alta e filtro passa baixa...................................... 61
Figura 28. Diagrama de blocos do módulo oxímetro. ............................ 62
xiv
Figura 29. Circuito de seleção e controle de intensidade dos LED’s ..... 63
Figura 30. Acionamento do LED vermelho (LED1). ............................... 64
Figura 31. Acionamento do LED infravermelho (LED2). ........................ 64
Figura 32. Controle por PWM. Ajuste do ciclo ativo em 100%............... 65
Figura 33. Controle por PWM. Ajuste do ciclo ativo em 75%................. 65
Figura 34. Controle por PWM. Ajuste do ciclo ativo em 50%................. 66
Figura 35. Circuito Eletrônico do Módulo de Aquisição Oxímetro. ......... 67
Figura 36. Circuito Somador .................................................................. 71
Figura 37. Estagio 2 .Filtro passa alta ................................................... 72
Figura 38. Estágio 3 - Filtro passa baixa................................................ 72
Figura 39. Estágio 5 - Amplificador não inversor ................................... 73
Figura 40. Estágio 6 - Deslocamento do Sinal ...................................... 74
Figura 41. Relação entre a saturação de oxigênio (%S) e o fator (R) para
os métodos de Beer-Lambert e pelo empírico.................................................. 75
Figura 42. Gráfico de SaO2 em função do fator R ................................. 77
Figura 43. Relação entre a saturação de oxigênio (%S) e o fator (R) para
os métodos de Beer-Lambert e pelo empírico, determinados após calibração. 78
Figura 44. Diagrama em Blocos Comunicação Serial ........................... 83
Figura 45. Diagrama de Blocos do Conjunto Controlador e Display. .... 84
Figura 46. Montagem Eletrônica do Protótipo........................................ 85
Figura 47. Avaliação dos Resultados .................................................... 85
Figura 48. Sinal CP da Tensão de Saída do Sensor de Pressão e Sinal
das Oscilações da Saída do Amplificador. ....................................................... 86
Figura 49. Intefaces de comunicação .................................................... 87
Figura 50. Medição dos sinais de controle dos LED's ........................... 88
Figura 51. Resultados de um Oxímetro de Pulso implementado por um
DSP TMS320VC5505 (Medical Development Kit). Fonte: Texas Instrument .
Application Report. ........................................................................................... 89
Figura 52. LED infravermelho em funcionamento. ................................. 90
Figura 53. LED vermelho em funcionamento......................................... 90
Figura 54. LED infravermelho e vermelho em funcionamento. .............. 91
Figura 55. Display Gráfico. .................................................................... 91
Figura 56. Teste de comunicação modem ............................................. 93
Figura 57. Recepção dos sinais pelo telefone celular ............................ 94
xv
LISTA DE TABELAS
1 INTRODUÇÃO
Motivação e Justificativa
1
Setor que não lida diretamente com o público
18
1.2 Objetivos.
2. REVISÃO BILBIOGRÁFICA
A coleta de dados, onde os pacientes vivem é vital, pois muitos não têm
acesso a um hospital. A coleta de dados é mais eficiente e confiável quando
22
Sinal de
Calibração Realimentação
• Estáticos: são “sinais estáveis”, ou seja, que não mudam com o tempo, ou
mudam muito pouco e de maneira bem lenta. Logo, não trazem informação
(mudança significativa de valor). Exemplo: Temperatura.
A seguir são dados alguns exemplos de sinais biomédicos e suas
aplicações.
Tabela 1. Exemplos de sinais biomédicos (Carvalho, 2008)
Parâmetros Faixa de Faixa de Transdutor
fisiológicos amplitude do frequência
sinal do sinal
Fluxo 1 – 300 ml/s 0 – 20Hz Fluxômetro
sanguíneo eletromagnético, ultrasônico
Pressão arterial 0 – 400 mmHg 0 – 30Hz Capacitivo, indutivo, strain-
gauge
ECG 0,1 – 5mV 0,05 - 100Hz ECG
Fluxo 0 – 600 l/min 0 – 40Hz Pneumotacógrafo com
respiratório transdutor indutivo,
capacitivo
Luz
P N
_ +
I reversa
R
_ +
(1)
impedância permite obter baixos níveis de ruído, porém a largura de banda que
pode ser obtida é geralmente baixa. No caso do amplificador transimpedância,
um bom compromisso entre desempenho em termos de ruído (sensibilidade) e
largura de banda pode ser obtido (Stephen,1997).
Absorção devido a:
Pulsos cardíacos
Sangue arterial
Sangue venoso
Tecidos e ossos
. Tempo
Figura 9. Absorção. (Philips Medical Systems).
2 (2)
2
(3)
(4)
log
(5)
43
…
(6)
(7)
(8)
(9)
0
44
(10)
(11)
(12)
3226,56
602,24
Hemoglobina desoxigenada:
319,6
1204
(13)
(14)
(15)
Para uma onda de pulso f(t) com um valor inferior ymin e um valor
superior ymax e um ciclo ativo (duty cycle) D (ver Figura 12), o valor médio da
onda é dado por:
(16)
47
Como f(t) é uma onda de pulso, seu valor é Ymax para 0< t < D.T e seu
valor é Ymin para D.T < t < T.
. . (17)
. 1 (18)
. (19)
Display
Módulo de Microcontrolador RS 232 Gráfico
Pressão Arterial
Módulo de
Oximetria Interface MODEM GSM
Usuário
Módulo de transferência
Figura 14 Protótipo
MODEM
GSM
Módulo de Aquisição – Pressão Arterial
Microcontrolador
ADC1 RS‐232
Sensor de Amplificador Filtro
Pressão
ADC2
Sistema pneumático Processador
LCD Interface
Display Usuário
Pressure Signal
VCC
5V
Pressure Sensor R1 R2
LINE
VOLTAGE
VREG C4
1kΩ 150kΩ 220uF
COMMON
C1 Oscillation Signal
33uF U2B
7 U4 6 4
3 7
8 C2
5
R6 6 11 C3
470Ω
1
TLV2764IN 220uF
330nF
2
VCC
4 5 INA118P 5V
R4
22kΩ R3
1MΩ
R5
10kΩ
V2
R
R
Vout
Vout' R
RG
R
V1
2 (20)
′ 1 2 1 1 2
1 (21).
1 106 (22).
57
1 1 (23)
0,48
2 . 3. 2 2 . 1. 10 . 0,33. 10
1 1 (24)
4,8
2 . 1. 1 2 . 1. 10 . 33. 10
2 150 (25)
1 1 151
1 1
VCC R4 R5
5V
1kΩ 150kΩ
VCC
R9 R10 C1 VCC
300Ω 280Ω 5V 33uF
5V
7
3 U1 U2B
6 4
R11 R12 8
300Ω 300Ω 6
7
1 5 C2
11
R7 2
Sensor de Pressão
C3
220uF
ã í 910
107
ã 8,48
A Figura 26 representa os resultados encontrados na simulação para
uma pressão de 120mmHg.
ã í 1,374
106
ã 0,013
Com essas simulações pode-se comprovar o ganho do circuito,
conforme equação (22).
Em – 2,96 (-3db)
a freqüência é de
0,48Hz.
Em – 2,96 (-3db)
a freqüência é
de 4,8Hz.
.
Figura 27. Filtro passa alta e filtro passa baixa.
Display MODEM
Módulo de Aquisição Oxímetro Gráfico GSM
Saídas
Controle
PWM
Processador
LEDS
Interface
Módulo Principal Usuário
Nível “0”
Nível “1”
Duty cycle
750µs
0 R19 10 R20
Estágio 4 Estágio 5
R14 R6 10kΩ 10kΩ X1
0 10kΩ 10kΩ 11 0V
R9
4
U5A
19 Saída
20 2
4
U4A 10kΩ 1
2 C8 8 U6A 123
23 3 R18
R11 18
1
9 8
LF353D
3 220nF R15 1
10kΩ
47kΩ 8
LF353D 1MΩ 2
16
4 LF353D 22 Estágio 6
C6 V1
1uF 5V
R16 25 R17
0 0100kΩ 100kΩ 0
220kΩ 50%
Key=A V2
5V
R21 17
(26)
1,4 (28)
69
(29)
Onde:
• fc é a frequência de ganho unitário do amplificador operacional;
• Ci é a capacitância de entrada total (capacitância da junção
fotodiodo mais a capacitância de entrada do amplificador
operacional;
• Rf é a resistência de realimentação.
1,414 (30)
2
Onde: R= 1,5MΩ , C= 2,2µF.
Então: Fc= 0,07Hz
Nível DC 1V
T= 500ms
F= 2Hz
220
1 3,2
100
Figura 41. Relação entre a saturação de oxigênio (%S) e o fator (R) para os métodos
de Beer-Lambert e pelo empírico.
Fonte: Texas Instruments.
(32)
∑ ∑ ∑ ∑ (33)
∑ ∑
∑ ∑ ∑ (34)
∑ ∑
1 0,5 100
2 0,75 92
3 1,00 80
4 1,25 72
5 1,50 62
6 1,75 45
7 2,00 25
8 2,25 9
9 2,30 0
135 55 (35)
SaO2 SaO2
n Ri Empírico Beer-Lambert
1 0,5 107,53 91,20
2 0,75 93,81 82,63
3 1 80,10 74,79
4 1,25 66,38 67,60
5 1,5 52,67 60,98
6 1,75 38,96 54,86
7 2 25,24 49,19
8 2,25 11,53 43,92
9 2,3 8,78 42,91
Figura 43. Relação entre a saturação de oxigênio (%S) e o fator (R) para os métodos
de Beer-Lambert e pelo empírico, determinados após calibração.
79
O modelo GSM é uma solução wireless (sem fio), que acessa a rede
GSM da mesma forma que os aparelhos celulares. O que difere é que o
modem não dispõe de periféricos, como teclado, display, microfone e auto
falante como um telefone celular, portanto há a necessidade de associar outros
dispositivos como por exemplo um microcontrolador.
• Resposta automática.
Comando Comentário
Tabela 6. Comandos AT
Comando Descrição
2
Entende-se por circuito demultiplex como sendo um bloco que efetua a função inversa
ao multiplex, ou seja, a de enviar informações contidas em um canal a vários canais de saída.
83
Transmissão Modem
Módulo Serial
Demultiplex
Principal
Canais de
Módulo
Seleção
Gráfico
4. RESULTADOS
Ponte H
Controlador
LCD Gráfico
Recepção
oximetria
Display
Protótipo medidor de
gráfico sinais biomédicos
Modem
GSM
Ponta de prova
Oximetria.
Pressão
Sistólica
Pressão Oscilações
Diastólica
Figura 48. Sinal CP da Tensão de Saída do Sensor de Pressão e Sinal das Oscilações da
Saída do Amplificador.
O sinal a ser obtido com o protótipo do oxímetro deve ser similar ao sinal
ilustrado na Figura 51 que corresponde ao resultado publicado pela Texas
Instrument utilizando um processador digital de sinal (DSP)
a b
Figu
ura 57. Rece
epção dos sinais pelo tele
efone celularr
(a) Telefo
one celular tradicional
t (b) Smart phone
Pode-se
e verificar que
q a men
nsagem rec o telefone celular contém
cebida pelo
os dados
d doss sinais bio
omédicos tratados. A taxa de
e saturaçã
ão de oxig
gênio
arterrial (SaO2) é igual a 92%, a pressão diastólica é igual a 85mmHg
g e a
presssão sistólica é igu
ual a 129
9mmHg. Também
T é possíve
el visualizar o
reme
etente, datta e hora que
q a menssagem foi enviada.
e
5. CONCLUSÕES
REFERÊNCIAS BIBLIOGRÁFICAS
[6] Black, J., Koch, F., Sonenberg, L., Scheepers, R., Klandoker, A., Charry, E.,
Walker, B., Soe, N., L. “Mobile Health Solution for Front-Line Workers in
Developing Countries”. IEEE Xplore. University of Melbourne. Austrália. 2010.
[15] Germanakos P., Mourlas, C., Samaras, G. “A Mobile Agente Approach for
Ubiquitous and Personalized eHealth Information Systems.” 2005.
[18] ITU “Mobile overtakes fixed: Implications for policy and regulation.”
Genebra: União Internacional das Telecomunicações.2003.
[19] Johns, P.M. “Integrating information systems and health care”, Logistics
Information Management. 1997.
[21] Medical Eletronics, Dr. Neil Townsend, Michaelmas Term. Page 32-54.
2001.
[26] Murthy, M. V. “Mobile based Primary Health Care System for Rural
India”.2009
[32] Rao, S.S. “Integrated health care and telemedicine,” Work Study. 2001
[33] The Eletrode Co. Ltd.” Clinical Impact of LED Performance in Pulse
Oximetry. 2005.
[35] Sitronix. “Graphic LCD Module 12x64 dots”. Datasheet. Disponível em:
http://www.satistronics.com/myfiles/file/LCD/YB12864ZB.pdf. Acesso em 14 de
janeiro de 2011.
[39] Webster J. G.; contributing authors, John W. Clark ... [et al]. “Medical
Instrumentation: application and design”. John Wiley & Sons, INC.1998.
101
A.1-Módulo Principal
102
R10
10MΩ R1 C4
C1
13 750kΩ
2uF
810pF
4
U2
U3
2 C2 C3 8 U1A
15 1 2
6 3
R3 R4
8 U1B
1 3 4 5 5
3 2.2uF 2.2uF
14 2 10kΩ 10kΩ 7
7 1 5
AD549JH
C7 R13 R2 4 LF353P C5 6
0 R19 10 R20
VCC R4 R5
5V
1kΩ 150kΩ
VCC
R9 R10 C1 VCC
300Ω 280Ω 5V 33uF
5V
7
3 U1 U2B
6 4
R11 R12 8
300Ω 300Ω 6
7
1 5 C2
11
R7 2
Sensor de Pressão
C3
220uF
VCC VCC
3.3V 3.3V
M
RE0 RE1
Q1 Q2
R1 R2
1kΩ 1kΩ
BC337 BC337
105
//------------------------------------------------------------------------------
MultLinha = NULL;
delete MultLinha;
if( GLB_Conectado )
CloseHandle(hCom);
}
//------------------------------------------------------------------------------
bool EscreveDados(char* outputData,const unsigned int sizeBuffer,unsigned long& length)
{
if(WriteFile(hCom, outputData, sizeBuffer, &length,NULL) == 0)
{
return false;
}
return true;
}
//------------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{ char *teste;
bool Sucesso;
if(AbrirPorta(teste) == true)
{
GLB_Conectado = true;
Sucesso = ConfiguraControle();
Sucesso = ConfiguraTimeOuts();
if(Sucesso == false)
{
GLB_Conectado = false;
CloseHandle(hCom);
FormAviso->ShowModal();
}else{
MultLinha->Resume(); //Inicia processo.
}
}else{
GLB_Conectado = false;
FormAviso->ShowModal();
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void __fastcall TForm1::SpeedSairClick(TObject *Sender)
{
GLB_Conectado = false;
CloseHandle(hCom);
Close();
}
//------------------------------------------------------------------------------
//Mostra string de forma sincronizada.
void __fastcall TMultLinha::MostraString(void)
{
Form1->LabelStrRecebida->Caption = StrComandos;
}
//------------------------------------------------------------------------------
//FUNÇÃO PRINCIPAL
//------------------------------------------------------------------------------
void __fastcall TMultLinha::Execute()
{
unsigned int cont=0;
DWORD BytesEscritos; //Para armazenar a quantidade de dados escritos.
DWORD BytesLidos; //Para armazenar a quantidade de dados lidos.
String pressao, apagar;
{
cont = 0;
if(BytesLidos > 0) //Se algum caracter foi lido.
{
BufferRecebe[BytesLidos] = '\0'; //Finaliza string.
StrComandos += BufferRecebe; //Vai guardando o que recebeu na variável StrComandos.
Form1->Label4->Caption = StrComandos;
pressao = (StrComandos.SubString(1,4));
Form1->Label6->Caption = pressao;
Synchronize(MostraString); //Mostra string de forma sincronizada.
pressao = (StrComandos.SubString(1,4));
Form1->Label4->Caption = StrComandos.SubString(1,4);
}
/////////////////////////////////fim do programa////////////////////////////////
StrComandos = "\0"; // qdo desabilitado nao atualiza
BufferRecebe[cont] = '\0';
cont++;
}
}
}
}
else
{
Sleep(10); //Necessário para não travar processo.
}
}
}
113
O código fonte apresentado foi desenvolvido no software MPLAB IDE V 8.36 com o
compilador C18.
#include <P18f4550.h>
#include <delays.h>
#include <adc.h>
#include <timers.h>
#include <usart.h>
#include <stdio.h>
#include <math.h>
// variáveis
unsigned int inicia_oxi=0, inicia_pressao=0;
// oximetro
unsigned int contador=0, leitura=0, clock=0;
unsigned int sao2_usart;
unsigned int media_vm=0, acum=0, vermelho=0, acumulado_vm=0, ciclo=0;
unsigned int media_infra=0, acum_ir=0,infra=0,acumulado_ir=0;
float sao2=0, fator_r=0, total_vm=0, total_ir=0;
#define b0 PORTBbits.RB6
114
#define b1 PORTBbits.RB7
#define b2 PORTEbits.RE2
#define b3 PORTAbits.RA4
void escreve(char);
void int_alta(void)
{
_asm GOTO ISR_alta_prioridade
_endasm
}
#pragma code
// INTERRUPÇÃO TMR0
#pragma interrupt ISR_alta_prioridade
void ISR_alta_prioridade(void)
{
TMR0H=255;
TMR0L=10; // (255-10=245 micro segundos)
INTCONbits.TMR0IF=0;
clock++;
}
// ************************************************************************
aux=grandeza/10;
aux2=aux/10;
dezena=aux%10;
centena=aux2%10;
milhar=aux2/10;
milhar= milhar+48;
centena= centena+48;
dezena = dezena+48;
unidade= unidade+48;
}
lcd1=0x30;
pulso();
lcd1=0x30;
lcd1=0x01;
pulso();
Delay1KTCYx(1);
lcd1=0x0C;
pulso();
lcd1=0x06;
pulso();
Delay1KTCYx(1);
}
void espaco(void)
{
rs=0;
en=1;
lcd1=0x14;
Delay10TCYx(1);
en=0;
Delay10TCYx(4);
rs=1;
}
void limpa(void)
{
rs=0;
lcd1=0x01;
pulso();
Delay1KTCYx(1);
}
Delay1KTCYx(1);
}
void pulso(void)
{
Delay1TCY();
en=1;
Delay10TCYx(1);
en=0;
Delay1KTCYx(1);
}
// ****************************************************************************
unsigned int filtro_canal()
{
unsigned int cont_filtro;
unsigned long valor_canal=0;
if (sensor_oxi >vermelho)
vermelho=sensor_oxi; // armazena pico vermelho
}
pwm2=1;
ir=0;
flag2=0;
// leitura entrada analógico do oximetro
ConvertADC();
while(BusyADC());
sensor_oxi=ReadADC();
if (sensor_oxi >infra)
infra=sensor_oxi; // armazena pico infra
}
if(clock>7)
{
clock=0;
ciclo++;
flag=0;
flag2=0;
}
}
// ***************************************************************************
posicao(0x8C);
Delay1KTCYx(10);
for (x=0; x<4; x++)
escreve(T2_linha1a[x]);
// leitura da pressão
if(flag_p5)
{
SetChanADC(ADC_CH0);
Delay10TCYx(5);
ConvertADC();
while(BusyADC());
pressao=ReadADC();
pressao_filtro=filtro_canal();
converte(pressao);
posicao(0x88);
Delay1KTCYx(10);
escreve(centena);
Delay1KTCYx(10);
escreve(dezena);
Delay1KTCYx(10);
escreve(unidade);
Delay1KTCYx(10);
// leitura da osilações
SetChanADC(ADC_CH2); //
Delay10TCYx(5);
ConvertADC();
while(BusyADC());
oscilacao=ReadADC();
converte(oscilacao);
}
// Leitura da pressão alta
if((oscilacao>limiar)&&(flag_p2==0)&&(flag_p))
{
filtro++;
if(filtro==2)
{
maxima=pressao_filtro;
119
flag_p2=1;
}
}
if(auxiliar<(limiar-50))
{
filtro2++;
if (filtro2==20)
{
auxiliar=0;
minima=pressao_filtro;
flag_p3=1;
}
}
}
if((flag_p3)&&(flag_p4==0))
{
filtro=0;
filtro2=0;
inicia_pressao=0;
flag_p=0,
flag_p2=0,
flag_p3=0,
flag_p4=1;
flag_p5=0;
valvula=0;
limpa();
Delay1KTCYx(10);
posicao(0x80);
Delay1KTCYx(10);
for (x=0; x<3; x++)
escreve(T2_linha1[x]);
posicao(0x88);
Delay1KTCYx(10);
for (x=0; x<4; x++)
escreve(T2_linha1a[x]);
posicao(0xc0);
Delay1KTCYx(10);
for (x=0; x<3; x++)
escreve(T2_linha2[x]);
posicao(0xc8);
Delay1KTCYx(10);
for (x=0; x<4; x++)
escreve(T2_linha1a[x]);
converte(maxima);
posicao(0x84);
Delay1KTCYx(10);
escreve(centena);
Delay1KTCYx(10);
escreve(dezena);
Delay1KTCYx(10);
escreve(unidade);
120
Delay1KTCYx(10);
converte(minima);
posicao(0xC4);
Delay1KTCYx(10);
escreve(centena);
Delay1KTCYx(10);
escreve(dezena);
Delay1KTCYx(10);
escreve(unidade);
Delay1KTCYx(10);
}
// infla sistema até 170mmHg
if(pressao>=170)
{
bomba=0;
Delay1KTCYx(100);
flag_p=1;
}
// mensagem de erro
if((flag_p)&&(pressao_filtro<40))
{
flag_p=0;
flag_p5=0;
limpa();
Delay1KTCYx(10);
posicao(0x88);
Delay1KTCYx(10);
for (x=0; x<4; x++)
escreve(T3_linha1[x]);
}}
TRISA = 0b00010111;
TRISB = 0b11000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000100;
// INTERRUPÇÃO
RCONbits.IPEN=1; // habilita prioridade
INTCON2bits.TMR0IP=1; // INTERRUPÇÃO TMR0 =ALTA,
INTCONbits.TMR0IF=0; // LIMPA FLAG TMRO
INTCONbits.GIEH=0; // habilita int de alta prioridade
INTCONbits.GIEL=0; // habilita de baixa
TMR0H=255;
TMR0L=10;
inicia_lcd();
Delay1KTCYx(15);
// Tela Inicial
posicao(0x80);
Delay1KTCYx(10);
imprime_string_lcd("Mobile Health");
posicao(0xc0);
Delay1KTCYx(10);
imprime_string_lcd("UFABC");
SetChanADC(ADC_CH1); // canal1
Delay10TCYx(5);
red=1;
pwm1=0;
ir=1;
pwm2=0;
leitura=0, ciclo=0;
while(1)
{
if(b1)// oximetro
{
INTCONbits.GIEH=1; // habilita int de alta prioridade
TMR0H=255;
TMR0L=10;
inicia_pressao=0;
inicia_oxi=1;
limpa();
posicao(0x80);
Delay1KTCYx(1);
imprime_string_lcd("Aguarde !");
INTCONbits.GIEH=1;
SetChanADC(ADC_CH1); // habilita canal ch1 AD
122
if (inicia_oxi)
oximetro();
if (inicia_pressao)
pressao_arterial();
while (BusyUSART());
}
}}
#include <16f877a.h>
#include <HDM64GS12.c>
#include <graphics.c>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7, BITS=8)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
// variáveis
int comando=0, maxima=0, minima=0;
int8 spo=0, pressao=0;
int1 controle=0, flag_a=0, flag_b=0, flag_c=0, flag_pressao=0,controle2=0;
char texto5[4]= "99%"; //valor da oximetria
char texto10[4]; // pressao diastolica
char texto11[4]; // pressao sistolica
// interrupção serial
#int_rda
void recebe()
{
if(controle == 0)
{
comando = getchar();
// recepção oximetro
if (comando=='a')
controle = 1;
}
if (controle ==1)
spo = getchar();
// Tela inicial
void tela_inicial()
{
char introducao1[]="UFABC Eng Informacao",introducao2[]="Mobile Health";
char selecao1[]="b1 Oximetro", selecao2[]="b2 Pressao Arterial", selecao3[]="b3 SMS";
glcd_text57(0,0,introducao1,1,on); // UFABC Eng Informacao
glcd_text57(5,30,introducao2,1,on); // Mobile Health
124
delay_ms(4000);
glcd_fillScreen(OFF);
glcd_rect(0, 0, 127, 63, NO, ON); // retangulo externo
glcd_text57(5,5,selecao1,1,on);
glcd_text57(5,20,selecao2,1,on);
glcd_text57(5,35,selecao3,1,on);
}
void tela_pressao()
{
set_adc_channel(1);
glcd_fillScreen(OFF);
glcd_text57(2,10,texto2,1,on);
glcd_rect(0, 0, 127, 63, NO, ON); // borda
glcd_text57(0,35,texto6,1,on); // texto diastolica
glcd_text57(90,35,texto9,1,on);
glcd_text57(0,50,texto7,1,on);
glcd_text57(90,50,texto9,1,on);
pressao = read_adc();
pressao= (4*pressao)/10;
sprintf (texto8,"%3d",pressao);
glcd_text57(70,20,texto8,1,on); // pressao real time
delay_ms(200);
sprintf (texto10,"%3u",minima);
glcd_text57(70,35,texto10,1,on); // pressao diastolica
delay_ms(200);
sprintf (texto11,"%3u",maxima);
glcd_text57(70,50,texto11,1,on); // pressao sistolica
delay_ms(200);
glcd_fillScreen(OFF);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100);
#endif
}
void tela_oximetro()
{
int i=0, sensor=0, sensor2=0;
char texto1[] = "Oximetro";
char texto4[]= "SaO2"; // texto
controle=1;
set_adc_channel(0);
glcd_fillScreen(OFF);
delay_ms(200);
glcd_text57(2,10,texto1,1,on);
delay_ms(200);
// gráfico
for (i=0;i<100;i++)
{
sensor = read_adc(); // sensor de 0 a 255
sensor = sensor/8; // sensor de 0 a 63
glcd_line((i) ,sensor*(-1), (i),sensor2*(-1), ON);
delay_ms(40);
sensor2=sensor;
}
glcd_fillScreen(OFF);
#ifdef FAST_GLCD
glcd_update();
#else
delay_ms(100);
#endif
}
void main()
{
set_tris_a(0b00000011); // configuração dos pinos de I/O
set_tris_b(0b00000000);
set_tris_c(0b11111111);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
setup_adc_ports(ALL_ANALOG);
setup_adc(adc_clock_div_32);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
if (comando== 'c')
{
flag_a=0;
flag_b=0;
flag_c=1;
}
if (flag_c)
tela_pressao();
if (flag_a)
tela_oximetro();
}
}