Experiência 1: Recolha de Dados Fisiológicos
Experiência 1: Recolha de Dados Fisiológicos com Microcontroladores
Objetivo
Introdução prática à recolha de dados fisiológicos através de microcontroladores Arduino/ESP32 e sensores biomédicos. Os estudantes montam circuitos, programam a aquisição de sinais e implementam sistemas básicos de transmissão de dados, estabelecendo a base da pipeline de dados biomédicos.
Objetivos de Aprendizagem
- Compreender os princípios físicos de funcionamento de sensores biomédicos
- Programar microcontroladores para aquisição de sinais em tempo real
- Implementar protocolos de comunicação (Serial, Wi-Fi, MQTT)
- Configurar sistemas de bufferização e transmissão de dados
- Avaliar limitações, precisão e validação de sensores de baixo custo
- Aplicar boas práticas de sampling rate e resolução
Resultados de Aprendizagem
Ao completar esta experiência, os estudantes serão capazes de:
- Configurar e programar dispositivos Arduino/ESP32
- Recolher dados de múltiplos sensores biomédicos simultaneamente
- Implementar aquisição com sampling rate adequado (100-1000Hz)
- Transmitir dados via serial e Wi-Fi
- Implementar buffer circular para dados contínuos
- Visualizar sinais em tempo real
Tutoriais de Apoio
Antes de começar esta experiência, recomenda-se a consulta dos seguintes tutoriais:
- Ainda não há tutoriais disponíveis.
Exercício Prático Detalhado
Fase 1: Montagem do Circuito (30 min)
Componentes:
- Arduino UNO, Arduino Nano ou ESP32 DevKit
- Sensor PPG (ex. MAX30102) para frequência cardíaca e SpO2
- Condensadores, breadboard, jumpers
Tarefa: Montar circuito seguindo diagrama fornecido, testar ligações com multímetro
Os componentes fornecidos pelo laboratório utilizam o sistema qwiic para facilitar a ligação dos sensores. Utilize os cabos qwiic para ligar o sensor PPG ao qwiic shield (Figura 1).
Conecte o Arduino Nano em cima do qwiic shield conforme a Figura 2.
Além do qwiic cable, também será necessário ligar mais dois fios jumpers entre o arduino e o sensor PPG. Para ficar compatível com o código que será fornecido, ligue um fio entre o pino D4 e o pino RST do sensor. Ligue outro fio entre o pino D5 e o pino MFIO do sensor PPG (Figura 2).
O Arduino Nano possui uma limitação em termos de alimentação do sensor PPG. Para garantir que o computador detecte o setup atual, é necessário adicionar um condensador (220uF ou 440uF) entre os pinos 3v3 e GND do Arduino Nano (Figura 2). Este condensador ajuda a estabilizar a alimentação do sensor PPG, evitando falhas na deteção do dispositivo.
Mais detalhes no site oficial do sensor: MAX30102 Hookup Guide
Fase 2: Programação Básica (45 min)
Objetivos específicos:
- Configurar o ambiente Arduino IDE
- Instalar bibliotecas necessárias (SparkFun Bio Sensor Hub)
- Programar aquisição básica de dados PPG
Instalação do Arduino IDE:
Primeiro é necessário instalar o Arduino IDE 2.x, disponível em: https://www.arduino.cc/en/software (Figura 3).
Ao ligar o Arduino Nano por USB diretamente ao Computador, ele deve ser reconhecido pelo IDE. Caso não seja reconhecido, teremos que configurar a placa e a porta correta no menu “Tools” do Arduino IDE.
Instalação da Biblioteca SparkFun Bio Sensor Hub:
Em seguida, é necessário instalar a biblioteca SparkFun Bio Sensor Hub Library. Para isso, no menu “Sketch” do Arduino IDE, selecione “Include Library” e depois “Manage Libraries…”. Na janela que abrir, procure por “SparkFun Bio Sensor Hub Library” e instale a versão mais recente (Figura 4).
Programação da Aquisição básica de Dados:
A seguir está um exemplo de código para adquirir dados do sensor PPG utilizando a biblioteca SparkFun Bio Sensor Hub. Copie e cole este código no Arduino IDE e faça o upload para o seu Arduino Nano.
Biblioteca e Definições Iniciais:
#include <SparkFun_Bio_Sensor_Hub_Library.h>
#include <Wire.h>
// No other Address options.
#define DEF_ADDR 0x55
// Reset pin, MFIO pin
const int resPin = 4;
const int mfioPin = 5;
// Takes address, reset pin, and MFIO pin.
SparkFun_Bio_Sensor_Hub bioHub(resPin, mfioPin);
bioData body;Configuração Inicial no setup():
void setup(){
Serial.begin(115200);
Wire.begin();
int result = bioHub.begin();
if (!result)
Serial.println("Sensor started!");
else
Serial.println("Could not communicate with the sensor!!!");
Serial.println("Configuring Sensor....");
int error = bioHub.configBpm(MODE_ONE); // Configuring just the BPM settings.
if(!error){
Serial.println("Sensor configured.");
}
else {
Serial.println("Error configuring sensor.");
Serial.print("Error: ");
Serial.println(error);
}
// Data lags a bit behind the sensor, if you're finger is on the sensor when
// it's being configured this delay will give some time for the data to catch
// up.
delay(4000);
}Loop Principal no loop():
void loop(){
// Information from the readBpm function will be saved to our "body"
// variable.
body = bioHub.readBpm();
Serial.print("Heartrate: ");
Serial.println(body.heartRate);
Serial.print("Confidence: ");
Serial.println(body.confidence);
Serial.print("Oxygen: ");
Serial.println(body.oxygen);
Serial.print("Status: ");
Serial.println(body.status);
delay(250); // Slowing it down
}Fase 3: Transmissão de Dados (45 min)
Protocolos a implementar: 1. Serial USB: Para debug e visualização local 2. Wi-Fi HTTP: POST para endpoint REST 3. MQTT: Para sistemas distribuídos
Formato de dados JSON:
{
"timestamp": 1642680000,
"device_id": "ESP32_001",
"sensors": {
"ppg": [1024, 1026, 1023, ...],
"temperature": 36.5,
"gsr": 512
},
"sampling_rate": 100
}Fase 4: Visualização e Validação (30 min)
- Utilizar Serial Plotter do Arduino IDE
- Implementar script Python com matplotlib para visualização avançada
- Validar qualidade do sinal (SNR, artefactos)
- Comparar com dispositivos comerciais
Recursos Necessários
Hardware (por grupo de 2-3 estudantes)
- Microcontrolador: ESP32 DevKitC ou Arduino UNO R3
- Sensores biomédicos:
- MAX30102 (PPG + SpO2)
- DS18B20 (temperatura)
- Grove GSR (condutância da pele)
- ADXL345 (acelerómetro - opcional)
- Componentes: Breadboard, resistências, jumpers, cabo USB
- Fonte de alimentação: Power bank ou adaptador 5V
Software
- Arduino IDE 2.x com bibliotecas ESP32/Arduino
- Bibliotecas: WiFi, PubSubClient (MQTT), ArduinoJson
- Python 3.8+ com matplotlib, numpy, pyserial
- MQTT broker (Mosquitto local ou HiveMQ Cloud)
- Postman para testes de API
Infraestrutura
- Rede Wi-Fi local com acesso à internet
- Servidor HTTP simples (Node.js/Express ou Python Flask)
- MQTT broker configurado
- Computadores com portas USB disponíveis
Metodologias de Ensino
Abordagem Hands-on (120 min presencial)
- Briefing teórico (15 min): Princípios de sensores biomédicos
- Montagem guiada (30 min): Circuito passo-a-passo
- Programação assistida (45 min): Desenvolvimento do firmware
- Testes e debug (30 min): Resolução de problemas
Trabalho Autónomo (60 min)
- Implementar funcionalidades adicionais
- Otimizar código para menor consumo energético
- Criar interface web simples para visualização
- Documentar limitações e melhorias
Avaliação
Critérios de Avaliação (100 pontos)
- Montagem do circuito (20 pts): Ligações corretas, funcionalidade
- Qualidade do código (30 pts): Estrutura, comentários, boas práticas
- Aquisição de dados (25 pts): Sampling rate correto, dados válidos
- Transmissão (15 pts): Pelo menos um protocolo funcionante
- Relatório técnico (10 pts): Análise de limitações e propostas
Entregáveis
- Código fonte comentado (.ino + bibliotecas)
- Esquema do circuito (Fritzing ou similar)
- Dataset com 5 minutos de dados recolhidos
- Relatório (máx. 3 páginas) com análise de qualidade dos dados
Extensões Avançadas
Para estudantes avançados
- Filtragem digital: Implementar filtros passa-banda em tempo real
- Detecção de artefactos: Algoritmos para identificar ruído
- Compressão de dados: Reduzir bandwidth de transmissão
- Segurança: Encriptação básica dos dados transmitidos
- Edge computing: Processamento local básico (ex. cálculo de BPM)
Integração com experiências seguintes
- Os dados recolhidos serão utilizados na Experiência 2 para processamento
- O formato JSON será compatível com REDCap (Experiência 3)
- Os protocolos MQTT preparam para IoMT (Experiência 6)
Troubleshooting Comum
Problemas típicos e soluções
- Sinal ruidoso: Verificar ligações, usar condensadores de desacoplamento
- Dados inconsistentes: Calibrar sensores, verificar alimentação
- Conexão Wi-Fi instável: Implementar reconnect automático
- Overflow do buffer: Aumentar frequência de transmissão
- Consumo elevado: Otimizar código, usar deep sleep modes

