SEL0444 Projeto de Formatura II - Biblioteca Digital de ... · 3.1.2. Componentes eletrônicos do...
-
Upload
trinhxuyen -
Category
Documents
-
view
213 -
download
0
Transcript of SEL0444 Projeto de Formatura II - Biblioteca Digital de ... · 3.1.2. Componentes eletrônicos do...
UNIVERSIDADE DE SÃO PAULO
ESCOLA DE ENGENHARIA DE SÃO CARLOS
DEPARTAMENTO DE ENGENHARIA ELÉTRICA
SEL0444 – Projeto de Formatura II
Monografia
Oxímetro de pulso para medição da oxigenação periférica e
pulsação cardíaca com interface via web
Aluno: Mário Augusto Kushima
Orientador: Prof. Dr. Evandro L. L. Rodrigues
São Carlos
Novembro de 2014
MÁRIO AUGUSTO KUSHIMA
OXÍMETRO DE PULSO PARA MEDIÇÃO
DA OXIGENAÇÃO PERIFÉRICA E
PULSAÇÃO CARDÍACA COM
INTERFACE VIA WEB
Projeto de conclusão de curso apresentado à
Escola de Engenharia de São Carlos da
Universidade de São Paulo
Curso de Engenharia Elétrica com ênfase em
Eletrônica
ORIENTADOR: Prof. Dr. Evandro L. L. Rodrigues
São Carlos
Novembro de 2014
i
Agradecimentos
Os meus primeiros agradecimentos são carinhosa e merecidamente dedicados aos meus pais,
Márcia Yoshiko Hoshika Kushima e Mário Kushima, pela dedicação, compreensão e respeito em todos
os anos da minha vida.
Ao meu orientador Evandro Rodrigues, que aceitou a minha proposta para este trabalho e que
sempre esteve sugerindo novas ideias a serem desenvolvidas. Agradeço também à minha primeira
orientadora Liliane Ventura, que me ajudou a desenvolver meus conhecimentos e me apoiou em todos
os momentos.
Aos meus amigos Marcio Makiyama, Tales Santini, Lucas Freitas, Teruo Nakamine, Paula
Fujioka, Tamie Sassaki, Danilo Schwab e Leila Bravo, que não pouparam esforços para me ajudar no
desenvolvimento deste trabalho.
Ao grupo Yanagi Taiko que me acolheu desde o primeiro dia em que estive em São Carlos.
Agradeço a experiência, o conhecimento e a amizade compartilhados com Sônia Kaibara, Bruno
Watanabe, Guilherme Kawamata, Alexandre Romão e Luana Oiko.
Aos colegas de classe junto dos quais enfrentei inúmeros desafios durante estes anos de
graduação. Obrigado Bruno Callegaro, Tiago Martins, João Tardelli, Artur Duarte, Lucas Pacheco e
Tiago Perez.
E também agradeço aqui aos amigos que estiveram comigo durante todos os momentos alegres,
tristes e engraçados que vivenciei em São Carlos.
ii
iii
Resumo O monitoramento da saturação de oxigênio pela hemoglobina, um dos principais sinais vitais, é
essencial na rotina hospitalar. Tecnologias para monitorar a oximetria de forma não invasiva, rápida e
precisa, devem ser desenvolvidas para otimizar a rotina hospitalar e levar mais qualidade de vida aos
pacientes. A oximetria de pulso (absorção pelo sangue de dois comprimentos de onda diferentes) permite
a detecção da saturação de oxigênio. Este projeto envolveu o desenvolvimento de um circuito analógico
de aquisição e condicionamento dos sinais de oximetria, controlado por um Arduino Uno, responsável
por enviar os sinais amostrados à Raspberry Pi, via Bluetooth. Estes sinais foram processados pelo
microcomputador para calcular a taxa de saturação de oxigênio no sangue e a frequência cardíaca, os
quais foram armazenados em um banco de dados. A Raspberry Pi disponibilizou uma aplicação web
onde foi possível visualizar o resultado da oximetria e iniciar a realização de uma nova medição. Ao
final do projeto, conseguiu-se a integração de todos os módulos, desde o envio do comando para realizar
uma nova oximetria, a partir da aplicação web, até a visualização dos dados e resultados da oximetria
na aplicação. O projeto possui as mesmas limitações de um oxímetro comercial e o tempo de
processamento é lento se comparado com outros oxímetros. Contudo, a realização da oximetria por meio
da interface web permite um acesso remoto que nenhum outro oxímetro atual realiza.
Palavras-chave: Oxímetro, Arduino Uno, Raspberry Pi, Bluetooth, Web.
iv
v
Abstract The monitoring of oxygen saturation by hemoglobin, one of the main vital signs, is essential in
hospital routine. Noninvasive, fast and accurate technologies that allow the monitoring of oximetry must
be developed in order to improve hospital routine and bring more quality of life to patients. Pulse
oximetry (blood absorption by two different wavelengths) allows for the detection of oxygen saturation.
This project involved the development of an analog circuit of acquisition and conditioning of the
oximetry signs controlled by an Arduino Uno, responsible for sending the sampled signs to the
Raspberry Pi via Bluetooth. These signs were then processed by a microcomputer in order to determine
the exact oxygen saturation rate in the blood and the heart frequency. The data is then stored in a
database. Raspberry Pi offers a web application where the oximetry results can be verified and a new
measurement can be initialized. In the end of the project all modules were integrated (from the sending
of the command for a new oximetry measurement to be made in the web application until the
visualization of the data and results of the oximetry application). The project has the same limitations
as a conventional commercial oximeter and the processing time is slow when compared to other
oximeters. However, it allows for the remote execution of the oximetry through the web interface, a
characteristic not found in any other oximeter currently available.
Keywords: Oximeter, Arduino Uno, Raspberry Pi, Bluetooth, Web.
vi
vii
Lista de Figuras
Figura 1 - Representação da hematose nos alvéolos pulmonares............................................................ 1
Figura 2 - Representação do sistema circulatório nos seres humanos..................................................... 2
Figura 3 - Sensor ótico para oximetria .................................................................................................... 3
Figura 4 - Tipos de oxímetros existentes ................................................................................................ 3
Figura 5 - Wireless Pulse Oximeter ........................................................................................................ 4
Figura 6 - Curva de dissociação da oxiemoglobina. ............................................................................... 7
Figura 7 - Alteração da curva de dissociação da oxiemoglobina. ........................................................... 8
Figura 8 - Disposição dos LEDs e do sensor de oximetria de pulso. ...................................................... 8
Figura 9 - Diferença da absorção da luz infravermelha e vermelha para a oxiemoglobina e a sua forma
desoxigenada. .......................................................................................................................................... 9
Figura 10 - Absorção para diferentes componentes que a atenuam a transmissão da luz que atravessa o
paciente. .................................................................................................................................................. 9
Figura 11 - Princípio de Beer-Lambert. ................................................................................................ 10
Figura 12 - Alteração da luz transmitida em função da variação do caminho óptico durante o ciclo
cardíaco. ................................................................................................................................................ 12
Figura 13 - Sinais sem e com normalização para diferentes comprimentos de ondas .......................... 13
Figura 14 - Curva teórica e de calibração empírica da saturação de oxigênio pela razão R ................. 14
Figura 15 - Variação dos coeficientes de extinção para diferentes tipos de hemoglobinas .................. 15
Figura 16 - Diagrama em blocos do projeto .......................................................................................... 20
Figura 17 - Sensor ótico ........................................................................................................................ 21
Figura 18 - Curva de resposta do fotodiodo. ......................................................................................... 21
Figura 19 - Arduino Uno ....................................................................................................................... 22
Figura 20 - IDE do Arduino .................................................................................................................. 23
Figura 21 - Módulo Bluetooth HC-05 ................................................................................................... 23
Figura 22 - Ligação entre o Arduino Uno e o Bluetooth HC-05 ........................................................... 24
Figura 23 - Raspverry Pi ....................................................................................................................... 25
Figura 24 - Bluetooth USB - ES388 ...................................................................................................... 26
Figura 25 - Circuito de alimentação ...................................................................................................... 27
Figura 26 - Circuito esquemático de controle dos LEDs ...................................................................... 28
Figura 27 - Amplificador de Transimpedância ..................................................................................... 29
Figura 28 - Filtro ativo passa-baixa com topologia Sallen-Key ............................................................ 30
Figura 29 - Filtro passivo passa alta ...................................................................................................... 31
Figura 30 - Amplificador de ganho não inversor .................................................................................. 31
Figura 31 - Regulador de offset ............................................................................................................. 32
Figura 32 - Amplificador inversor unitário ........................................................................................... 32
Figura 33 - Diagrama em blocos da programação no Arduino ............................................................. 33
Figura 34 - Janela de configuração da Raspberry Pi ............................................................................. 35
Figura 35 - Software de comunicação SSH (Putty) .............................................................................. 36
Figura 36 - Interface gráfica para gerenciamento do banco de dados sqlite3 ....................................... 37
Figura 37 - Diagrama em blocos da programação em Python na Raspberry Pi .................................... 38
Figura 38 - Diagrama em blocos da aplicação web ............................................................................... 42
Figura 39 - Sinais de entrada e saída do filtro passa baixa para uma frequência de 5 Hz ..................... 44
Figura 40 - Comparação entre os dados teóricos e experimentais para o filtro passa baixa ................. 44
Figura 41 - Sinais de entrada e saída do filtro passa alta para uma frequência de 0,07 Hz ................... 45
Figura 42 - Comparação entre os dados teóricos e experimentais para o filtro passa alta .................... 46
Figura 43 - Saída do amplificador de transimpedância ......................................................................... 47
Figura 44 - Saída do filtro passa baixa .................................................................................................. 47
viii
Figura 45 - Saída do filtro passa alta ..................................................................................................... 48
Figura 46 - Saída do amplificador não inversor .................................................................................... 49
Figura 47 - Saída do circuito de ajuste do offset ................................................................................... 50
Figura 48 - Espectro de potência do sinal de saída do circuito analógico ............................................. 50
Figura 49 - Sinais vermelho e infravermelho não filtrados junto aos seus respectivos picos e vales ... 52
Figura 50 - Sinais vermelho e infravermelho filtrados junto aos seus respectivos picos e vales .......... 52
Figura 51 - Página inicial da aplicação web .......................................................................................... 53
Figura 52 - Página que permite visualizar e requisitar uma nova medição de oximetria ...................... 55
Figura 53 - Visualização dos resultados numéricos da oximetria e da frequência cardíaca.................. 56
Figura 54 - Visualização do sinal de oximetria proveniente dos LEDs vermelho e infravermelho ...... 56
Figura 55 - Visualização do histórico de oximetria e da frequência cardíaca ....................................... 57
Figura 56 - Página de espera enquanto a oximetria está sendo realizada .............................................. 57
Figura 57 - Visão da aplicação web através de um dispositivo móvel .................................................. 58
Figura 58 - Conjunto de testes com diferentes posicionamentos e movimentações do dedo ................ 59
Figura 59 - Sinal vermelho e infravermelho resultante do teste 1 ......................................................... 60
Figura 60 - Sinal vermelho e infravermelho resultante do teste 2 ......................................................... 60
Figura 61 - Sinal vermelho e infravermelho resultante do teste 3 ......................................................... 61
Figura 62 - Sinal vermelho e infravermelho resultante do teste 4 ......................................................... 61
Figura 63 - Sinal vermelho e infravermelho resultante da utilização do esmalte azul .......................... 62
Figura 64 - Sinal vermelho e infravermelho resultante da utilização do esmalte preto ........................ 63
Figura 65 - Sinal vermelho e infravermelho resultante da utilização do esmalte vermelho ................. 63
ix
Lista de Tabelas
Tabela 1 - Tempo de sobrevivência de alguns órgãos em situação de hipóxia ....................................... 1
Tabela 2 - Lógica de Controle dos LEDs .............................................................................................. 28
Tabela 3 - Dados experimentais do filtro passa baixa ........................................................................... 43
Tabela 4 - Dados experimentais do filtro passa alta .............................................................................. 45
Tabela 5 - Resultados da transmissão Bluetooth ................................................................................... 51
Tabela 6 - Resultados da oximetria e da pulsação cardíaca para os testes ............................................ 59
Tabela 7 - Resultados da oximetria e da pulsação cardíaca quando há esmaltes na unha ..................... 62
x
xi
Lista de Abreviaturas e Siglas
λ – Comprimento de Onda
𝛼(𝜆) – Constante de Absorção para determinado Comprimento de Onda
αHbO2(IV) – Constante de Absorção da Oxiemoglobina para o Infravermelho
αHbO2(V) – Constante de Absorção da Oxiemoglobina para o Vermelho
αHb(IV) – Constante de Absorção da Hemoglobina para o Infravermelho
αHb(V) – Constante de Absorção da Hemoglobina para o Vermelho
A – Ampere
AC – Alternate Current
BPM – Batimento Por Minuto
BPS – Bits Por Segundo
CAD – Conversor Analógico-Digital
CI – Circuito Integrado
CO2 – Gás Carbônico
CHbO2 – Concentração de Oxiemoglobina
CHb – Concentração de Hemoglobina
COHb – Carboxiemoglobina
DC – Direct Current
DNS – Domain Name System
Fc – Frequência de Corte
Fa – Frequência de Amostragem
Hb – Hemoglobina Reduzida
HbO2 – Oxiemoglobina
HDMI – High Definition Multimedia Interface
Hz – Hertz
IP – Internet Protocol
Ii(IV) – Intensidade Luminosa Incidente do Infravermelho
Ii(V) – Intensidade Luminosa Incidente do Vermelho
It(V) – Intensidade Luminosa Transmitida do Infravermelho
It(IV) – Intensidade Luminosa Transmitida do Vermelho
xii
LED – Light Emitting Diode
MetHb – Metemoglobina
O2 – Gás Oxigênio
PCO2 – Pressão Parcial de Gás Carbônico
pH – Atividade do íon H+
PO2 – Pressão Parcial de Gás Oxigênio
SaO2 – Saturação Arterial de Oxigênio
SD – Secure Digital
SO2 – Saturação de Oxigênio
SpO2 – Saturação Pulsátil de Oxigênio
USB – Universal Serial Bus
UTI – Unidade de Terapia Intensiva
V – Volt
W – Watt
xiii
Sumário
1. Introdução ...................................................................................................................................... 1
1.1. Oximetria de pulso como método de medição da oxigenação. .......................................... 1
1.2. Justificativa do trabalho ....................................................................................................... 4
1.3. Objetivos ................................................................................................................................ 4
1.4. Organização do trabalho ...................................................................................................... 5
2. Fundamentação Teórica ............................................................................................................... 7
2.1. A Oximetria ........................................................................................................................... 7
2.2. Princípios da oximetria de pulso .......................................................................................... 8
2.3. Lei de Beer-Lambert ........................................................................................................... 10
2.4. Medição da concentração de cada substância contida em uma mistura ........................ 10
2.5. Cálculo do SpO2 ................................................................................................................... 11
2.6. Fontes de erros na medição ................................................................................................ 15
2.7. Problemas comuns com oximetria de pulso ...................................................................... 17
3. Materiais e Métodos .................................................................................................................... 19
3.1. Materiais .............................................................................................................................. 21
3.1.1. Sensor de oximetria ..................................................................................................... 21
3.1.2. Componentes eletrônicos do sistema de aquisição e condicionamento ................... 22
3.1.3. Microcontrolador – Arduino ...................................................................................... 22
3.1.4. Bluetooth ....................................................................................................................... 23
3.1.5. Microcomputador – Raspberry Pi ............................................................................. 25
3.2. Métodos ................................................................................................................................ 26
3.2.1. Circuito Analógico ....................................................................................................... 26
3.2.2. Programação do Arduino ........................................................................................... 33
3.2.3. Programação da Raspberry Pi ................................................................................... 34
4. Resultados e Discussão ................................................................................................................ 43
4.1. Circuito analógico ............................................................................................................... 43
4.1.1. Filtros analógicos ......................................................................................................... 43
4.1.2. Análise do sinal de oximetria em cada estágio do circuito....................................... 46
4.2. Transmissão Bluetooth ........................................................................................................ 51
4.3. Processamentos digitais do sinal (programação em Python) .......................................... 51
4.4. Aplicação web ...................................................................................................................... 53
4.5. Aferição da oximetria na presença de fontes de erros ..................................................... 58
5. Conclusão ..................................................................................................................................... 65
Referências Bibliográficas .................................................................................................................. 67
xiv
Apêndices ............................................................................................................................................. 69
Apêndice A – Código do Arduino .................................................................................................. 69
Apêndice B – Programação em Python ......................................................................................... 71
Apêndice C – Validação da transmissão Bluetooth (Arduino) .................................................... 73
Apêndice D – Validação da transmissão Bluetooth (Raspberry Pi) ........................................... 74
Apêndice E – Programação web – index.js.................................................................................... 74
Apêndice F – Programação web – oximeter.js .............................................................................. 76
Apêndice G – Programação web – index.jade ............................................................................... 76
Apêndice H– Programação web – oximeter.jade .......................................................................... 76
Apêndice I – Programação web – executingOximeterPy.jade ..................................................... 78
Apêndice J – Programação web – layout.jade .............................................................................. 78
Apêndice K – Programação web – layout2.jade ........................................................................... 78
Anexo .................................................................................................................................................... 79
Anexo A – Configuração do HC-05 ............................................................................................... 79
Anexo B – Instalação dos drivers do Bluetooth na Raspberry Pi ............................................... 79
Anexo C – Instalação do Node.js .................................................................................................... 80
Anexo D – Instalação do Express ................................................................................................... 80
1
1. Introdução
1.1. Oximetria de pulso como método de medição da oxigenação.
A oxigenação do sangue é um processo vital para cada célula do corpo humano e a ausência
prolongada de oxigênio pode ocasionar a morte destas células. O processo de oxigenação inicia-se
quando o ar inspirado chega aos pulmões e, então, nos alvéolos, ocorre a hematose (Figura 1), ou seja,
a troca do gás carbônico (CO2) presente no sangue venoso pelo gás oxigênio (O2) contido no ar inspirado
(WEBSTER, 1997).
Figura 1 - Representação da hematose nos alvéolos pulmonares
Fonte: “Hematose”. Disponível em <http://interagircomfono.xpg.uol.com.br/hematose.html>. Acesso
em: 01 nov 2014.
Para enfatizar a importância da oxigenação dos tecidos, na Tabela 1, observou-se o tempo que
um órgão consegue manter sua função em situação de hipóxia (baixa oxigenação nos tecidos).
Tabela 1 - Tempo de sobrevivência de alguns órgãos em situação de hipóxia
Órgão Tempo de Sobrevivência sem oxigenação
Córtex Cerebral Menos de 1 minuto
Coração 5 minutos
Rim e Fígado 10 minutos
Músculos Esqueléticos 2 horas
Fonte: WEBSTER, 1997
Tanto o gás carbônico, antes presente no sangue venoso (rico em gás carbônico), e o gás
oxigênio, no sangue arterial (rico em oxigênio), são transportados pelas moléculas de hemoglobina
contidas nas células chamadas de hemácias ou eritrócitos. A circulação do sangue arterial e do venoso
é feita pelo sistema circulatório (Figura 2).
2
Figura 2 - Representação do sistema circulatório nos seres humanos
Fonte: “Sistema Cardiovascular”. Disponível em <http://www.euachei.com.br/educacao/corpo-
humano/sistema-cardiovascular/>. Acesso em: 01 nov 2014
Mediante a importância da oxigenação, iniciaram, então, estudos sobre métodos de medição da
saturação de oxigênio no sangue, porém os primeiros procedimentos eram difíceis, invasivos e
demoravam para gerar resultado. Um exemplo destas primeiras medições é o método de Van Slyke, no
qual se utilizavam reações químicas para remover o oxigênio e outros gases dissolvidos no sangue e,
posteriormente, a partir das pressões parciais destes gases retirados, podia-se determinar o nível de
saturação de oxigênio (WEBSTER, 1997). Tal método levava até 20 minutos para ser concluído, logo
não era possível o monitoramento de pacientes em condições de risco, tais como em acidentes,
anestesias, cirurgias e acompanhamento na unidade de tratamento intensivo (UTI), quando danos
irreversíveis podem ocorrer devido à falta de oxigênio no sangue.
3
A pesquisa e o desenvolvimento na área de bioengenharia possibilitaram o surgimento do
oxímetro de pulso, um dispositivo adequado para a medição devido à rapidez do resultado, à grande
fidelidade e ao fato de não ser invasivo. Tal dispositivo é composto por dois LEDs (diodos emissores
de luz) posicionados em frente a um fotodiodo, sendo que entre eles coloca-se uma parte translúcida do
corpo do paciente (Figura 3). Um dos diodos emite luz com comprimento de onda na faixa espectral
correspondente ao vermelho, enquanto o outro corresponde ao infravermelho. É possível, assim, obter
a taxa de oxigênio no sangue, pois as absorções destes comprimentos de onda diferem conforme a
saturação de oxigênio presente. Consegue-se também medir a frequência cardíaca do paciente a partir
da análise do sinal de oximetria, pois este sinal acompanha a variação do fluxo sanguíneo devido ao
batimento cardíaco.
Figura 3 - Sensor ótico para oximetria
Fonte: Figura adaptada de PHILIPS.
Os sinais recebidos pelo fotodiodo precisam ser condicionados de forma que possam ser
analisados por microprocessadores, os quais realizam cálculos para obterem a taxa de saturação e
frequência cardíaca. Estes resultados são, enfim, mostrados ao usuário em um visor ou monitor.
Atualmente, todo este sistema de oximetria pode ser também encontrado em equipamentos
portáteis, além de maior porte, geralmente utilizados em hospitais ou centros de saúde, ambos com boa
qualidade de medição e fácil visualização dos resultados. Na Figura 4, podem ser vistos exemplos de
oxímetros existentes.
Figura 4 - Tipos de oxímetros existentes
4
Um modelo de oxímetro, que difere dos anteriores, é o Wireless Pulse Oximeter (Figura 5) da
empresa iHealth, o qual é composto por um oxímetro atual e por um aplicativo que pode ser executado
no sistema operacional iOS. Os dados de oximetria e pulsação cardíaca podem ser enviados via
Bluetooth ao dispositivo que esteja executando o aplicativo. Estes dados podem ser visualizados no
dispositivo e armazenados em um banco de dados remoto.
Figura 5 - Wireless Pulse Oximeter
Fonte: “wireless pulse oximeter”. Disponível em <http://www.ihealthlabs.com/fitness-
devices/wireless-pulse-oximeter/>. Acesso em: 01 nov 2014.
1.2. Justificativa do trabalho
A medição da saturação de oxigênio no sangue e da frequência cardíaca, a partir do método de
oximetria de pulso, mostra-se importante, visto ser um processo rápido e não invasivo.
Apesar de existirem diversos modelos de oxímetros de pulso, nenhum deles possui um
aplicativo web, que permite ao usuário utilizar como interface para acessar, visualizar e controlar o
processo de oximetria de pulso. A utilização de um banco de dados digital integrado a este aplicativo
possibilita o armazenamento dos sinais e resultados de uma forma segura e eficiente.
Portanto, a elaboração de um aplicativo web, integrado a um banco de dados digital para
medição da oximetria de pulso, permite o monitoramento remoto dos sinais de saturação de oxigênio e
pulsação cardíaca de um paciente.
1.3. Objetivos
O principal objetivo deste trabalho foi projetar e implementar um sistema de medição da
oxigenação arterial e da pulsação cardíaca, com interface via web, baseado no método da oximetria de
pulso. Para obter tal objetivo foi necessário:
5
O desenvolvimento de um circuito analógico para o condicionamento do sinal do sensor
optoeletrônico e controle dos LEDs.
A programação do microcontrolador, responsável pelo controle do circuito analógico e pela
transmissão dos dados, via Bluetooth, para o microcomputador
A programação deste microcomputador para inicializar a comunicação Bluetooth, realizar o
processamento digital do sinal, obter a taxa de oxigenação sanguínea e frequência cardíaca,
armazenar estes sinais e resultados em um banco de dados e gerar uma aplicação web, que
serviu como interface da oximetria.
A configuração da comunicação Bluetooth.
1.4. Organização do trabalho
O trabalho elaborado foi dividido em cinco capítulos. O primeiro contém a descrição, o objetivo
e a justificativa do trabalho, a explicação do tema e o estado da arte referente à oximetria. No segundo,
encontra-se o embasamento teórico do projeto. No terceiro, são apresentados os materiais escolhidos e
os métodos utilizados. O quarto é composto pelos resultados e discussões. Por fim, no quinto, é
apresentada a conclusão referente ao trabalho desenvolvido e as futuras melhorias que podem ser
implementadas.
6
.
7
2. Fundamentação Teórica
2.1. A Oximetria
O processo de oxigenação ocorre devido ao transporte de gás oxigênio, O2, pelas moléculas de
hemoglobina encontradas nas células do sangue denominadas hemácias ou eritrócitos. Este transporte
só é possível devido à capacidade da hemoglobina de ligar-se a uma molécula de oxigênio de forma
reversível, assim resultando na oxiemoglobina, HbO2. As hemoglobinas que não estão carregando
moléculas de oxigênio são denominadas hemoglobinas reduzidas, Hb. Conforme o número de moléculas
de oxigênio ligadas à hemoglobina (que varia de um a quatro), diz-se que ela está mais ou menos
saturada. A afinidade desta ligação eleva-se proporcionalmente ao aumento da quantidade existente de
moléculas de hemoglobina oxigenadas (HAEBISCH, 1980), permitindo que o sangue arterial mantenha
um nível de oxigenação constante e possibilite que o organismo sobreviva em regiões de baixa pressão
de oxigênio, tais como em locais de grande altitude.
O índice que mede a oxigenação arterial é denominado saturação arterial de oxigênio, SaO2,
expresso em porcentagem e determinado pela concentração de oxiemoglobina sobre esta somada à
concentração de hemoglobinas reduzidas, como na equação (1).
SaO2 =CHbO2
CHbO2 + CHb (1)
Onde CHbO2 é a concentração de oxiemoglobina e CHb é a concentração de hemoglobina
reduzida. A quantidade de oxigênio presente no sangue gera uma pressão parcial, PO2, que é relacionada
à saturação arterial de oxigênio, SaO2. Esta relação é conhecida como curva de dissociação da
oxiemoglobina (Figura 6).
Figura 6 - Curva de dissociação da oxiemoglobina.
Fonte: MARIEB e HOEHN (2008).
8
A pressão parcial influencia na saturação arterial de oxigênio, ou seja, na afinidade de
combinação entre as moléculas de hemoglobinas e de oxigênio. A curva de dissociação pode sofrer
alguns desvios, em decorrência de fatores, tais como, a temperatura, o pH do sangue ([H+]), a pressão
parcial de gás carbônico (PCO2), e a quantidade de 2,3 BPG (2,3-bifosfoglicerato). Na Figura 7, pode-
se observar a influência destes fatores na alteração da curva.
Figura 7 - Alteração da curva de dissociação da oxiemoglobina.
Fonte: Figura adaptada de PHILIPS.
2.2. Princípios da oximetria de pulso
O sensor de oximetria é constituído por dois LEDs de 660 nm e 895 nm, que correspondem,
respectivamente, ao espectro de luz vermelho e infravermelho. Estes LEDs emitem luz que atravessa
uma parte translúcida do corpo do paciente (as pontas dos dedos ou a orelha). Parte desta luz é espalhada
e/ou absorvida quando atravessa o paciente, enquanto a radiação que o atravessa completamente é
medida por um sensor de luz (fotodiodo), posicionado no lado oposto do corpo do paciente. Na Figura
8, é possível observar a disposição dos componentes citados anteriormente.
Figura 8 - Disposição dos LEDs e do sensor de oximetria de pulso.
Fonte: (ANDRADE, 2009).
A medição da saturação pode ser realizada comparando-se a quantidade da radiação em 660 nm
com a de 895 nm detectadas pelo sensor, pois a oxiemoglobina absorve mais a luz infravermelha do que
9
a vermelha, enquanto que a hemoglobina reduzida se comporta de modo oposto (Figura 9). Esta medição
depara-se com o problema: Como separar a quantidade de luz que é absorvida pelo sangue arterial da
que é absorvida pelos tecidos, ossos e sangue venoso.
Figura 9 - Diferença da absorção da luz infravermelha e vermelha para a oxiemoglobina e a sua forma
desoxigenada.
Fonte: (ANDRADE, 2010).
A parcela de luz absorvida devido aos tecidos não apresenta significantes mudanças em curtos
períodos de tempo, ao passo que a de absorção, referente ao sangue arterial, apresenta variações devido
às alterações na pulsação (embora exista um nível constante de sangue arterial). Desse modo, como o
sangue arterial é o único componente da absorção que apresenta mudanças em curtos períodos de tempo,
esta pode ser isolada dos outros componentes e assim, utilizada para realizar a medição de saturação.
Na Figura 10, podem ser vistos os componentes da absorção da luz que atravessa o paciente.
Figura 10 - Absorção para diferentes componentes que a atenuam a transmissão da luz que atravessa o
paciente.
Fonte: Figura adaptada de (WEBSTER, 1997)
10
2.3. Lei de Beer-Lambert
O princípio de Beer-Lambert (Figura 11), que relaciona a absorção de luz com as propriedades
do material, consiste em um feixe de luz incidente, Iincidente, com comprimento de onda λ, que atinge
um anteparo não totalmente opaco, resultando em um feixe transmitido, Itransmitido, que é dependente
do comprimento do anteparo, l [cm], da constante de absorção deste para o comprimento de onda λ,
α(λ) [L/mmol.cm], e da concentração de partículas responsáveis pela atenuação do sinal, C [mmol/L].
A equação (2) expressa a relação do princípio de Beer-Lambert.
Figura 11 - Princípio de Beer-Lambert.
Fonte: (LIMA, 2009)
𝐼𝑡𝑟𝑎𝑛𝑠𝑚𝑖𝑡𝑖𝑑𝑜 = 𝐼𝑖𝑛𝑐𝑖𝑑𝑒𝑛𝑡𝑒 ∗ 𝑒−𝛼(𝜆).𝐶.𝑙 (2)
A transmitância, T(λ), desse processo é a relação entre a luz transmitida e a incidente, equação
(3); enquanto que a absorbância, A(λ), é o logaritmo natural negativo desta relação, equação (4).
T(λ) =ItransmitidoIincidente
= e−α(λ).C.l (3)
|𝐴(λ)| = − ln(T(λ)) = α(λ). C. l (4)
2.4. Medição da concentração de cada substância contida em uma mistura
A lei de Beer-Lambert pode também ser aplicada a uma mistura que possui mais de uma
substância que absorve a luz, quando atravessada. A absorção parcial de cada substância contribui para
a absorção total da luz. Portanto, a representação matemática desta absorção total pode ser obtida pela
superposição de cada absorção individual. Por exemplo, suponha uma mistura com n substâncias
diferentes, então a absorção total, At, pode ser obtida através da equação (5).
11
At = α1(λ). C1. l1 + α2(λ). C2. l2 +⋯+ αn(λ). Cn. ln (5)
Onde, cada 𝛼𝑛(𝜆) corresponde à constante de absorção, 𝐶𝑛 à concentração e ln ao comprimento
óptico, que é atravessado pelo feixe de luz de comprimento λ, para cada substância contida nesta mistura.
Uma vez, conhecendo a constante de absorção de cada substância, mantendo um mesmo
caminho óptico de comprimento L para todas e medindo a absorção total para diferentes comprimentos
de onda, é possível montar um sistema linear (6) com n equações de modo que seja possível se
determinar as concentrações das n substâncias que compõem a mistura.
{At(λ1) = α1(λ1). C1. L + α2(λ1). C2. L + ⋯+ αn(λ1). Cn. L
⋮At(λn) = α1(λn). C1. L + α2(λn). C2. L + ⋯+ αn(λn). Cn. L
(6)
Esta abordagem não é viável para a determinação da oximetria de pulso deste projeto, visto que
os comprimentos ópticos não são os mesmos para as diferentes substâncias, as constantes de absorção
possuem uma variabilidade entre indivíduos e, também, o sensor adquirido não permite uma análise
simultânea da intensidade incidente da transmitida, através do dedo do paciente, de modo a determinar
a intensidade total absorvida. Outro fator limitante é a necessidade de mais de dois comprimentos de
ondas diferentes, o que não é possível de se obter com o sensor disponível (WEBSTER, 1997).
2.5. Cálculo do SpO2
O índice SpO2 é definido como a taxa de saturação pulsátil de oxigenação, correspondente ao
SaO2, e sua sigla é diferente devido ao método pelo qual este índice é obtido. O método para o cálculo
do SpO2 é baseado na pulsação cardíaca, que acaba alterando o fluxo sanguíneo responsável pela
oxigenação do indivíduo. Um ciclo cardíaco é composto pela sístole e pela diástole. As artérias contêm
mais sangue a sístole do que na diástole. Dessa forma, a concentração e o comprimento óptico das
hemoglobinas aumentam, consequentemente a intensidade luminosa dos feixes que atravessam diminui.
O processo inverso pode ser inferido durante a diástole.
Na Figura 10, pode-se observar a variação da absorção e da transmissão do feixe luminoso,
devido ao ciclo cardíaco. Nesta mesma figura, são indicados dois sinais, IH e IL, o primeiro
correspondendo à intensidade máxima transmitida, enquanto que IL, à intensidade mínima transmitida.
Estes dois sinais podem ser expressos conforme o sistema de equações (7) (WEBSTER, 1997).
{IH = IO. e
−αDC(λ).CDC.dDC . e−[αHb(λ).CHb+αHbO2(λ).CHbO2]dmin
IL = IO. e−αDC(λ).CDC.dDC . e−[αHb(λ).CHb+αHbO2(λ).CHbO2]dmax
(7)
12
Onde,
IO é a intensidade de luz incidente;
αDC, CDC e dDC é a constante de absorção, a concentração e o comprimento óptico das componentes que
possuem absorção constante, com exceção do sangue arterial não pulsátil;
αHb(λ) e αHbO2(λ) são as constantes de absorção da hemoglobina reduzida e da oxiemoglobina para
determinado comprimento de onda λ;
CHb e CHbO2 são as concentrações de oxiemoglobina e hemoglobina reduzida;
dmin é o comprimento óptico mínimo para a hemoglobina reduzida e a oxiemoglobina durante a diástole;
dmax é o comprimento óptico máximo para a hemoglobina reduzida e a oxiemoglobina durante a sístole.
Durante o ciclo cardíaco, a intensidade transmitida I é uma função do diâmetro d, da artéria, que
pode variar de dmin a dmax, ou seja, d pode ser substituído por dmin + Δd, onde Δd varia de 0 até dmax
- dmin. Sendo assim, I pode ser expresso como uma função de IH e Δd.
I = IH. 𝑒−[αHb(λ).CHb+αHbO2(λ).CHbO2].Δd (8)
Na Figura 12, pode-se observar a alteração da luz transmitida entre um valor IMIN a um IMAX
conforme altera-se a distância x entre dmin a dmax.
Figura 12 - Alteração da luz transmitida em função da variação do caminho óptico durante o ciclo
cardíaco.
Fonte: Figura adaptada de (WEBSTER, 1997)
Antes de se iniciar o cálculo do SpO2, deve-se normalizar os sinais de oximetria proveniente dos
LEDs, visto que estes não emitem luz com a mesma intensidade, havendo também a variação da
sensibilidade do sensor para diferentes comprimentos de onda. A normalização é realizada dividindo-se
13
o valor amostrado pelo valor máximo, equação (9), o que resulta em sinais com a mesma intensidade
durante a diástole para os diferentes comprimentos de onda (este efeito é melhor visualizado na Figura
13).
Figura 13 - Sinais sem e com normalização para diferentes comprimentos de ondas
Fonte: Figura adaptada de (WEBSTER, 1997)
IN =I
IH= e−[αHb(λ).CHb+αHbO2(λ).CHbO2].Δd (9)
O cálculo das absorbâncias das luzes, sistema de equações (10), é equivalente ao total absorvido
devido ao componente AC do sinal.
{At,V = ln (IN,V) = −[αHb(λV). CHb + αHbO2(λV). CHbO2]. ΔdV
At,IV = ln (IN,IV) = −[αHb(λIV). CHb + αHbO2(λIV). CHbO2]. ΔdIV (10)
A razão das absorbâncias dos sinais já normalizados é definida como um fator R (equação (11)).
R =At,VAt,IV
=[αHb(λV). CHb + αHbO2(λV). CHbO2]. ΔdV
[αHb(λIV). CHb + αHbO2(λIV). CHbO2]. ΔdIV (11)
Considerando que o comprimento óptico é o mesmo para os dois comprimentos de onda e
utilizando a definição de SaO2 da equação (1), pode-se concluir que a saturação pulsátil de oxigenação,
SpO2, calcula-se conforme a equação (12).
SpO2 =αHb(λV) − R ∗ αHb(λIV)
R ∗ (αHbO2(λIV) − αHb(λIV)) + (αHb(λV) − αHbO2(λV)) (12)
Onde a razão R também pode ser calculada como:
14
𝑅 =ln (𝐼𝐿,𝑉𝐼𝐻,𝑉
)
ln (𝐼𝐿,𝐼𝑉𝐼𝐻,𝐼𝑉
)
(13)
Este é o modelo teórico para se obter a saturação pulsátil de oxigênio, SpO2. No entanto, as
constantes de absorção, que variam para cada indivíduo, a presença de hemoglobinas não funcionais e
o efeito de espalhamento da luz são fatores que não foram considerados para o modelo em questão
(WEBSTER, 1997). Usualmente, utiliza-se na prática, uma curva de calibração empírica (Figura 14)
que relaciona a razão R com o nível de oxigenação.
Figura 14 - Curva teórica e de calibração empírica da saturação de oxigênio pela razão R
Fonte: Figura adaptada de (WEBSTER, 1997)
Na literatura, há alguns polinômios que tentam obter uma curva empírica que se aproxime da
teórica, dentre estes:
SpO2 = 110 − 25. R (14)
SpO2 =1000 − 550. R
900 − 350. R (15)
SpO2 = 10,0002. R3 − 52,887. R2 + 26,871. R + 98,283 (16)
Fontes: Equação (14) – (WEBSTER, 1997). Equação (15) – (BRONZINO, 1999). Equação (16) –
(NGHIA, 2012)
15
2.6. Fontes de erros na medição
Hemoglobinas não funcionais
A principal fonte de erro que afeta a medição da saturação de oxigênio advém da presença da
hemoglobina não-funcional (WEBSTER, 1997). Em alguns pacientes, há uma grande quantidade destas
hemoglobinas incapazes de transportar oxigênio. A carboxiemoglobina (HbCO) e a metemoglobina
(METHb) são alguns tipos de hemoglobina não funcionais. Na Figura 15, pode-se perceber como estas
hemoglobinas não funcionais influenciam uma medição incorreta do SpO2, por possuírem, em alguns
determinados comprimentos de onda, um coeficiente de extinção superior ou muito próximo ao das
hemoglobinas funcionais (oxiemoglobinas e hemoglobina reduzida). Sendo assim, a medição da
saturação pulsátil de oxigênio deveria ser:
SpO2 =CHbO2
CHb + CHbO2 + CHbCO + CMETHb + Coutras hemoglobinas não funcionais (17)
Contudo, para que seja possível essa medição, seriam necessários outros feixes de luz com
comprimentos de ondas diferentes, que possibilitem distinguir a absorção de uma determinada
hemoglobina em relação as outras.
Quando a quantidade de hemoglobinas não funcionais é muito baixa, as equações possuem
grande correspondência. Ao passo que, na presença de grande quantidade destes tipos de hemoglobina,
os resultados obtidos são divergentes em relação ao estado real do paciente (WEBSTER, 1997).
A poluição por monóxido de carbono e o fumo excessivo são fatores que influenciam a formação
de hemoglobinas não funcionais.
Figura 15 - Variação dos coeficientes de extinção para diferentes tipos de hemoglobinas
Fonte: Figura adaptada de (WEBSTER, 1997)
16
Efeito de espalhamento da luz
Nem todo o feixe de luz incidente é absorvido ou transmitido. Uma parte desta luz também é
refletida e espalhada dentro do paciente. Essa luz espalhada é novamente absorvida, transmitida e
espalhada enquanto estiver dentro do paciente. Desse modo, há um aumento de absorção da luz que não
é considerado no modelo teórico. O aumento da absorção não é somente relacionado a esse
espalhamento e ao aumento do diâmetro da artéria durante a diástole. A mudança do eixo das células
vermelhas do sangue altera a absorção da luz. As células vermelhas possuem um formato bicôncavo,
cujo maior eixo é alinhado ao fluxo sanguíneo durante a diástole e o menor eixo, na sístole. Assim, na
diástole, a luz possui maior caminho a ser percorrido, aumentando, consequentemente, sua absorção
pelo sangue. Este posicionamento variável do eixo destas células também modifica a quantidade de luz
refletida. Como resultado desta propriedade, a absorção e a reflexão da luz causada pelo sangue depende
do ciclo cardíaco e da velocidade do fluxo sanguíneo (MOYLE, 1994).
A intensidade da luz espalhada depende de fatores como a concentração de células vermelhas
no sangue, o tamanho, o formato, a orientação, o índice de refração e a espessura dos tecidos (FINE e
WEINREB, 1995). Tais fatores, além da distância entre os LEDs e o fotodiodo, variam de paciente para
paciente, dificultando a obtenção de uma modelagem para estas diversas circunstâncias. Existem alguns
modelos da absorção de luz, incluindo o espalhamento, os quais são baseados em teoremas estatísticos
e quânticos, o que os torna mais complexos e assim inviáveis na prática.
Steinke e Shepherd demonstraram que o espalhamento dos feixes luminosos depende do
comprimento de onda da luz e da taxa de saturação. A relação entre o espalhamento de luz e a taxa de
saturação é linear e pode ser vista não somente como uma fonte de erro, pois o espalhamento aumenta
a taxa de absorção dessa luz, ou seja, aumenta-se a sensibilidade da medição (Steinke e Shepherd, 1986).
Comprimentos de ondas emitidos pelos LEDs
Os comprimentos de onda escolhidos são tais que suas absorções pela pele, tecidos e a água
sejam inferiores em relação a outros comprimentos de onda, de modo que haja uma diferença
significativa entre as constantes de absorção da hemoglobina reduzida e da oxiemoglobina (WEBSTER,
1997). Sabe-se que os LEDs não emitem em somente um comprimento de onda, isto é, os LEDs emitem
uma faixa de comprimentos de ondas em torno daquele que foi escolhido inicialmente. Dessa forma
mesmo que se escolha um LED com uma estreita faixa de comprimentos de onda em torno do desejado,
a medição de oximetria possui erro devido a esta característica.
17
Anemia
Um paciente com anemia possui uma baixa quantidade de células vermelhas, o que diminui,
consequentemente, a quantidade de hemoglobina no seu sangue. Um paciente anêmico pode não possuir
hemoglobinas funcionais suficientes em seu sangue para oxigenar os tecidos. A pequena quantidade de
hemoglobinas funcionais pode estar completamente saturada, o que indica que o paciente possui uma
taxa normal de SpO2, mas, na realidade, não possui oxigenação suficiente em seus tecidos (WEBSTER,
1997).
Corantes
Em alguns procedimentos cirúrgicos, especialmente em cardiologia e urologia, são injetados
corantes no sangue do paciente, com a finalidade de se mapear o fluxo sanguíneo. Estes corantes
interferem na transmissão da luz que atravessa o sangue, provocando uma leitura incorreta da oximetria
(WEBSTER, 1997).
Hipotermia
Em casos de hipotermia, o corpo reduz a perda de calor pela pele, diminuindo a circulação
periférica, o que afeta significantemente a medição da oxigenação periférica. Também, devido ao frio,
o paciente pode apresentar tremores que atrapalham a aquisição de dados pelo sensor (WEBSTER,
1997).
2.7. Problemas comuns com oximetria de pulso
As principais dificuldades que são encontradas no oxímetro de pulso são:
Interferência de luz externa
Uma má isolação do sensor em relação à luz externa pode ocasionar leituras incorretas da
oximetria, isto porque o fotodiodo é também sensível a luz ambiente.
Movimentos do paciente
A movimentação voluntária ou involuntária do paciente, até mesmo oriunda do ato da fala afeta
a leitura do sinal, pois o movimento acaba gerando pequenas distorções no sinal.
18
Adaptação do sensor ao corpo do paciente
Mesmo que o sensor seja fabricado para se adaptar da melhor maneira ao paciente, existem
casos em que não há um encaixe adequado do sensor ao dedo do paciente, o que possibilita que os
problemas anteriores ocorram e interfiram na qualidade do sinal obtido.
Esmaltes de unhas
A coloração dos esmaltes utilizados nas unhas pode interferir significantemente na análise da
oximetria, pois pode absorver ou refletir a luz emitida pelos diodos.
19
3. Materiais e Métodos
Neste capítulo, são apresentados os materiais e os métodos utilizados para a implementação do
projeto. Um esquema geral deste pode ser visto na Figura 16, onde cada bloco representa um módulo
do projeto com suas respectivas funções, características e componentes.
O projeto foi composto primeiramente por um sensor de oximetria que inclui dois LEDs e um
fotodiodo conforme especificado nos dois primeiros capítulos. Este sensor foi conectado a um circuito
analógico que condicionou o sinal de modo que pudesse ser convertido para um sinal digital pelo
microcontrolador Arduino Uno.
O Arduino Uno foi o responsável por controlar a emissão dos LEDs e pela transmissão via
Bluetooth, sendo que algumas configurações precisaram ser realizadas neste tipo de comunicação. Os
dados enviados, via Bluetooth, foram recebidos pelo microcomputador Raspberry Pi. A Raspberry Pi
foi configurada e alguns programas e drivers foram instalados. Neste microcomputador, foram
desenvolvidos dois programas: programação em Python e web. O programa em Python foi responsável
por inicializar a comunicação Bluetooth, o processamento digital dos sinais e o armazenamento destes
em um banco de dados. A programação web, que envolveu um servidor Node.js, o framework Express,
plug-ins e suas configurações, foi responsável por gerar o site, que serviu como interface para o usuário
realizar a oximetria e visualizar o resultado.
O site gerado foi uma aplicação web, composta por uma página inicial do projeto, uma segunda
que permitiu a visualização da oximetria e a obtenção de uma nova medição e, por fim, uma responsável
por executar o programa em Python.
A oximetria foi realizada a partir do momento em que o usuário, por meio da aplicação web,
requisitou uma nova medição, que o redirecionou a uma página que executou o programa em Python. O
referido programa iniciou a comunicação Bluetooth entre a Raspberry Pi e o Arduino Uno. Estabelecida
a comunicação, a Raspberry enviou um sinal para que o Arduino Uno começasse controlar a emissão
dos LEDs do sensor, de modo que o sinal de saída do fotodiodo pudesse ser condicionado pelo circuito
analógico. O sinal atravessou todos os módulos conforme explicado anteriormente até que os resultados
fossem armazenados no banco de dados. Por fim, a aplicação web redirecionou o usuário para a página
de visualização da oximetria, para uma análise dos resultados obtidos.
A constituição, as características ou as funções de cada módulo do projeto são descritas
detalhadamente ao longo deste capítulo.
20
Figura 16 - Diagrama em blocos do projeto
21
3.1. Materiais
3.1.1. Sensor de oximetria
O sensor utilizado (Figura 17) é composto por um adaptador de dedo, um cabo blindado e um
conector DB9. Este sensor possui dois LEDs emissores de luz nos comprimentos de onda de 660 nm e
895 nm, e um fotodiodo, que funciona como uma fonte de corrente com saída diretamente proporcional
à intensidade da luz recebida.
Figura 17 - Sensor ótico
O fotodiodo possui uma curva de sensibilidade (Figura 18) que varia conforme o comprimento
de onda, com sensibilidade para o infravermelho (895 nm) diferente para o vermelho (660 nm).
Figura 18 - Curva de resposta do fotodiodo.
Fonte: (SANTINI, 2010
22
3.1.2. Componentes eletrônicos do sistema de aquisição e condicionamento
Os componentes utilizados no projeto foram transístores, amplificadores operacionais,
resistores, capacitores, reguladores e inversor de tensão. Os transístores foram utilizados para chavear
uma ponte-H que controlou a emissão dos LEDs. Os amplificadores operacionais foram implementados
como filtros analógicos, amplificadores de transimpedância, amplificadores não-inversores e isoladores.
O inversor de tensão foi utilizado para que, a partir de uma única fonte de tensão, pudesse gerar uma
alimentação simétrica utilizada nos amplificadores operacionais que necessitam deste tipo de
alimentação. Os resistores e capacitores atuaram em conjunto com os demais componentes para
polarizar ou permitir a função desejada para aquele circuito.
3.1.3. Microcontrolador – Arduino
Neste projeto, o microcontrolador teve a função de controlar o circuito analógico, realizar a
aquisição dos sinais provenientes dos LEDs e enviar estes dados ao microcomputador, via comunicação
Bluetooth.
O microcontrolador escolhido foi o Arduino Uno (Figura 19), que é um microcontrolador
baseado no ATmega328. Este microcontrolador possui como características principais:
Alimentação de 5V;
Frequência de clock de 16 MHz;
14 pinos digitais de entrada ou saída;
6 entradas analógicas com Conversores Analógico/Digital de 10 bits cada;
Memória flash de 32 kB, SRAM de 2 kB e EEPROM de 1 kB
Conector USB (do inglês, “Universal Serial Bus”) utilizado para programação do
microprocessador, comunicação serial e alimentação. (ARDUINO, 2014, Arduino Uno).
Figura 19 - Arduino Uno
Fonte: (ARDUINO, 2014, Arduino Uno)
23
As principais vantagens que podem ser observadas neste módulo são:
A facilidade para acessar os seus periféricos que são utilizados no controle do circuito
analógico e na aquisição dos sinais deste projeto;
O conector USB, já acoplado a placa, que permite uma rápida programação através da sua IDE
(do inglês, “Integrated Developmnet Environment”, que significa Ambiente Integrado de
Desenvolvimento). Esta IDE (Figura 20) pode ser encontrado em (ARDUINO, 2014,
Download the Arduino Software), onde o usuário deve escolher a IDE conforme o sistema
operacional em que está desenvolvendo a aplicação.
Programação em C/C++, grande quantidade de informação compartilhada entre seus usuários
e o módulo Bluetooth, HC-05, que pode ser facilmente acoplado a esta placa.
Figura 20 - IDE do Arduino
3.1.4. Bluetooth
O módulo Bluetooth utilizado para se conectar ao Arduino Uno foi o HC-05 (Figura 21), que é
um módulo desenvolvido para ser utilizado junto aos diversos Arduinos existentes, apesar de que nada
impede a utilização deste por outros microcontroladores. Este módulo Bluetooth teve como função a
transmissão dos dados amostrados pelo Arduino Uno e processados pelo microcomputador.
Figura 21 - Módulo Bluetooth HC-05
Fonte: “HC-05”. Disponível em < http://blog.roman-mueller.ch/index.php/2013/04/24/connecting-to-
arduino-using-processing-and-bluetooth-hc-05-hc06/ >. Acesso em: 01 nov 2014.
24
A ligação entre o módulo e o Arduino Uno deu-se seguindo rigorosamente o esquema mostrado
na Figura 22. Os pinos Tx e Rx do HC-05 foram ligados aos pinos 10 e 11 do Arduino, respectivamente.
Além disso, o pino 9 somente foi ligado ao HC-05 quando se desejou entrar no modo de configuração
do módulo por meio dos comandos AT. No Anexo A – Configuração do HC-05 encontra-se uma
lista de comandos e um código exemplo para a configuração do módulo Bluetooth.
Figura 22 - Ligação entre o Arduino Uno e o Bluetooth HC-05
Fonte: “Ligação entre o Arduino e o HC-05”. Disponível em
<http://www.instructables.com/id/Modify-The-HC-05-Bluetooth-Module-Defaults-Using-
A/?ALLSTEPS>. Acesso em: 01 nov 2014.
Apesar do tipo de comunicação entre o Arduino Uno e o módulo HC-05 ser serial e os pinos
digitais 0 e 1 do Arduino já serem configurados para este tipo de comunicação, neste projeto, utilizaram-
se os pinos 10 e 11, porque durante o desenvolvimento foi preciso utilizar a comunicação serial via USB,
como forma de verificação e validação do código desenvolvido no Arduino. Para utilizar estes pinos em
uma comunicação serial é necessária uma biblioteca, denominada “SoftwareSerial Library”, que permita
a existência de uma serial por software (ARDUINO, 2014, SoftwareSerial Library).
Para este projeto foram alteradas algumas configurações deste módulo, tais como: o nome do
módulo, a senha de acesso para pareamento e a taxa de transmissão (Baud Rate) para 115.200 BPS (Bits
Por Segundo). Os dois primeiros parâmetros de configurações foram escolhidos apenas para aumentar
a segurança dos dados transmitidos. A taxa de transmissão escolhida foi a que possibilitasse a realização
as amostragens dos dados pelo Arduino sem que houvesse erros ou impossibilidade de transmissão dos
dados, via Bluetooth.
A taxa de transmissão foi escolhida empiricamente durante o desenvolvimento, visto que outros
valores para esta taxa não permitiram a completa transmissão dos dados, devido ao estouro do buffer de
transmissão, ou não eram valores disponíveis para o módulo Bluetooth conectado ao microcomputador.
25
3.1.5. Microcomputador – Raspberry Pi
O microcomputador utilizado é a Raspberry Pi modelo B (Figura 23), que é um mini computador
do tamanho de um cartão de crédito capaz de se conectar a um monitor via HDMI (do inglês, High
Definition Media Interface).
A Raspberry Pi foi um conceito desenvolvido por Eben Upton que queria um computador
minimalista, com baixo consumo, baixo custo e flexível para incentivar, nos estudantes de Ensino Médio
e Superior, o aprendizado da programação.
O projeto evoluiu e se tornou uma Fundação: Raspberry Foundation. O sucesso de vendas desse
computador foi imediato e hoje, além do cunho educacional, tornou-se a plataforma de desenvolvimento
preferida de estudantes universitários e projetistas experientes, sendo utilizada em diversas aplicações
comerciais ou não, inclusive na aplicação desenvolvida nesse trabalho (RASPBERRY PI, 2014, About
Us).
Figura 23 - Raspverry Pi
Fonte: “Raspberry Pi”. Disponível em < http://pt.wikipedia.org/wiki/Raspberry_Pi>. Acesso em: 01
nov 2014.
As especificações do modelo Raspberry Pi Model-B Rev.2, modelo utilizado nesse projeto são
as seguintes:
System on Chip (SoC): Broadcom BCM2835 (CPU, GPU, DSP, e SDRAM):
o ARM1176JZF-S core (Família Clássica ARM11) – 700 MHz;
o Broadcom VideoCore IV, OpenGL ES 2.0, 1080p30 decodificador h.264/MPEG-4 AVC;
o 512 MB (compartilhada com GPU);
2 Portas USB 2.0 (via hub USB integrado);
Saídas de vídeo: RCA Composta e HDMI;
26
Saídas de áudio: HDMI e Conector de 3,5mm;
Armazenamento principal: SD / MMC / slot para cartão SDIO;
Rede Onboard: 10/100 Ethernet (RJ45);
Outros: 8 × GPIO, UART, I²C, SPI com dois seletores de chip, +3,3 V, +5 V, terra; Potência:
700 mA (3,5 W); Tamanho: 85,60 mm × 53,98 mm (RASPBERRY PI, 2014, Raspberry Pi
Models And Revisions).
A Raspberry Pi foi utilizada neste projeto para o processamento dos dados e obtenção dos
resultados da oximetria. Ela gerou uma página web, a qual serviu como interface para o usuário, a fim
de que ele pudesse controlar e visualizar o processo de oximetria. Outra característica importante foi a
possibilidade de armazenamento dos dados em um banco que permitiu a elaboração de um histórico das
medições realizadas.
O módulo Bluetooth utilizado, neste projeto, para se conectar à Raspberry Pi foi o Bluetooth
USB - ES388 (Figura 24), o qual permitiu facilmente a conexão e uma boa fixação.
Figura 24 - Bluetooth USB - ES388
Fonte: “Bluetooth USB - ES338”. Disponível em <http://www.fasttech.com/product/1019100-es-388-
bluetooth-v20-usb-dongle-adapter-black>. Acesso em: 01 nov 2014.
3.2. Métodos
3.2.1. Circuito Analógico
O circuito analógico é responsável pelo controle dos LEDs, aquisição do sinal de saída do
fotodiodo e condicionamento do sinal para que este seja processado pelo microcontrolador.
Basicamente, este circuito analógico é composto pelos blocos:
Circuito de alimentação;
Controle dos LEDs;
Amplificador de transimpedância
Filtro passa baixa;
Filtro passa alta;
Amplificador de ganho não inversor;
Regulador de offset;
Buffer de saída utilizando um amplificador “single-supply rail-to-rail”.
27
Circuito de alimentação
Para eliminar possíveis ruídos e harmônicos da rede de alimentação, foi utilizada uma bateria
de 9V para alimentar o circuito analógico; o que permitiu também uma proteção ao usuário, visto que
não havia possibilidade de ele entrar em contato com alta tensão.
O circuito de alimentação também foi composto por um inversor de tensão, que permitiu a partir
de uma tensão positiva se obter uma negativa, cujo valor em módulo é o mesmo da bateria utilizada para
a alimentação. O inversor de tensão escolhido foi o CI (Circuito Integrado) TL7660 cuja faixa de
operação é de 1,5 V a 10 V de entrada, convertidos em -1,5 V a -10 V na saída. Este CI possui uma
eficiência de 98% e requer apenas dois capacitores eletrolíticos externos (TEXAS INSTRUMENTS,
2006, datasheet TL7660).
Por fim, utilizaram-se dois reguladores de tensão, um positivo e outro negativo, de modo que a
alimentação do circuito tornasse mais estável, diminuindo possíveis ruídos que interfiram nos sinais. Os
CIs utilizados foram o KA7805 e L7905, reguladores de tensão positiva e negativa, respectivamente.
Estes CIs suportam correntes de saída de até 1 A e possuem proteção de curto circuito e de
sobreaquecimento (FAIRCHILD, 2001, datasheet KA78XX/KA78XXA) (ST, 2012, datasheet L79xxAC).
Na Figura 25, podem ser observadas as ligações dos componentes utilizados no circuito de
alimentação. Os valores dos capacitores foram obtidos por meio das recomendações presentes nos
datasheets dos fabricantes. Há, inclusive, uma chave mecânica, que serviu apenas para controlar se o
circuito estava energizado ou não.
Outro ponto importante foi a utilização de capacitores de cerâmica com valor nominal de 100
nF em cada ponto de alimentação do circuito, o que permitiu aumentar a estabilidade da alimentação,
de forma que não interferisse no condicionamento do sinal.
Figura 25 - Circuito de alimentação
28
Controle dos LEDs
Como os LEDs vermelho e infravermelho estão ligados em antiparalelo dentro do sensor e
apenas há um fotodiodo, é necessário ligar os LEDs de forma alternada, isto é, enquanto um está
emitindo, o outro está desligado.
Foi implementado um circuito de controle no formato de uma ponte-H como pode ser visto na
Figura 26. Nesta configuração, os transístores se comportaram como chaves,.
Na Tabela 2, pode ser vista a lógica de controle utilizada para controlar os LEDs, na qual 0
significa nível lógico baixo da saída do microcontrolador, que seria zero volts, e 1 representa nível lógico
alto correspondente a cinco volts.
Tabela 2 - Lógica de Controle dos LEDs
CtrlLed_1 CtrlLed_2 CtrlLed_3 CtrlLed_4 LED
Vermelho
LED
Infravermelho
0 0 1 1 Apagado Ligado
1 1 0 0 Ligado Apagado
1 0 0 1 Apagado Apagado
Figura 26 - Circuito esquemático de controle dos LEDs
Os transístores utilizados foram os BC558 e os BC548, que são do tipo PNP e NPN,
respectivamente. Os valores dos demais componentes utilizados foram obtidos a partir das
recomendações do fabricante para que os transístores atuassem como chaves eletrônicas (FAIRCHILD,
2002, datasheet BC556/557/558/559/560) (FAIRCHILD, 2002, datasheet BC548/BC548A/BC548B/
BC548C).
29
Amplificador de Transimpedância
O sinal de saída do fotodiodo é uma corrente proporcional à luz que incide sobre ele. Dessa
forma, é necessário transformar em tensão esta corrente. Para tal, é utilizado um circuito amplificador
de transimpedância, conforme a Figura 27.
Figura 27 - Amplificador de Transimpedância
O capacitor, Cf, no circuito tem a função de limitar a banda de frequência do amplificador,
enquanto o resistor, Rf, promove o ganho e a transformação da corrente em tensão, visto que:
Vsaída = Ifotodiodo ∗ Rf (18)
Onde, Ifotodiodo é a corrente reversa do fotodiodo e Vsaída é a tensão de saída do amplificador
de transimpedância.
Filtro Passa Baixa
Mesmo que fossem seguidos todos os procedimentos necessários para eliminar os ruídos, estes
ainda continuaram presentes no circuito. Como, em geral, os ruídos são de alta frequência, foi projetado
um filtro passa baixa com frequência de corte tal que eliminasse ou atenuasse tais ruídos e não
interferisse no espectro do sinal condicionado.
Utilizou-se um filtro ativo passa baixa com topologia Sallen-Key, como pode ser visto na Figura
28. Este é um tipo de filtro ativo de segunda ordem, onde o equacionamento de seus parâmetros e
características são expressos pelo conjunto de equações (19).
30
Figura 28 - Filtro ativo passa-baixa com topologia Sallen-Key
{
fc =
1
2 ∗ π ∗ √R1 ∗ R2 ∗ C1 ∗ C2
Q =√R1 ∗ R2 ∗ C1 ∗ C2
C2 ∗ (R1 + R2)
(19)
Onde, f𝑐 é a frequência de corte selecionada e Q é o fator de qualidade do filtro.
Sabe-se que a frequência cardíaca de um adulto está, normalmente, entre 60 a 100 BPM
(PORTO, 2014). Considerando um indivíduo que possui no máximo uma frequência cardíaca de 100
BPM, o que corresponde a um sinal de oximetria de 1,67 Hz, a maior parte do espectro de potência deste
sinal está contido em até 5 Hz. Isto porque, em um sinal de oximetria, 90% a 95% de seu espectro de
potência estão concentrados a partir da frequência cardíaca do indivíduo em até três vezes esta
frequência (HAYES, 2001).
Um filtro foi projetado com um fator de qualidade igual a 1 e frequência de corte em 5 Hz, pois
a maioria dos sinais de oximetria possuem grande parte dos seus espectros de potência contidos até esta
frequência. Os valores que são mostrados na Figura 28 foram calculados, levando em conta estas
considerações.
Filtro Passa Alta
Antes de realizar a amplificação do sinal, foi necessário remover o nível DC deste, pois assim o
sinal estaria centrado em torno de zero volts. Desse modo, pôde-se ser melhor amplificado sem que
houvesse distorção devido ao comportamento não linear dos amplificadores, quando o sinal de saída
possui magnitude próxima aos valores da alimentação.
Foi implementado um filtro passivo passa alta de primeira ordem, que filtrou o nível DC e as
oscilações de baixa frequência que ocorreram na prática. Na Figura 29, pode ser visto o filtro
31
implementado, onde os valores do capacitor e do resistor foram dimensionados de modo que a
frequência de corte, calculada por meio da equação (20), fosse em torno de 0,05 Hz, o que não alterou
o espectro do sinal de oximetria.
𝑓𝑐 =1
2. 𝜋. 𝑅. 𝐶 (20)
Figura 29 - Filtro passivo passa alta
Amplificador de ganho não inversor
Após essas etapas de filtragem, foi necessário um estágio de amplificação para que o sinal se
estabelecesse em valores adequados para realizar sua amostragem pelo microcontrolador. Na Figura 30,
pode ser visto o amplificador implementado do tipo não inversor, onde os valores das resistências
utilizadas foram dimensionados, baseando-se na equação (21), de modo que o ganho fosse
aproximadamente igual a 4,7.
Vsaída = (1 +R2
R1)Ventrada (21)
Figura 30 - Amplificador de ganho não inversor
32
Regulador de offset
Como o nível DC foi removido pelo filtro passa alta, o sinal possuía alguns valores negativos
de tensão, o que tornou impossível a conversão deste pelo conversor analógico-digital, CAD, do Arduino
Uno. Dessa forma, foi necessário introduzir uma tensão de offset no sinal de modo que este estivesse
contido na faixa de conversão do CAD. Para tanto, foi utilizado o circuito da Figura 31 que é um divisor
de tensão resistivo com desacoplamento feito pelo capacitor eletrolítico. Este circuito se comportou
como um filtro passa alta, cuja frequência de corte é igual a 0.03 Hz, porém sua função principal foi
inserir um offset de 2,5V no sinal visto que este é o valor central da faixa de conversão do CAD que
está contido entre 0 a 5V.
Figura 31 - Regulador de offset
Buffer de saída utilizando um amplificador single-supply rail-to-rail
O último estágio do circuito analógico foi um buffer, ou seguidor de tensão, que utilizou um
amplificador single-supply rail-to-rail (Figura 32). O buffer foi utilizado devido à possibilidade do sinal,
mesmo com o ajuste de offset, apresentar algum valor negativo que pudesse danificar o CAD do
Arduino. Além disso, esse buffer isola todo o circuito analógico do conversor, evitando, assim, que
algum efeito de carregamento pudesse ocasionar erros durante a conversão do sinal.
Figura 32 - Amplificador inversor unitário
33
3.2.2. Programação do Arduino
A programação do Arduino foi realizada pela IDE fornecida pelo próprio fabricante em seu site.
O diagrama em blocos da programação do Arduino pode ser visto na Figura 33.
A programação foi composta inicialmente pela configuração:
Das variáveis que são utilizadas;
Das portas digitais que controlam o circuito analógico;
Da serial Bluetooth que transmite os dados e da USB que é utilizada para verificação do código;
Dos timers que geram as interrupções necessárias para realizar as amostragens e a
temporização de cada processo.
Figura 33 - Diagrama em blocos da programação no Arduino
Após esta configuração, o programa teve de esperar até receber algum dado via Bluetooth. Caso
recebesse era necessário verificar se esse dado era válido. Se sim, deveria iniciar o processo de oximetria
de pulso.
Esse processo começa ligando primeiramente o LED vermelho por 10 segundos antes de se
realizar a leitura. Foi necessário esperar este tempo para que o sinal se estabilizasse em torno de um
valor. Esperado este tempo, foi realizada a leitura do sinal vermelho durante 5 segundos com um
34
intervalo de 4 ms entre cada leitura executada, ou seja, a uma taxa de amostragem de 250 Hz. Cada
amostra adquirida foi enviada via Bluetooth.
O processo se repetiu para o LED infravermelho. No entanto, 15 segundos foram precisos para
que o sinal se estabilizasse. Este tempo foi escolhido empiricamente durante os testes do circuito. Após
concluída a leitura dos dois sinais, o microcontrolador apagou os dois LEDs e ficou aguardando um
novo dado recebido via Bluetooth para que se iniciasse o processo de oximetria novamente.
O código desenvolvido é apresentado no Apêndice A – Código do Arduino.
3.2.3. Programação da Raspberry Pi
Raspbian – Sistema Operacional da Raspberry Pi
A programação se iniciou a partir da instalação de um Sistema Operacional em um cartão de
memória SD (do inglês, “Secure Digital”) com capacidade de 4 GB, utilizado pela Raspberry Pi. Esta
característica é um grande diferencial que ela possui em relação a outros microcontroladores, pois
permite uma programação em alto nível.
Existem diversos tipos de Sistemas Operacionais compatíveis para a Raspberry Pi, que podem
ser encontrados em seu site oficial (RASPBERRY PI, 2014, Downloads). Foi escolhido o Raspbian, que
é um sistema operacional baseado na distribuição Debian otimizado para o hardware da Raspberry Pi.
As instruções sobre a instalação do Raspbian no cartão SD foram encontradas no mesmo site do
fabricante, havendo variações dos passos a serem seguidos, dependendo do Sistema Operacional (Linux,
Mac OS ou Windows) do computador em que o usuário está desenvolvendo.
Terminada a instalação, pôde-se realizar o boot da Rasperry Pi a partir do cartão SD que contém
a imagem do Raspbian. A alimentação do dispositivo foi feita a partir de um conector micro USB, onde
a tensão de alimentação é de 5V com 700 a 1000 mA (RASPBERRY PI, 2014, FAQs: What Are The
Power Requirements?). Foi utilizada uma fonte que forneceu uma corrente de 1 A ou mais, visto que
durante o desenvolvimento percebeu-se, diversas vezes, que o boot do Raspbian falhava devido à baixa
capacidade de corrente da fonte. Foi preciso também que a cada etapa do desenvolvimento se fizesse
um backup da imagem do Raspbian utilizada, pois o cartão SD é corrompido a cada possível falha do
boot. O modo como se realiza este backup depende do Sistema Operacional que o usuário utiliza.
O Raspbian, por ser um Sistema Operacional baseado na distribuição Debian, permite que o seu
controle seja feito por meio de linhas de comando, sendo elas as mesmas utilizadas na maioria dos
sistemas Linux.
35
Configuração Inicial do Sistema Operacional
Para a primeira configuração, conectou-se a Raspberry Pi a um monitor, via cabo HDMI, e
realizou-se o login que, pelo padrão de fábrica, possui os termos “pi” e “raspberry” como usuário e
senha, respectivamente. A partir de então, a Raspberry redirecionou a tela para uma janela de
configuração, como pode ser vista na Figura 34. As configurações feitas referiram-se à expansão da
partição raiz de modo que todo o espaço do cartão SD estivesse disponível para a instalação dos
programas. A imagem do Raspbian necessita de 2 GB pelo menos. No entanto como mencionado
anteriormente, foi utilizado um cartão de 4 GB, garantindo espaço para o desenvolvimento de todo o
trabalho.
Figura 34 - Janela de configuração da Raspberry Pi
Outra configuração realizada foi a mudança da senha padrão para o usuário “pi”, o que permitiu
uma maior segurança em relação ao acesso ao Sistema Operacional. Após a realização destas
configurações, o sistema reiniciou para que as configurações fossem aplicadas.
Atribuindo um IP fixo
O próximo passo foi a configuração de um IP (do inglês, Internet Protocol) estático para a
Raspberry Pi, de modo que fosse possível acessar remotamente o dispositivo, o que dispensou a
necessidade de um monitor ligado à placa durante o desenvolvimento. Para realizar este procedimento,
conectou-se um cabo Ethernet entre a Raspberry Pi e um roteador. Em seguida, o roteador disponibilizou
um IP dinâmico e um conjunto de variáveis de configuração ao dispositivo. Este conjunto de variáveis,
juntamente com o IP fornecido, foram inseridos dentro de um arquivo de configuração de rede da
Raspberry Pi (MODMYPI, 2010).
36
Iniciando uma comunicação SSH
A partir de um IP fixo atribuído a Raspberry Pi, o acesso pôde ser feito por meio de uma
comunicação SSH (Secure Shell), que é uma ferramenta de acesso remoto, com grande ênfase em
segurança, onde os dados transmitidos entre dois dispositivos conectados por meio desta comunicação
são automaticamente criptografados e descriptografados.
A comunicação foi realizada por meio do software Putty (PUTTY, 2014). Na Figura 35, pode-
se observar uma imagem da janela do Putty, onde foi necessário colocar o IP fixo da Raspberry Pi no
campo “Host Name” e o número 22 no campo “Port”, cujo significado é a Porta de Comunicação SSH
utilizada para esta comunicação.
Figura 35 - Software de comunicação SSH (Putty)
Configuração do Bluetooth
Para utilizar a comunicação Bluetooth é necessário instalar alguns drivers e ajustar algumas
variáveis de configuração (DAWN ROBOTICS, 2013) (MYPIANDME, 2013). Durante esta
configuração, houve um problema na comunicação devido à versão do kernel utilizada pelo Sistema
Operacional. Um downgrade dessa versão possibilitou o correto funcionamento da comunicação
(RASPEBERRY PI, 2014, Connecting to arduino bluetooth module) (CHAN, 2014).
37
Programação em Python
A programação da Raspberry Pi foi composta por um programa em Python que inicializou a
comunicação Bluetooth, executou o processamento do sinal e o armazenamento dos resultados em um
banco de dados.
Para a programação em Python, foi necessário instalar um banco de dados na Raspberry Pi. O
banco utilizado neste projeto foi o sqlite3. A instalação do Python e do banco de dados sqlite3, pode ser
realizada a partir das seguintes linhas de comando.
Para gerenciar e visualizar o banco de dados, foi instalada a interface gráfica sqlitebrowser
(SQLITEBROWSER, 2014). Na Figura 36, pode ser observada esta interface gráfica.
Figura 36 - Interface gráfica para gerenciamento do banco de dados sqlite3
Foi criado um banco de dados contendo 3 tabelas que são:
allDatas – Guarda todos os dados recebidos do sinal vermelho e do infravermelho;
historyResult – Guarda todos os resultados da saturação pulsátil de oxigênio (SpO2) e
frequência cardíaca (BPM);
lastData – Guarda apenas os últimos dados recebidos do sinal vermelho e do infravermelho.
~$ sudo apt-get update
~$ sudo apt-get install python
~$ Sudo apt-get install sqlite3
38
Esta forma de separação foi escolhida para facilitar e agilizar o processo de busca dos dados
posteriormente efetuada pelo programa web.
Na Figura 37, pode ser observado como o programa em Python foi estruturado. Ele foi composto
inicialmente pela importação das bibliotecas necessárias e pela inicialização das variáveis,
posteriormente, iniciou-se a conexão Bluetooth que recebeu os dados enviados pelo Arduino Uno.
Enquanto a quantidade esperada de dados, que corresponde a 5 segundos de cada amostra dos sinais,
não for recebida, o programa ficou em loop. Após o completo recebimento dos dados, estes sinais foram
filtrados por um filtro de média móvel para remover os ruídos de 60 Hz.
Figura 37 - Diagrama em blocos da programação em Python na Raspberry Pi
O filtro de média móvel se inicia realizando a média aritmética das M primeiras amostras. Em
seguida a primeira amostra é descartada e é inserida a próxima para o cálculo da média novamente. Esse
processo se repete até que seja realizada a média de todo o sinal.
Este tipo de filtro atenua uma determinada frequência dada pela equação (22) e todos os
múltiplos inteiros desta frequência.
fc =𝑓𝑎𝑀
(22)
Onde,
𝑓𝑐 é a primeira frequência atenuada;
𝑓𝑎 é a frequência de amostragem;
M é quantidade de amostras que serão utilizadas para a média.
39
Sabendo que o Arduino realiza a amostragem dos sinais a uma taxa igual a 250 Hz e desejando
que a primeira frequência atenuada seja em 10 Hz, pode-se concluir que o comprimento M do filtro deve
ser igual a 25 amostras. Logo, o ruído de 60 Hz foi atenuado, pois este é múltiplo inteiro dessa
frequência.
Após executada a filtragem, o programa realizou um algoritmo de busca e localização dos picos
e dos vales dos sinais, para que na próxima etapa, fosse possível o cálculo da oximetria de pulso e da
frequência cardíaca. O algoritmo de busca dos picos e dos vales estabeleceu uma comparação entre n
amostras. Esta comparação verificou qual era o maior e o menor valor dentro desta quantidade de
amostras, sendo que n era um número inferior à quantidade total de amostras de cada sinal. Verificadas
estas n primeiras amostras, o algoritmo repetiu o mesmo processo para as seguintes n amostras, até que
se percorresse todo sinal. O algoritmo de procura dos picos e dos vales terminou quando se obteve a
média aritmética entre os picos e entre os vales de cada sinal.
A partir dos picos e dos vales obtidos foi possível calcular a relação R dada pela equação (13),
e, posteriormente, o cálculo da oximetria é realizado a partir da curva de calibração da equação (14).
A frequência cardíaca foi calculada a partir da média aritmética da frequência de cada sinal,
visto que o algoritmo de busca dos picos e dos vales salvou as posições onde estes extremos ocorreram.
Desse modo, pôde-se determinar o período entre cada pico, uma vez que a frequência de amostragem
foi fixada em 250 Hz pelo Arduino Uno.
O programa termina após a inserção dos dados e resultados no banco de dados, criado pelo
sqlitebrowser. No entanto, não foram inseridas todas as amostras dos sinais vermelho e infravermelho,
já que consome um processamento muito grande, tanto na escrita como na leitura do banco de dados.
Portanto, os dados destes sinais foram inseridos a cada 10 amostras. O que se teve, dessa forma, foi um
sinal salvo equivalente ao sinal original amostrado a uma frequência igual a 250
10 = 25 Hz. Mesmo
ocorrendo esta “redução” da taxa de amostragem, ela ainda atendeu ao critério de Nyquist, visto que o
espectro do sinal não é superior a 5 Hz.
Programação web
A aplicação web deste projeto foi desenvolvida por meio da utilização da plataforma Node.js e
do framework Express.
O Node.js é uma plataforma que utiliza o mecanismo V8 JavaScript do Google Chrome para
construir aplicações de rede rápidas e escaláveis. O Node.js é um modelo orientado a eventos, focado
em I/O (do inglês, Input/Output) não bloqueante, de modo que suas aplicações sejam leves e eficientes,
40
o que é perfeito para aplicações em tempo real com fluxo de dados em grande quantidade e rapidez por
meio de dispositivos distribuídos (MOREIRA, 2013, “O que é Node.Js?”).
O Express é um framework para o Node.js, sendo que esse é minimalista, flexível e possui um
robusto conjunto de recursos para desenvolver aplicações web, sistema de roteamento, executável para
geração de aplicações, dentre outras funções (MOREIRA, 2013, Primeiros passos com Express em
Node.js).
É necessário que a instalação do Node.js seja para a arquitetura da Raspberry Pi (NODEARM,
2014). Terminada a instalação do Node.js pôde-se iniciar a instalação do framework Express
(EXPRESS, 2014).
O método de instalação do framework Express utiliza o comando “npm” (do inglês, node
package modules), que é um gerenciador de pacotes do Node.js. Este comando foi utilizado para instalar
mais dois pacotes, que são o Sqlite3 e o Nodemon. O pacote Sqlite3 é responsável por permitir a
manipulação de um banco de dados do tipo sqlite3. O Nodemon é um outro pacote que auxiliou durante
o desenvolvimento do projeto, visto que ele monitora qualquer mudança em algum código que compõe
a aplicação web e, quando há detecção de alguma alteração, o pacote reinicia automaticamente a
aplicação web que está rodando sobre o Node.js (NPM, 2014) (NODEMON, 2014).
A instalação do framework Express criou uma pasta onde já está iniciado um projeto sobre o
Node.js e utilizando o framework Express. Esta é denominada a pasta raiz do projeto, e nela foi inserido
o programa em Python desenvolvido. Dentro da pasta “public/datas” colocou-se o banco de dados, que
é acessado tanto pelo programa em Python quanto pela aplicação web, quando for necessário inserir ou
buscar os dados e resultados armazenados.
Na pasta “public/images” foram colocadas as imagens que compõem a aplicação web, tal como
o logotipo desenvolvido. Na pasta “public/javascripts” encontram-se os programas em javascripts
responsáveis por gerar os gráficos, a dinâmica de algumas páginas e o layout destas. Na pasta
“public/stylesheets” foram inseridos os arquivos do tipo “css”, responsáveis pela formatação,
estruturação e pelo “layout” das páginas.
O conteúdo de cada página foi definido dentro da pasta “views”, em arquivos do tipo “Jade”. O
“Jade” é um “template engine” exclusivo para o Node.js o que permitiu facilmente a descrição do
conteúdo de uma página. O arquivo “index.jade” foi responsável pelo conteúdo da página inicial, o
“oximeter.jade” pelo conteúdo da página que mostra os resultados das medidas de oximetria e permite
a requisição de uma nova medida, e o “executingOximeterPy.jade” é a página redirecionada quando se
executa o programa em Python localizado na pasta raiz.
41
O arquivo “index.js” localizado na pasta “routes” foi responsável por gerenciar o roteamento
das páginas, enviar ou receber variáveis do browser, ler os dados e resultados do banco de dados e
executar o programa em Python da pasta raiz.
Na Figura 38, pode ser visto o diagrama em blocos da aplicação web, onde se percebem as
funcionalidades que foram descritas sobre o arquivo “index.js” e como as páginas foram interligadas
por meio da atuação deste arquivo.
42
Figura 38 - Diagrama em blocos da aplicação web
43
4. Resultados e Discussão
Neste capítulo são apresentados os resultados obtidos no projeto referente ao circuito analógico,
ao processamento digital do sinal (programação em Python) e à aplicação web. Serão feitas algumas
análises e discussões sobre cada resultado que foi obtido.
4.1. Circuito analógico
4.1.1. Filtros analógicos
A validação dos filtros implementados no circuito tem a finalidade de verificar se as
características postuladas em teoria, confirmam-se na prática. Assim foram obtidas as respostas em
frequência teóricas destes filtros, no software de simulação de circuitos elétricos e eletrônicos LTSpice,
e, posteriormente, os resultados foram comparados com dados experimentais realizados em bancada.
Os dados experimentais foram obtidos a partir da comparação entre o sinal de saída e o de
entrada inserido nos circuitos dos filtros. O sinal de teste inserido é uma onda senoidal com frequência
variável e amplitude fixa em 1 V pico a pico.
Tanto o sinal de entrada quanto o de saída foram analisados por meio da utilização do
osciloscópio DSO-X 2002A da Agilent Technologies, enquanto o sinal senoidal foi gerado a partir do
gerador de funções MFG-4221 da Minipa.
Filtro passa baixa
Os dados experimentais obtidos para o filtro passa baixa são mostrados na Tabela 3, enquanto,
na Figura 39, pode ser observado o sinal de entrada e de saída para uma frequência de 5 Hz, estabelecida
como a de corte para o projeto do filtro passa baixa ativo.
Tabela 3 - Dados experimentais do filtro passa baixa
Frequência (Hz) Entrada (Vpp1) Saída (Vpp) Ganho (dB) Fase (°)
0,50 1,07 1,07 0,00 -0,30
1,00 1,07 1,09 0,16 -6,70
2,00 1,07 1,11 0,32 -16,90
3,00 1,07 1,17 0,78 -31,10
4,00 1,07 1,23 1,21 -46,09
5,00 1,07 1,21 1,07 -68,00
6,00 1,07 1,09 0,16 -87,20
7,00 1,07 0,90 -1,50 -104,60
8,00 1,07 0,72 -3,44 -118,40
9,00 1,07 0,60 -5,02 -127,80
10,00 1,07 0,48 -6,96 -134,80
1 Tensão em volts de pico a pico do sinal
44
Figura 39 - Sinais de entrada e saída do filtro passa baixa para uma frequência de 5 Hz
Por meio da utilização do Matlab, esses dados experimentais foram comparados com o teórico
fornecido pelo software de simulação LTSpice. Na Figura 40, pode-se observar a comparação entre estes
dados.
Figura 40 - Comparação entre os dados teóricos e experimentais para o filtro passa baixa
45
Nota-se, pelo gráfico, que há pequenas diferenças entre os dados teóricos e experimentais. As
discrepâncias existem devido à tolerância de fabricação dos componentes.
Filtro passa alta
Analogamente ao que foi apresentado para o filtro passa baixa, os dados experimentais do filtro
passa alta são apresentados na Tabela 4, enquanto, na Figura 41 podem-se observar os sinais de entrada
e saída do filtro passa alta para uma frequência de 0,07 Hz.
Tabela 4 - Dados experimentais do filtro passa alta
Frequência (Hz) Entrada (Vpp2) Saída (Vpp) Ganho (dB) Fase (°)
0,02 1,07 0,42 -8,12 72,10
0,05 1,07 0,70 -3,69 54,80
0,07 1,07 0,82 -2,31 44,80
0,09 1,07 0,90 -1,50 35,87
0,12 1,07 0,96 -0,94 32,60
0,20 1,07 1,03 -0,33 20,19
0,50 1,07 1,07 0,00 8,70
1,00 1,07 1,07 0,00 4,33
10,00 1,07 1,07 0,00 1,55
Figura 41 - Sinais de entrada e saída do filtro passa alta para uma frequência de 0,07 Hz
2 Tensão em volts de pico a pico do sinal
46
Figura 42 - Comparação entre os dados teóricos e experimentais para o filtro passa alta
Novamente, percebe-se que há uma grande correlação entre os dados. As diferenças entre os
valores teóricos e experimentais se devem ao fato da tolerância de fabricação dos componentes.
4.1.2. Análise do sinal de oximetria em cada estágio do circuito
A validação dos outros estágios de condicionamento do sinal dentro do circuito analógico foi
realizada a partir da análise do sinal de saída em cada estágio do circuito. Para isso, utilizou-se um sinal
de oximetria real, no qual liga-se apenas um LED e a luz emitida por este atravessa o dedo de um
indivíduo.
Amplificador de transimpedância
O amplificador de transimpedância é responsável por converter a corrente do fotodiodo, que é
proporcional à luz recebida por este, em tensão. Na Figura 43, pode ser observado que o sinal de saída
deste estágio é muito ruidoso.
47
Figura 43 - Saída do amplificador de transimpedância
Filtro passa baixa
Devido à grande magnitude ruído existente no sinal de saída do estágio de transimpedância,
justificou-se o uso do filtro passa baixa. Na Figura 44, pode ser observado o resultado da filtragem do
sinal.
Figura 44 - Saída do filtro passa baixa
48
Percebe-se a grande redução do ruído no sinal, sendo possível reconhecer o padrão presente em
sinais de oximetria. Repara-se que a amplitude do sinal ainda é muito baixa, sendo necessário realizar
uma amplificação deste para uma melhor precisão dos resultados.
Filtro passa alta
Antes de se realizar a amplificação do sinal, este é submetido a um filtro passa alta para remoção
do nível DC e das flutuações de baixa frequência que acontecem na prática em um sinal de oximetria.
Pela Figura 45, nota-se que o sinal apresenta o mesmo padrão que na saída do filtro passa baixa, porém
o nível DC existente neste é praticamente nulo.
Figura 45 - Saída do filtro passa alta
Amplificador não inversor
Após a remoção do nível DC, pôde-se realizar a amplificação do sinal para obter melhor
resolução durante a conversão analógica-digital. Esta amplificação pode ser vista na Figura 46. Na saída
deste estágio, o sinal mantém o mesmo padrão, contudo, percebe-se a amplificação de todo o sinal e
uma alteração do nível DC.
A partir de uma análise das tensões de pico a pico dos sinais de saída e de entrada do
amplificador não inversor, calculou-se que o ganho prático deste amplificador foi:
49
𝑔𝑎𝑛ℎ𝑜 =(𝑉𝑚𝑎𝑥 − 𝑉𝑚𝑖𝑛)𝑠𝑎í𝑑𝑎(𝑉𝑚𝑎𝑥 − 𝑉𝑚𝑖𝑛)𝑒𝑛𝑡𝑟𝑎𝑑𝑎
=760 − (−820)
177 − (−177)= 4,46 (23)
Considerando que o ganho teórico dimensionado para este amplificador foi de 4,7. Pode-se
concluir que o valor experimental do ganho está dentro do esperado, visto que o erro existe devido à
presença da tolerância dos componentes utilizados na prática.
Figura 46 - Saída do amplificador não inversor
Ajuste de offset
O sinal de saída do amplificador não inversor possui valores negativos de tensão, logo não é
possível a conversão analógico-digital do sinal pelo CAD do Arduino. Portanto, se faz necessário um
ajuste do nível DC do sinal. Na Figura 47, é observado o sinal resultante do circuito de ajuste de offset
implementado, nota-se o mesmo padrão do sinal, porém com um nível DC por volta de 2,52 V.
Sabendo que o nível DC dimensionado para a saída deste circuito foi de 2,5 V, que corresponde
à metade da faixa de conversão suportada pelo Arduino, conclui-se que há uma grande correlação entre
os valores teórico e experimental.
50
Figura 47 - Saída do circuito de ajuste do offset
Apesar do condicionamento analógico do sinal aplicado, ainda há ruídos presentes no sinal de
oximetria, como pode ser visto pelo espectro de potência deste sinal (Figura 48). Percebe-se que há um
componente presente neste sinal com frequência em 60 Hz.
Figura 48 - Espectro de potência do sinal de saída do circuito analógico
A existência deste componente é esperada, visto que diversos aparelhos emitem radiação (ruído)
na mesma frequência da rede elétrica. Dessa forma, foi necessário o uso de um filtro para remover este
51
componente que está interferindo no sinal. Para esta finalidade utilizou-se um filtro digital de média
móvel, o qual foi implementado no processamento digital do sinal contido na programação em Python.
4.2. Transmissão Bluetooth
Para a validação da transmissão Bluetooth foi programado que o Arduino Uno enviasse uma
forma de onda padrão por meio da serial do Bluetooth e, quando a Raspberry Pi recebeu esses dados,
eles foram comparados com o mesmo padrão gravado no Arduino. Dessa forma, a Raspberry Pi soube
qual a ordem dos dados que deveria receber.
O sinal padrão em questão foi uma onda dente de serra, com valores inteiros, que iam de 0 até
1023. Este intervalo foi escolhido, porque durante a conversão analógica-digital os possíveis valores
convertidos estavam contidos justamente nesta gama de valores. O intervalo entre uma transmissão de
um dado e o seguinte foi definido em 4 ms, que corresponde a frequência de amostragem escolhida para
o projeto.
Este teste foi realizado em três situações diferentes: na primeira, a distância entre o Arduino
Uno e a Raspberry Pi foi de 1,5 m; na segunda, a distância foi de 6 m e na última a distância foi de 4 m,
porém havia uma parede entre eles nesta última situação.
Na Tabela 5, podem ser visualizados os resultados do teste da transmissão. Nota-se que nos três
casos, não houve erros na transmissão dos dados.
Tabela 5 - Resultados da transmissão Bluetooth
Teste Quantidade de
Dados Enviados
Quantidade de Dados
Recebidos Corretos
Quantidade de Dados
Recebidos Errados
1 1000000 1000000 0
2 1000000 1000000 0
3 1000000 1000000 0
Foi realizado um teste para verificar a distância máxima em que era possível o pareamento entre
os módulos Bluetooth. Descobriu-se que esta podia chegar a uma distância máxima de 12 m sem
obstáculos entre os módulos ou a 7 m quando havia algumas paredes entre eles.
4.3. Processamentos digitais do sinal (programação em Python)
Os principais processamentos digitais do sinal aplicados envolveram a filtragem de média móvel
e a localização dos picos e vales. Estes processos estavam contidos dentro do programa em Python que
inicializou a comunicação Bluetooth e o armazenamento dos dados e resultados em um banco de dados.
Nas Figuras 49 e 50, podem ser observados os resultados obtidos deste processamento. Na Figura 49,
52
são apresentados os sinais vermelho e infravermelho não filtrados com seus respectivos vales e picos
encontrados pelo algoritmo, enquanto, na Figura 50, podem ser visualizados os mesmos resultados para
esses sinais após o filtro de média móvel ser aplicado.
Nota-se que os primeiros e últimos picos e vales de cada sinal são desconsiderados, visto que
não há a necessidade de se utilizar todos os extremos encontrado (pois o sinal de oximetria não apresenta
uma variação repentina) para o cálculo da oximetria e também pela possibilidade do algoritmo
interpretar um falso extremo no começo ou no fim das sequências dos sinais.
Figura 49 - Sinais vermelho e infravermelho não filtrados junto aos seus respectivos picos e vales
Figura 50 - Sinais vermelho e infravermelho filtrados junto aos seus respectivos picos e vales
53
4.4. Aplicação web
A visualização e o controle do processo de oximetria deste projeto foram feitos pela aplicação
web, gerada pela Raspberry Pi por meio do Node.js e do framework Express. Esta aplicação web
permitiu que o usuário visualizasse três páginas diferentes:
A página inicial, que contêm informações sobre o projeto;
A página que permite verificar a oximetria e requisitar uma nova medição desta;
A página em que o usuário fica aguardando a realização da oximetria.
A página inicial pode ser observada na Figura 51. Foi composta apenas por uma mensagem de
boas-vindas, informações sobre o aplicativo, um botão que permite redirecionar o usuário para a
página de visualização da oximetria e o logotipo que foi criado para o projeto.
Figura 51 - Página inicial da aplicação web
Ao clicar no botão “Check your oximetry!”, o usuário abre uma nova página na qual visualiza
os dados e os resultados referentes à última medição de oximetria realizada (Figura 52). Esta página é
composta por três setores principais. No primeiro, conforme na Figura 53, observa-se o valor numérico
da oximetria e da frequência cardíaca, o horário e o dia em que foi realizada a medição referente aos
valores mostrados, um botão em que o usuário pode executar uma nova oximetria (“New oximetry!”) e
outro que permite retornar à página inicial (“Home page”).
O segundo setor (Figura 54) é composto por dois templates de gráficos (HIGHCHARTS, 2014).
O primeiro corresponde ao sinal de oximetria proveniente do LED vermelho, enquanto o segundo é
54
referente ao LED infravermelho. Ambos os gráficos refletem os sinais de oximetria correspondentes aos
valores numéricos apresentados no primeiro setor desta página. Estes gráficos permitem que o usuário,
utilizando o cursor do mouse, visualize os pontos que foram coletados durante a oximetria.
Por fim, na Figura 55, é mostrado o último setor que compõe esta página. Neste, é possível
observar o histórico das medições da oximetria e da frequência cardíaca por meio de dois gráficos
gerados pelo mesmo template anterior. Estes gráficos permitem selecionar e pressionar os pontos que
os geram. Caso isso aconteça, a página será atualizada juntamente com os dois primeiros setores.
A última página que compõe o aplicativo web é mostrada somente quando o usuário requer uma
nova oximetria. Esta página é mantida por aproximadamente 50 segundos, que corresponde ao tempo
de aquisição, transmissão via Bluetooth, processamento digital do sinal e armazenamento dos dados e
resultados no banco de dados. Passado este tempo, o usuário é redirecionado automaticamente para a
página de visualização da oximetria.
55
Figura 52 - Página que permite visualizar e requisitar uma nova medição de oximetria
56
Figura 53 - Visualização dos resultados numéricos da oximetria e da frequência cardíaca
Figura 54 - Visualização do sinal de oximetria proveniente dos LEDs vermelho e infravermelho
57
Figura 55 - Visualização do histórico de oximetria e da frequência cardíaca
Figura 56 - Página de espera enquanto a oximetria está sendo realizada
58
O aplicativo desenvolvido pode ser acessado por dispositivos móveis, tais como smartphones e
tablets. Na Figura 57, observa-se o aplicativo por meio de um smartphone. Nota-se que o aplicativo
automaticamente se redimensiona para uma melhor visualização no dispositivo.
Figura 57 - Visão da aplicação web através de um dispositivo móvel
4.5. Aferição da oximetria na presença de fontes de erros
Os resultados foram obtidos com usuário em repouso, respirando normalmente, com o sensor
conectado de forma correta ao seu dedo, sem esmaltes na unha e com iluminação ambiente baixa. Esse
conjunto de situações minimizam as fontes de erro para a realização da oximetria.
59
Para verificar o comportamento em situações desfavoráveis da oximetria, foram realizados
testes com diferentes posicionamentos e movimentações do dedo, durante a oximetria. Posteriormente,
executaram-se outros testes utilizando algumas cores de esmaltes de unha.
Na Figura 58, pode-se observar os testes aplicados para análise da oximetria em diferentes
posicionamentos e movimentações do dedo. O teste 1 mostra a interferência pela pressão do dedo ao
clip do sensor; o teste 2, pela flexão do dedo; o teste 3, por movimentos ondulatórios da mão; e o teste
4, pela combinação destes três primeiros (ANDRADE, 2009).
Figura 58 - Conjunto de testes com diferentes posicionamentos e movimentações do dedo
Fonte: (ANDRADE, 2009)
Os sinais obtidos nos testes 1 a 4 podem ser observados, respectivamente, nas Figuras 59, 60,
61 e 62, enquanto os resultados da oximetria e da pulsação destes testes estão disponibilizados na Tabela
6.
Tabela 6 - Resultados da oximetria e da pulsação cardíaca para os testes
Teste SpO2 (%) Frequência Cardíaca (BPM)
1 70 79
2 98 77
3 96 66
4 105 52
Nota-se pelos gráficos que o único sinal que não apresentou grandes distorções ocorreu durante
o teste 2, enquanto os piores resultados aconteceram nos testes 3 e 4. Os últimos testes possuem uma
grande flutuação dos seus sinais, visto que a movimentação do dedo gera grande ruído durante a medição
da oximetria. Portanto, este resultado demonstra ser essencial que o usuário esteja em repouso.
60
O sinal vermelho do teste 1 apresenta uma flutuação significativa em seu sinal vermelho, devido
ao fato do sensor estar mais exposto à luz ambiente durante o processo. Por fim, em ambos os testes
percebe-se que o algoritmo de busca dos picos e dos vales e a filtragem de média móvel mostraram bons
resultados.
Figura 59 - Sinal vermelho e infravermelho resultante do teste 1
Figura 60 - Sinal vermelho e infravermelho resultante do teste 2
61
Figura 61 - Sinal vermelho e infravermelho resultante do teste 3
Figura 62 - Sinal vermelho e infravermelho resultante do teste 4
O próximo teste consiste na medição da oximetria quando há esmaltes de cores opacas nas
unhas. Os sinais resultantes da utilização do esmalte de cor azul, preta e vermelha são apresentados nas
Figuras 63, 64 e 65, respectivamente. Na Tabela 7, podem ser visualizados os resultados da oximetria e
da pulsação cardíaca para cada cor de esmalte.
62
Tabela 7 - Resultados da oximetria e da pulsação cardíaca quando há esmaltes na unha
Cor do esmalte SpO2 (%) Frequência Cardíaca (BPM)
Azul 106 75
Preta 107 76
Vermelha 70 71
Os sinais de oximetria sofreram distorções para todas as cores utilizadas, isto porque a cor do
esmalte acaba absorvendo ou refletindo certos componentes da luz que incide sobre a unha. Esta
distorção gera resultados de oximetria comprometidos, que podem ser observados nos valores de SpO2
mostrados na Tabela 7. Nota-se, assim, que a frequência cardíaca está entre os valores esperados, o que
pode indicar que a cor do esmalte altera o sinal de oximetria em relação à amplitude, mas a frequência
não sofre grande efeito.
Enfim, o que se pode afirmar a partir destes testes, é que a presença de esmaltes de cores opacas
na unha deve ser evitada, pois altera o espectro do sinal de oximetria, resultando consequentemente em
falsos valores de oxigenação periférica.
Figura 63 - Sinal vermelho e infravermelho resultante da utilização do esmalte azul
63
Figura 64 - Sinal vermelho e infravermelho resultante da utilização do esmalte preto
Figura 65 - Sinal vermelho e infravermelho resultante da utilização do esmalte vermelho
64
65
5. Conclusão
Ao final deste projeto, foi possível obter conhecimentos acerca de vários itens: a importância e
o modo de aferição da oxigenação periférica do sangue e da pulsação cardíaca por meio da oximetria de
pulso; a utilização de dispositivos ópticos-eletrônicos (LEDs e fotodiodo); os circuitos analógicos para
o condicionamento do sinal (amplificador de transimpedância, filtros passa baixa e passa alta,
amplificadores de ganho, ajuste de offset, isoladores ou buffers, ponte-h, inversor e reguladores de
tensão); a programação do microcontrolador Arduino Uno; a aplicação do Teorema da Amostragem
para determinar a taxa de aquisição sem que resulte em aliasing do sinal; a transmissão Bluetooth
utilizando o módulo HC-05 e o dongle ES338; a configuração do microcomputador Raspberry Pi e a
instalação de pacotes, drivers e programas para desenvolvimento neste microcomputador; a
comunicação SSH para acessar a Raspberry Pi e assim realizar sua programação remotamente; o
desenvolvimento de programas utilizando a linguagem de programação Python que permitiu a
comunicação Bluetooth, o processamento digital do sinal e o armazenamento dos dados e resultados em
um banco de dados; a geração e a manipulação de um banco de dados do tipo “sqlite”; e a programação
web utilizando o Node.js e o framework Express, que permitem em conjunto a elaboração de um
aplicativo web;
O foco do projeto foi propiciar ao usuário a comodidade de iniciar a medição de oximetria e
visualizar seu resultado através de um aplicativo web, sem a necessidade da utilização de um display
específico para esta aplicação. Como se trata de uma aplicação web, qualquer dispositivo que permita
acesso à rede, pode ser utilizado como visualizador, tais como computadores, tablets e smartphones,
independente do tipo de sistema operacional que se utilize. O que se fez necessário para este projeto foi
a utilização de um roteador que permitiu conectar o dispositivo escolhido para visualização e controle
da oximetria com a aplicação web que era executada na Raspberry Pi.
A utilização de uma rede que permite a ligação de qualquer dispositivo com a aplicação web
possibilita o acionamento do oxímetro ligado a um usuário por uma outra pessoa dentro da rede interna.
Isso não impede que, ao mesmo tempo, o usuário ou outro indivíduo acesse seus dados e resultados de
oximetria.
O aplicativo web que se conecta ao oxímetro também pode ser acessado através de uma rede
externa. Para tanto, é necessário que se conheça o IP externo utilizado pela Raspberry Pi, ou, então, que
se realize um redirecionamento das portas do roteador e se atribua um domínio DNS (do inglês, Domain
Name System) a este.
A possibilidade do controle e da visualização da oximetria de modo remoto permite que este
projeto seja implementado em hospitais, onde enfermeiros são redirecionados, em intervalos de tempo
regulares, para coletar dados de oximetria de alguns pacientes e, posteriormente, anotar os resultados
66
em uma ficha de acompanhamento do paciente, que é guardada à frente de sua cama. Com este sistema,
é necessário apenas um funcionário para realizar, remotamente, a aferição da oximetria de todos os
pacientes. Os dados e os resultados são armazenados em um banco de dados digital que pode ser
arquivado ao final do acompanhamento do paciente. A utilização dos bancos de dados é uma forma útil
para casos onde se deve verificar se as medições foram realizadas nos horários corretos ou para futuras
análises de pesquisa ou de estatística.
As restrições encontradas neste projeto relacionam-se ao tempo de aquisição prolongado,
porque quando se ligou um LED foi necessário esperar um certo tempo até que o sinal de oximetria se
estabelecesse em torno de um valor. Uma possível solução, então, seria o chaveamento dos LEDs de
forma alternada e, posteriormente, a utilização de um circuito de “Sample&Hold” para separar os sinais,
visto que há apenas um fotodiodo para ambos os LEDs. Para que a solução anterior seja viável, é
necessária a escolha de um sensor que possua uma resposta rápida o suficiente para acompanhar o
chaveamento dos LEDs. Sobre o sensor, também é possível fazer uma análise do conjunto de LEDs
utilizados, da isolação de luz ambiente e da imobilização do dedo durante a oximetria de modo a
melhorar a qualidade do sinal. A distância e a taxa de transmissão do Bluetooth são outros limitantes do
projeto, sendo que uma alternativa para esta transmissão seria a utilização de outros radiotransmissores.
Por fim, o processamento da Raspberry Pi para a geração da aplicação web se mostrou limitado, visto
que durante a geração da página de visualização dos dados de oximetria, a unidade de processamento
da Raspberry Pi chegou a 100% e assim houve uma demora na resposta deste microcomputador.
Trabalhos futuros poderão ser feitos em todo o projeto, como por exemplo, a escolha de outro
sensor que tenha melhor resposta; o desenvolvimento de uma placa de circuito impresso para diminuir
capacitâncias parasitas e ruídos que são normalmente encontrados em protoboards; a utilização de
chaveamento alternado dos LEDs para diminuir o tempo de aquisição dos dados; a troca do
microcontrolador Arduino Uno por um ARM que permite um maior e mais rápido processamento
computacional; a mudança da comunicação Bluetooth por outra com maior alcance e taxa de
transmissão; e a utilização de outro sistema embarcado análogo a Raspberry Pi, tal como a BeagleBone
ou a Odroid.
Estes possíveis melhoramentos não só possibilitarão uma melhor análise da oximetria de pulso,
como também permitirão que outros sistemas de medições de sinais vitais sejam acoplados a este
projeto, de forma a gerar uma central de monitoramento de diversos sinais utilizando uma aplicação
web.
67
Referências Bibliográficas
ANDRADE, L. A. K., Sistema de Medição para Oximetria de Pulso. Curitiba, 2009.
ARDUINO, Arduino Uno. Arduino. 2014. Disponível em:
<http://arduino.cc/en/Main/ArduinoBoardUno>. Acesso em: 01 nov 2014.
ARDUINO, Download the Arduino Software. Arduino. 2014. Disponível em:
<http://arduino.cc/en/main/software>. Acesso em: 01 nov 2014.
ARDUINO, SoftwareSerial Library. Arduino. 2014. Disponível em:
<http://arduino.cc/en/Reference/softwareSerial>. Acesso em: 01 nov 2014.
CHAN, E., Upgrade/Downgrade to a specific firmware-kernel version with rpi-update in Raspbian.
2014. Disponível em: <http://tech.enekochan.com/en/2014/03/08/upgradedowngrade-to-a-specific-
firmware-kernel-version-with-rpi-update-in-raspbian/>. Acesso em: 01 nov 14.
DAWN ROBOTICS, Talking to a Bluetooth Serial Module with a Raspberry Pi. Dawn Robotics.
2013. Disponível em: <http://blog.dawnrobotics.co.uk/2013/11/talking-to-a-bluetooth-serial-module-
with-a-raspberry-pi/>. Acesso em: 01 nov 2014.
EXPRESS, Installing. 2014. Disponível em: <http://expressjs.com/starter/installing.html>. Acesso em:
01 nov 14.
FAIRCHILD, datasheet KA78XX/KA78XXA. Electronic Components Datasheet Search. 2001.
Disponível em: <http://pdf1.alldatasheet.com/datasheet-pdf/view/99445/FAIRCHILD/KA7805.html>.
Acesso em: 01 nov 2014.
FAIRCHILD, datasheet BC556/557/558/559/560. Datasheet Catalog. 2002. Disponível em:
<http://pdf.datasheetcatalog.com/datasheet/fairchild/BC558.pdf>. Acesso em: 01 nov 2014.
FAIRCHILD, datasheet BC548/BC548A/BC548B/BC548C. Datasheet Catalog. 2002. Disponível em:
<http://pdf.datasheetcatalog.com/datasheet/fairchild/BC548.pdf>. Acesso em: 01 nov 2014.
FINE, I.; WEINREB, A., Multiple scattering effect in transmission pulse oximetry. 1995.
HAYES, M. J.; SMITH, P. R., A new Method For Pulse Oximetry Possessing Inherent Insensitivity to
Artifact. In: IEEE Transactions on Biomedical Engineering, vol. 48, no. 4, p.452-461, 2001.
KIKUTHI, P. M. B., Desenvolvimento de um Circuito Sensor Analógico para um Oxímetro não
Invasivo. São Carlos, 2012.
LIMA, D. W. C., Oxímetro de Pulso com Transmissão de Sinal Sem Fios. Porto Alegre, 2009.
MARIEB, E. N.; HOEHN, K., Human Anatomy & Physiology. Eight ed., San Francisco: Benjamin
Cummings, ISBN: 987-0-8053-956-3, 2008.
MODMYPI, Tutorial How to Give Your Raspberry Pi a Static IP Address. ModMyPi. 2010.
Disponível em: <https://www.modmypi.com/blog/tutorial-how-to-give-your-raspberry-pi-a-static-ip-
address.>. Acesso em: 01 nov 2014.
MOREIRA, R. H., O que é Node.js?.2013. Disponível em: <http://nodebr.com/o-que-e-node-js/>.
Acesso em: 01 nov 14.
MOREIRA, R. H., Primeiros passos com Express em Node.js. 2013. Disponível em:
<http://nodebr.com/o-que-e-node-js/>. Acesso em: 01 nov 14.
MOYLE, J. T. B., Pulse Oximetry. London: BMJ, 1994.
68
MYPIANDME, Bluetooth Serial Communications with HC-05. MyRaspberryAndMe. 2013.
Disponível em http://myraspberryandme.wordpress.com/2013/11/20/bluetooth-serial-communication-
with-hc-05>. Acesso em: 01 nov 2014.
NGHIA, L. N. T., Design of a SpO2 Pulse Oximeter Prototype. Ho Chi Minh city-Vietnam, 2012.
NODEARM, An easy way to install node.js on the Raspberry Pi. 2014. Disponível em: <http://node-
arm.herokuapp.com/>. Acesso em: 01 nov 14.
NODEMON, nodemon reload automatically. 2014. Disponível em: <http://nodemon.io/>. Acesso em:
01 nov 14.
NPM, sqlite3. 2014. Disponível em: <https://www.npmjs.org/package/sqlite3>. Acesso em: 01 nov 14.
PHILIPS, Understanding Pulse Oximetry SpO2 Concepts. Disponível em:
<http://incenter.medical.philips.com/doclib/enc/fetch/586262/586457/Understanding_Pulse_Oximetry.
pdf%3Fnodeid%3D586458%26vernum%3D2>. Acesso em: 01 nov 2014.
PORTO, C. C., Semiologia Medica. 7. ed. Rio de Janeiro: Guanabara Koogan, 2014. 1413 p
PUTTY, Download Putty. Putty. 2014. Disponível em: <http://www.putty.org/>. Acesso em: 01 nov
2014.
RASPBERRY PI, About Us. Raspberry Pi. 2014. Disponível em: <http://www.raspberrypi.org/about/
>. Acesso em: 01 nov 2014.
RASPBERRY PI, Connecting to arduino bluetooth module. Raspberry Pi. 2014. Disponível em:
<http://www.raspberrypi.org/forums/viewtopic.php?f=28&t=81934>. Acesso em: 01 nov 2014.
RASPBERRY PI, Downloads. Raspberry Pi. 2014. Disponível em:
<http://www.raspberrypi.org/downloads/>. Acesso em: 01 nov 2014.
RASPBERRY PI, FAQs: “What Are The Power Requirements?”. Raspberry Pi. 2014. Disponível em:
<http://www.raspberrypi.org/help/faqs/#powerReqs>. Acesso em: 01 nov 2014.
RASPBERRY PI, Raspberry Pi Models And Revisions. Raspberry Pi. 2014. Disponível em:
<http://www.raspberrypi.org/documentation/hardware/raspberrypi/models/ >. Acesso em: 01 nov
2014.
SANTINI, T. R. S., Projeto de um Oxímetro de Pulso com Comunicação USB. São Carlos, 2010.
SQLITEBROWSER, DB Browser for Sqlite. 2014. Disponível em: <http://sqlitebrowser.org/>.
Acesso em: 01 nov 14.
ST, datasheet L79xxAC. Farnell. 2012. Disponível em:
<http://www.farnell.com/datasheets/1689812.pdf>. Acesso em: 01 nox 2014.
STEINKE, J. M.; SHEPHERD, A. P., Role of light scattering in whole blood oximetry. 1986.
TEXAS INSTRUMENTS, datasheet TL7660. Electronic Components Datasheet Search. 2006.
Disponível em: <http://pdf1.alldatasheet.com/datasheet-pdf/view/162545/TI/TL7660.html>. Acesso
em: 01 nov 2014.
TOWNSEND, N., Lecture 6 – Pulse Oximetry. C3B Medical Electronics. 2001. Disponível em:
<http://www.robots.ox.ac.uk/~neil/teaching/lectures/med_elec/lecture6.pdf >.
WEBSTER, J. G., Design of Pulse Oximeters. Wisconsin-Madison, 1997.
69
Apêndices
Apêndice A – Código do Arduino
#include <TimerOne.h>
#include <SoftwareSerial.h>
/**
pino10(Rx) do arduino <-> Tx do HC05
pino11(Tx) do arduino <-> Rx do HC05
**/
SoftwareSerial BTSerial(10, 11); // RX | TX
int readAD = 0; // O canal de entrada dos sinais Vermelho e Infravermelho será o ADC 0
int ctrlLed2 = 6; // Controle do LED - Fio Verde
int ctrlLed3 = 7; // Controle do LED - Fio Branco
int ctrlLed4 = 8; // Controle do LED - Fio Amarelo
int ctrlLed5 = 9; // Controle do LED - Fio Vermelho
int ledRed = 5;
int ledReadRed= 4;
int ledIRed = 3;
int ledReadIRed = 2;
char dataBTReceive;
#define MaxSizeBuffer 1250
int IndexRed;
int IndexIR;
boolean EndRed = false;
boolean EndIRed = false;
#define waitTime5 1250
#define waitTime10 2500
#define waitTime15 3750
int time;
int BufferRed;
int BufferIRed;
/**
state= 0: Todos os LEDs desligados
state= 1: Liga o LED Vermelho, realiza a leitura equivalente a 5 seg, envia os dados via Bluetooth e desliga o LED Vermelho
state= 3: Liga o LED Infravermelho, realiza a leitura equivalente a 5 seg, envia os dados via Bluetooth e desliga o LED
Infravermelho
**/
int state;
void redOn(); // Liga o LED Vermelho
void iredOn(); // Liga o LED Infravermelho
void allOff(); // Desliga todos os LEDs
void readRedLed();
void readlRedLed();
void setup()
{
pinMode(ctrlLed2, OUTPUT);
pinMode(ctrlLed3, OUTPUT);
pinMode(ctrlLed4, OUTPUT);
pinMode(ctrlLed5, OUTPUT);
pinMode(ledRed,OUTPUT);
pinMode(ledReadRed,OUTPUT);
pinMode(ledIRed,OUTPUT);
pinMode(ledReadIRed,OUTPUT);
state = 0; // estado inicial
allOff();
digitalWrite(ledRed,LOW);
digitalWrite(ledReadRed,LOW);
digitalWrite(ledIRed,LOW);
digitalWrite(ledReadIRed,LOW);
IndexRed = 0;
IndexIR = 0;
time = 0;
Serial.begin(115200);
Serial.flush();
BTSerial.begin(115200);
BTSerial.flush();
Timer1.initialize(4000); // Overflow do Timer1
Timer1.attachInterrupt(switchState); // A cada overflow do timer chama-se esta funcao
Serial.println("newOximeter2");
}
void loop() {
if (BTSerial.available()) {
dataBTReceive = char(BTSerial.read());
if(dataBTReceive == '1'){
Serial.println(dataBTReceive);
BTSerial.flush();
state++;
}
else
70
Serial.println("dado incorreto");
}
}
void switchState() {
switch (state) {
case 0:
allOff();
break;
case 1:
redOn();
digitalWrite(ledRed,HIGH);
if(time++ == waitTime10-1) {
time = 0;
state++;
}
break;
case 2:
digitalWrite(ledReadRed,HIGH);
readRedLed();
if (EndRed == true) {
iredOn();
digitalWrite(ledRed,LOW);
digitalWrite(ledReadRed,LOW);
state++;
EndRed = false;
}
break;
case 3:
iredOn();
digitalWrite(ledIRed,HIGH);
if(time++ == waitTime15-1) {
time = 0;
state++;
}
break;
case 4:
digitalWrite(ledReadIRed,HIGH);
readIRedLed();
if (EndIRed == true) {
allOff();
digitalWrite(ledIRed,LOW);
digitalWrite(ledReadIRed,LOW);
state = 0;
EndIRed = false;
}
break;
}
}
void redOn() {
digitalWrite(ctrlLed2,HIGH);
digitalWrite(ctrlLed3,HIGH);
digitalWrite(ctrlLed4,LOW);
digitalWrite(ctrlLed5,LOW);
}
void iredOn() {
digitalWrite(ctrlLed2,LOW);
digitalWrite(ctrlLed3,LOW);
digitalWrite(ctrlLed4,HIGH);
digitalWrite(ctrlLed5,HIGH);
}
void allOff() {
digitalWrite(ctrlLed2,HIGH);
digitalWrite(ctrlLed3,LOW);
digitalWrite(ctrlLed4,HIGH);
digitalWrite(ctrlLed5,LOW);
}
void readRedLed() {
BTSerial.println("R");
BTSerial.flush();
BTSerial.println(analogRead(readAD));
BTSerial.flush();
if(IndexRed++ == MaxSizeBuffer-1) {
IndexRed= 0;
EndRed = true;
}
}
void readIRedLed() {
BTSerial.println("I");
BTSerial.flush();
BTSerial.println(analogRead(readAD));
BTSerial.flush();
if(IndexIR++ == MaxSizeBuffer-1) {
IndexIR= 0;
EndIRed = true;
}
}
71
Apêndice B – Programação em Python
#-*- coding: utf-8 -*-
#! /usr/bin/python
import serial
import sqlite3
import time
import numpy as np
import math
redDataIn = []
iredDataIn = []
redData = []
iredData = []
redDataFiltered = []
iredDataFiltered = []
indexValleyRed = []
indexValleyIRed = []
indexPeakRed = []
indexPeakIRed = []
valleyRed = []
valleyIRed = []
peakRed = []
peakIRed = []
dbname='public/datas/oximeterlog.db'
####################### Comunicacao Bluetooth #######################
bluetoothSerial = serial.Serial( "/dev/rfcomm0", baudrate=115200)
open("red.dat",'w').close()
open("ired.dat",'w').close()
bluetoothSerial.write("1")
bluetoothSerial.flush()
i = 0
while i<2500: #cuidado com este valor!!!! = 2*MaxSizeBuffer
bt_data =(bluetoothSerial.readline().rstrip('\r\n'))
bluetoothSerial.flush()
i +=1
if (bt_data == "R"):
if (i == 1250):
bt_data =(bluetoothSerial.readline().rstrip('\r\n'))
else:
bt_data =(bluetoothSerial.readline())
bluetoothSerial.flush()
with open("red.dat","a") as file:
file.write(bt_data)
elif (bt_data == "I"):
bt_data =(bluetoothSerial.readline().rstrip('\r\n'))
else:
bt_data =(bluetoothSerial.readline())
bluetoothSerial.flush()
with open("ired.dat","a") as file:
file.write(bt_data)
else:
print(bt_data)
print("error")
####################### Processamento dos Sinais #######################
def find_peak_valley(data,peakOrValley):
index=[]
extreme=[]
npts = 100
i = 0
if (peakOrValley == 1):
while (i < npts):
if(max(data[0:i+npts]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
while (i < len(data)-npts):
if(max(data[i-npts:i+npts]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
while (i < len(data)):
if(max(data[i-npts:len(data)]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
return index,extreme
elif (peakOrValley == -1):
72
while (i < npts):
if(min(data[0:i+npts]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
while (i < len(data)-npts):
if(min(data[i-npts:i+npts]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
while (i < len(data)):
if(min(data[i-npts:len(data)]) == data[i]):
index.append(i)
extreme.append(data[i])
i = i+npts
else:
i = i+1
return index,extreme
else:
print("error!")
return index, extreme
def save(nameFile,index,extreme):
i = 0
open(nameFile,'w').close()
while (i < len(index)):
with open(nameFile,'a') as file:
file.write(str(index[i])+' ')
file.write(str(extreme[i])+'\n')
i = i+1
f = open('red.dat','r')
for line in f:
redDataIn.append(float(line.rstrip('\n'))) #Cuidado -> nao deixe linha em branco
f.closed
f = open('ired.dat','r')
for line in f:
iredDataIn.append(float(line.rstrip('\n'))) #Cuidado -> nao deixe linha em branco
f.closed
redData = np.array(redDataIn) * 5.0 / 1024.0
iredData = np.array(iredDataIn) * 5.0 / 1024.0
# Aplicando um filtro de media 25
k = 1
while (k < len(redData) - 25):
x = 0
y = 0
for l in range (k,k+25):
x = x + redData [l]
y = y + iredData [l]
redDataFiltered.append(x / 25.0)
iredDataFiltered.append(y / 25.0)
k = k + 1
# Encontrando os Picos e Vales do Vemelho e Infravermelho
indexValleyRed,valleyRed = find_peak_valley(redDataFiltered ,-1)
indexValleyIRed,valleyIRed = find_peak_valley(iredDataFiltered ,-1)
indexPeakRed,peakRed = find_peak_valley(redDataFiltered ,1)
indexPeakIRed,peakIRed = find_peak_valley(iredDataFiltered ,1)
# Eliminando o primeiro e o último extremo
indexPeakRedUtil = indexPeakRed[1:len(indexPeakRed)-1]
peakRedUtil = peakRed[1:len(peakRed)-1]
indexValleyRedUtil = indexValleyRed[1:len(indexValleyRed)-1]
valleyRedUtil = valleyRed[1:len(valleyRed)-1]
indexPeakIRedUtil = indexPeakIRed[1:len(indexPeakIRed)-1]
peakIRedUtil = peakIRed[1:len(peakIRed)-1]
indexValleyIRedUtil = indexValleyIRed[1:len(indexValleyIRed)-1]
valleyIRedUtil = valleyIRed[1:len(valleyIRed)-1]
# Medias dos Picos e Vales de cada sinal
peakRed = np.mean(peakRedUtil)
valleyRed = np.mean(valleyRedUtil)
peakIRed = np.mean(peakIRedUtil)
valleyIRed = np.mean(valleyIRedUtil)
# Calculo da razao R pelo metodo dos picos e vales
r = math.log(valleyRed / peakRed)/math.log(valleyIRed / peakIRed)
# Calculo do SpO2
spo2_1 = (1000.0 - 550.0 * r) / (900.0 - 350.0 * r) * 100.0
spo2_2 = 10.0002 * math.pow(r,3) - 52.887 * math.pow(r,2) + 26.871 * r + 98.283
spo2_3 = 110.0 - 25.0 * r
#print(spo2_1)
#print(spo2_2)
#print(spo2_3)
# Calculo da frequencia cardiaca
k = 0
periodsRed = []
73
while (k < len(indexPeakRedUtil)-1):
periodsRed.append(indexPeakRedUtil[k+1]-indexPeakRedUtil[k])
k = k + 1
freqRed = 1 / (0.004 * sum(periodsRed) / len(periodsRed))
bpmRed = freqRed * 60.0
k = 0
periodsIRed = []
while (k < len(indexPeakIRedUtil)-1):
periodsIRed.append(indexPeakIRedUtil[k+1]-indexPeakIRedUtil[k])
k = k + 1
freqRed = 1 / (0.004 * sum(periodsIRed) / len(periodsIRed))
bpmIRed = freqRed * 60.0
bpm = (bpmRed + bpmIRed) / 2.0
#print(bpm)
# Salvar os Picos e Vales do Red e InfraRed nos arquivos .dat
save("peak_red.dat",indexPeakRedUtil ,peakRedUtil )
save("valley_red.dat",indexValleyRedUtil ,valleyRedUtil )
save("peak_ired.dat",indexPeakIRedUtil ,peakIRedUtil )
save("valley_ired.dat",indexValleyIRedUtil ,valleyIRedUtil )
####################### Banco de Dados #######################
def log_dB():
conn=sqlite3.connect(dbname)
curs=conn.cursor()
# Salva os valores de SpO2 e BPM
curs.execute("INSERT INTO historyResult values(datetime('now'), (?), (?))", (format(spo2_3, '.0f'), format(bpm, '.0f'),))
# Limpa a tabela lastData
curs.execute("DELETE FROM lastData")
index = 0
record_data = []
while(index < len(redDataFiltered)):
record_data.append( (index, format(redDataFiltered[index], '.2f'), format(iredDataFiltered[index], '.2f')) )
index = index + 10
# Salva os dados recebidos dos sinais vermelho e infravermelho na tabela lastData
curs.executemany("INSERT INTO lastData (samplingTime, red, ired) values((?), (?), (?))", record_data)
# Obtem quantas medidas já foram realizadas anteriormente
curs.execute("SELECT COUNT(*) FROM allDatas")
nRows = list(curs.fetchone())
nSampling = nRows[0] / 123
index = 0
record_data = []
while(index < len(redDataFiltered)):
record_data.append( (nSampling * 1230 + index, format(redDataFiltered[index], '.2f'), format(iredDataFiltered[index],
'.2f')) )
index = index + 10
# Salva os dados recebidos dos sinais vermelho e infravermelho na tabela allDatas
curs.executemany("INSERT INTO allDatas (samplingTime, red, ired) values((?), (?), (?))", record_data)
conn.commit()
conn.close()
# Salva os resultados no banco de dados
log_dB()
print("1")
Apêndice C – Validação da transmissão Bluetooth (Arduino)
#include <TimerOne.h>
#include <SoftwareSerial.h>
/**
pino10(Rx) do arduino <-> Tx do HC05
pino11(Tx) do arduino <-> Rx do HC05
**/
SoftwareSerial BTSerial(10, 11); // RX | TX
int btData;
char dataBTReceive;
int nDataSent;
int signal;
int state;
#define maxDataSent 1000000 // equivale a 4000 seg = 1h e 6 min
void setup()
{
btData = 0;
nDataSent = 0;
state = 0;
signal = 0;
Serial.begin(115200);
Serial.flush();
BTSerial.begin(115200);
BTSerial.flush();
74
Timer1.initialize(4000); // Timer1's overflow
Timer1.attachInterrupt(switchState); // A cada overflow do timer chama-se esta funcao
}
void loop() {
if (BTSerial.available()) {
dataBTReceive = char(BTSerial.read());
if(dataBTReceive == '1'){
Serial.println(dataBTReceive);
BTSerial.flush();
state++;
}
else
Serial.println("dado incorreto");
}
}
void switchState() {
switch (state) {
case 0:
break;
case 1:
if(nDataSent == maxDataSent) {
state = 0;
nDataSent = 0;
signal = 0;
}
else {
BTSerial.println(signal);
BTSerial.flush();
nDataSent++;
if(++signal == 1024){
signal = 0;
}
}
break;
}
}
Apêndice D – Validação da transmissão Bluetooth (Raspberry Pi)
#! /usr/bin/python
import serial
bluetoothSerial = serial.Serial( "/dev/rfcomm0", baudrate=115200)
send_command = raw_input("write '1' to begin: ")
open("BTdata.dat",'w').close()
bluetoothSerial.write(send_command)
bluetoothSerial.flush()
i = 0
signal = 0
error = 0
while i<1000000:
bt_data =(bluetoothSerial.readline().rstrip('\r\n'))
bluetoothSerial.flush()
if (int(bt_data) != signal):
error += 1
print("number of errors: " + str(error))
i +=1
signal +=1
if (signal == 1024):
signal = 0
print("Ok!")
with open("BTdata.dat","a") as file:
file.write(bt_data + '\r\n')
with open("BTdata.dat","a") as file:
file.write("number of errors: " + str(error))
print(">>number of errors: " + str(error))
print("end!")
Apêndice E – Programação web – index.js
var express = require('express');
var router = express.Router();
var exec = require('child_process').exec;
var child;
var labels;
var labelsTime;
var seriesSpo2;
var seriesBpm;
var seriesRed;
var seriesIRed;
var showSpo2;
var showBpm;
var showTime;
var tickInterval;
75
var sendDatas = function(res) {
res.render('oximeter', {
title: 'Web Pulse Oximeter',
mLabels: labels,
mseriesSpo2: seriesSpo2,
mseriesBpm: seriesBpm,
mtime: labelsTime,
mred: seriesRed,
mired: seriesIRed,
mshowSpo2: showSpo2,
mshowBpm: showBpm,
mshowTime: showTime,
mtickInterval: tickInterval
});
};
router.get('/', function(req, res) {
res.render('index', { title: 'Web Pulse Oximeter' });
});
router.get('/oximeter', function(req, res) {
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('public/datas/oximeterlog.db');
var section = req.query.section;
var index = (section * 123) + 1;
var upperIndex = index+123;
var nSampligns = 0;
labels = [];
labelsTime = [];
seriesSpo2 = [];
seriesBpm = [];
seriesRed = [];
seriesIRed = [];
db.serialize(function(){
if (section > -1) {
while (index < upperIndex) {
db.each("SELECT samplingTime AS time, red, ired FROM allDatas WHERE rowid = " + (index), function(err, row) {
labelsTime.push('\'' + String(row.time) + '\'');
seriesRed.push(row.red);
seriesIRed.push(row.ired);
});
index++;
}
var rowId = ++section;
db.each("SELECT timestamp AS time, spo2, bpm, rowid FROM historyResult", function(err, row) {
labels.push('\'' + String(row.time) + '\'');
seriesSpo2.push(row.spo2);
seriesBpm.push(row.bpm);
nSampligns = ++nSampligns;
if(row.rowid == (rowId)) {
showSpo2 = row.spo2;
showBpm = row.bpm;
showTime = row.time;
}
}, function(err2, row2) {
tickInterval = Math.round(nSampligns / 6);
sendDatas(res);
});
}
else {
db.each("SELECT samplingTime AS time, red, ired FROM lastData", function(err, row) {
labelsTime.push('\'' + String(row.time) + '\'');
seriesRed.push(row.red);
seriesIRed.push(row.ired);
});
db.each("SELECT timestamp AS time, spo2, bpm FROM historyResult", function(err, row) {
labels.push('\'' + String(row.time) + '\'');
seriesSpo2.push(row.spo2);
seriesBpm.push(row.bpm);
nSampligns = ++nSampligns;
showSpo2 = row.spo2;
showBpm = row.bpm;
showTime = row.time;
}, function(err2, row2) {
tickInterval = Math.round(nSampligns / 6);
sendDatas(res);
});
}
});
db.close();
});
router.get('/executingOximeterPy', function(req, res) {
child = exec("python oximeter.py",
function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
if (stdout == 1) {
console.log('executingOximeterPy page will be closed!');
}
});
res.render('executingOximeterPy', { title: 'Web Pulse Oximeter' })
});
module.exports = router;
76
Apêndice F – Programação web – oximeter.js
/* Wait time function */
var waitTime = function() {
setTimeout(function() {
location.href='/oximeter?section=-1';
}, 50000);
}
Apêndice G – Programação web – index.jade
extends layout
block content
h1 Welcome to #{title}
p In this web app, you are able to measure your Peripheral Oxygen Saturation (SpO2) and Beats Per Minute (BPM).
div
a(href='/oximeter?section=-1')
button.btn.btn-primary.btn-lg See your oximetry!
img(src="images/logoWebPulseOximeter.png", alt="Logo WebPulseOximeter")
Apêndice H– Programação web – oximeter.jade
extends layout
block content
h1 Hello! Here you can visualize your oximetry.
.row
div.col-md-2
a(target='_self', href='/executingOximeterPy')
button.btn.btn-success.btn-lg New oximetry!
div.col-md-2
a(href="/")
button.btn.btn-info.btn-lg Home Page
h2 These are your oximetry data at #{mshowTime}.
.row
div.col-md-4
h2 SpO2:
span.label.label-primary #{mshowSpo2} %
div.col-md-4
h2 BPM:
span.label.label-primary #{mshowBpm}
#chart-red
#chart-ired
h2 Your Oximetry and Heart Rate history.
h3 Click on a point at any of the charts below in order to see the corresponding oximetry data.
#chart-spo2
#chart-bpm
script(text='javascript').
$('#chart-spo2').highcharts({
title: {
text: 'Peripheral Oxygen Saturation',
x: -20, //center
style: {
"color": "#000",
"fontSize": "26px",
"fontWeight": "bold"
}
},
colors: ['#0f0'],
xAxis: {
categories: [#{mLabels}],
tickInterval: #{mtickInterval},
tickWidth: 0,
gridLineWidth: 1
},
yAxis: {
title: {
text: 'SpO2 (%)'
}
},
tooltip: {
valueSuffix: ' %'
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
plotOptions: {
series: {
cursor: 'pointer',
point: {
events: {
77
click: function (e) {
console.log('section: ' + this.x);
location.href='/oximeter?section=' + this.x ;
}
}
}
}
},
series: [{
name: 'SpO2',
data: [#{mseriesSpo2}]
}]
});
$('#chart-bpm').highcharts({
title: {
text: 'Beats Per Minute',
x: -20, //center
style: {
"color": "#000",
"fontSize": "26px",
"fontWeight": "bold"
}
},
colors: ['#00f'],
xAxis: {
categories: [#{mLabels}],
tickInterval: #{mtickInterval},
tickWidth: 0,
gridLineWidth: 1
},
yAxis: {
title: {
text: 'BPM'
}
},
tooltip: {
valueSuffix: ' BPM'
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
plotOptions: {
series: {
cursor: 'pointer',
point: {
events: {
click: function (e) {
console.log('section: ' + this.x);
location.href='/oximeter?section=' + this.x ;
}
}
}
}
},
series: [{
name: 'BPM',
data: [#{mseriesBpm}]
}]
});
$('#chart-red').highcharts({
title: {
text: 'Red signal data',
x: -20, //center
style: {
"color": "#000",
"fontSize": "26px",
"fontWeight": "bold"
}
},
colors: ['#f00'],
xAxis: {
categories: [#{mtime}],
tickInterval: 15,
tickWidth: 0,
gridLineWidth: 1
},
yAxis: {
title: {
text: 'Voltage (V)'
}
},
tooltip: {
valueSuffix: ' V'
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
series: [{
name: 'RED',
data: [#{mred}]
}]
});
$('#chart-ired').highcharts({
78
title: {
text: 'InfraRed signal data',
x: -20, //center
style: {
"color": "#000",
"fontSize": "26px",
"fontWeight": "bold"
}
},
colors: ['#ff851f'],
xAxis: {
categories: [#{mtime}],
tickInterval: 15,
tickWidth: 0,
gridLineWidth: 1
},
yAxis: {
title: {
text: 'Voltage (V)'
}
},
tooltip: {
valueSuffix: ' V'
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
series: [{
name: 'IRED',
data: [#{mired}]
}]
});
div
a(href="/")
img(src="images/logoWebPulseOximeter.png", alt="Logo WebPulseOximeter")
Apêndice I – Programação web – executingOximeterPy.jade
extends layout2
block content
script(src='/javascripts/oximeter.js')
script(src='/javascripts/pace.min.js')
h1 Assessing your oximetry!
h3 Wait a moment please, while we are assessing your oximetry!
link(rel='stylesheet', href='/stylesheets/cornerIndicator.css')
script.
waitTime();
Apêndice J – Programação web – layout.jade
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel='stylesheet', href='/stylesheets/bootstrap.min.css')
body
header
h1 #{title}
script(src='/javascripts/jquery.js')
script(src='/javascripts/bootstrap.min.js')
script(src='/javascripts/highcharts.js')
script(src='/javascripts/exporting.js')
.container
.row
.col-md-12
block content
footer
p Web Pulse Oximeter.
Apêndice K – Programação web – layout2.jade doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel='stylesheet', href='/stylesheets/bootstrap.min.css')
body
header
h1 #{title}
.container
.row
.col-md-12
block content
footer
p Web Pulse Oximeter.
79
Anexo
Anexo A – Configuração do HC-05
Modify The HC-05 Bluetooth Module Defaults Using AT Commands by techbitar <http://www.instructables.com/id/Modify-The-HC-05-Bluetooth-Module-Defaults-Using-
A/?ALLSTEPS>
This Arduino program (HC_05.ino) does two things. It takes the AT commands you enter from the Arduino IDE Serial Monitor and sends those commands to the HC-05. The program then
reads the output of the HC-05 and displays it on the Arduino IDE Serial Monitor. You can also use a terminal emulator such as Tera Term instead of the Arduino Serial Monitor.
The Arduino communicates with the HC-05 using the SoftwareSerial ports while the Arduino communicates with the user via the Serial Monitor.
/*
AUTHOR: Hazim Bitar (techbitar)
DATE: Aug 29, 2013
LICENSE: Public domain (use at your own risk)
CONTACT: techbitar at gmail dot com (techbitar.com)
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX | TX
void setup()
{
pinMode(9, OUTPUT); // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
digitalWrite(9, HIGH);
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.begin(38400); // HC-05 default speed in AT command more
}
void loop()
{
// Keep reading from HC-05 and send to Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available())
BTSerial.write(Serial.read());
}
You can send AT Commands to the HC-05 from the Arduino IDE Serial Monitor while the Arduino is running the attached Arduino program.
I have listed a few popular AT commands that will change the HC-05 device name, pass code, and speed. You will find a full set of AT commands from the attached HC-05 reference PDF
file.
(remove double quotes from AT command)
To return HC-05 to mfg. default settings: "AT+ORGL"
To get version of your HC-05 enter: "AT+VERSION?"
To change device name from the default HC-05 to let's say MYBLUE enter: "AT+NAME=MYBLUE"
To change default security code from 1234 to 2987 enter: "AT+PSWD=2987"
To change HC-05 baud rate from default 9600 to 115200, 1 stop bit, 0 parity enter: "AT+UART=115200,1,0"
Anexo B – Instalação dos drivers do Bluetooth na Raspberry Pi
Bluetooth Serial Communication with HC-05 by MYPIANDME < http://myraspberryandme.wordpress.com/2013/11/20/bluetooth-serial-communication-with-hc-05/ >
The first step is to install bluetooth support for the Raspberry Pi. These packages will install myriads of other stuff, so plan on spending some time before the terminal. I have not yet figured
out which packages could be safely purged after installation. So here we go:
sudo apt-get install bluetooth bluez-utils
After everything is installed plug in your Bluetooth USB dongle. I used a KeySonic dongle that came with a bluetooth keyboard. Then check with lsusb if the device gets recognized. You
should get something like this:
Switch on the Arduino with the HC-05 connected and the sketch from above loaded. It’s time to scan for devices from the Raspberry side of things. Type in hcitool scan and this should get
you:
This is the name and the MAC address of the device we configured from the Arduino. Now every manual on the internet begins referring to the sdptool command to discover services and
channels. This is not needed. You may also read something about editing configuration files to add support for the SPP protocol and so on. This is not needed, in fact it didn’t work for me at
all. So this time I deliberately skipped these steps.
The only configuration file that needs editing is the rfcomm.conf file, where we will add a permanent connection to the module we just discovered. I’m using nano as an editor here. Type in
sudo cp /etc/bluetooth/rfcomm.conf rfcomm.conf.orig
sudo nano /etc/bluetooth/rfcomm.conf
The first line just copies the file we are editing. In case things do not work out one can always revert back. Edit the rfcomm.conf file that it looks like this: Just change the address to the
address of your HC-05 module and set the comment to whatever you like.
# RFCOMM configuration file.
rfcomm0 {
# Automatically bind the device at startup
bind yes;
# Bluetooth address of the device
device 98:D3:31:b0:80:6C;
# RFCOMM channel for the connection
channel 1;
80
# Description of the connection
comment "LS-ONE";
}
The HC-05 modules come with a passkey configured. The default PIN is “1234” and can be set using the “AT+PIN=xxxx” command. To enable us to automatically connect to the module,
this pin needs to be written to a file called “pincodes” that is located under “/var/lib/bluetooth/xx:xx:xx:xx:xx:xx/”, where xx… is the MAC address of the bluetooth dongle plugged into the
Raspberry Pi.
The easiest way to edit this file is to use the “echo” command to append a line to the file:
sudo echo "98:D3:31:B0:80:6C 1234" >> /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/pincodes
Just type in until right after “bluetooth/” and then use the shell’s autocomplete feature by pressing the TAB key.
Time for a first test. Therefore the bluetooth service needs to be restarted:
sudo /etc/init.d/bluetooth restart
By now a device called /dev/rfcomm0 should have been created. If the Arduino is not running, start it and start the Serial Monitor. As a first test we are going to echo something to the
rfcomm0-device. In the raspberry terminal type:
echo "TEST" > /dev/rfcomm0
Anexo C – Instalação do Node.js
Node.js + Rasberry Pi by node-arm < http://node-arm.herokuapp.com/ >
Step 1: Download
To Download via command line
* wget http://node-arm.herokuapp.com/node_latest_armhf.deb
Other options are
* http://node-arm.herokuapp.com/node_0.10.32_armhf.deb
* http://node-arm.herokuapp.com/node_0.10.31_armhf.deb
Step 2: Install
sudo dpkg -i node_latest_armhf.deb
# Check installation
node -v
Anexo D – Instalação do Express
Express Framework – Installing by Express <http://expressjs.com/starter/installing.html >
First, create a directory to hold your application, if you haven't already done so, and make that your working directory.
$ mkdir myapp
$ cd myapp
Create a package.json file in the directory of interest, if it does not exist already, with the npm init command.
$ npm init
Install Express in the app directory and save it in the dependecies list:
$ npm install express --save
To install Express temporarily, and not add it to the dependecies list, omit the --save option:
$ npm install express
Node modules installed with the --save option are added to the dependencies list in the package.json file. Then using npm install in the app directory will automatically install modules in the
dependecies list.