Oxímetro de Pulso Open-Source DIY para COVID-19: Construção com Arduino
Componentes e Materiais
| Arduino Nano R3 | 1 |
| Sensor de Pulso e Frequência Cardíaca Maxim MAX30102 | 1 |
| Display OLED I2C 128x64 Gravity (DFRobot) | 1 |
Ferramentas Necessárias
- Impressora 3D (genérica)
- Ferro de solda (genérico)
Aplicativos e Serviços Online
- Arduino IDE
- Autodesk Fusion 360
Sobre o Projeto
Os Desafios da COVID-19
A COVID-19 é uma doença causada pelo vírus SARS-CoV-2 que ataca principalmente o sistema respiratório. Sintomas mais leves incluem febre, dores e calafrios, mas pode levar a condições mais sérias como pneumonia. Uma pessoa com pneumonia ou até falta de ar leve pode não saber quando ir ao hospital, especialmente quando os hospitais começam a ficar sobrecarregados. Por isso criei este oxímetro de pulso open-source, que pode ajudar a obter a ajuda necessária e informações precisas sobre a condição atual.

Um Aviso Importante
Este dispositivo/projeto NÃO deve ser usado como ferramenta de diagnóstico médico preciso!
A Eletrônica
MAX30102

OLED 128x64 Pixel

Arduino Nano

Construindo o Dispositivo Passo a Passo
1. Imprima e Limpe as Peças
Comece baixando cada peça da seção de anexos do projeto e carregando no seu slicer preferido. Usei preenchimento de 70-80% e suportes médios, tudo com PLA. Após impressão, removi suportes e lixei levemente para garantir encaixe perfeito.

2. Solde a Eletrônica
O dispositivo é projetado em torno de um Arduino Nano montado em uma perfboard de 44mm x 30mm. Primeiro, soldam-se fios nos pinos VIN, GND, SDA e SCL do sensor e passam por baixo da peça base até o Arduino Nano.

Em seguida, o conector do OLED é ligado ao Nano e passa até o display.

Por fim, toda a montagem eletrônica é inserida na carcaça e fixada com alguns parafusos de 3mm.
3. Monte o Dispositivo
Após inserir a eletrônica, basta prender a tela OLED à tampa superior e fixá-la ao resto do chassi com parafusos de 3mm. Teste o movimento articulando a tampa suavemente.

4. Carregando o Sketch
O sketch incluído realiza ações para exibir frequência cardíaca e saturação de oxigênio do usuário. Para carregar, instale as bibliotecas necessárias, selecione Arduino Nano no menu Ferramentas > Placa e clique em Carregar.

Quanto ao sketch: primeiro inicializa o OLED e MAX30102, reportando erros. Depois lê 100 valores para calibrar o sensor e começa a exibi-los. O dispositivo entra em loop lendo 25 novos valores e calculando média móvel. Por fim, verifica se valores são válidos e imprime na tela se forem.
5. Usando
Para usar o oxímetro, coloque a ponta do dedo sobre o sensor e feche suavemente a tampa. Conecte uma fonte de energia e aguarde até ver os dados sendo exibidos.

Código
Código do Oxímetro de Pulso C/C++
/* Conexões de Hardware (Breakoutboard para Arduino):
* -5V = 5V (3.3V permitido)
* -GND = GND
* -SDA = A4 (ou SDA)
* -SCL = A5 (ou SCL)
* -INT = Não conectado
* O MAX30105 Breakout aceita 5V ou 3.3V I2C. Recomendamos alimentar com 5V mas roda em 3.3V.
*/
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
MAX30105 particleSensor;
SSD1306AsciiWire oled;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
// Arduino Uno não tem SRAM suficiente para 50 amostras de IR e red em 32-bit
// Solução: truncar 16-bit MSB dos dados amostrados. Amostras viram 16-bit.
uint16_t irBuffer[50]; // dados sensor LED infravermelho
uint16_t redBuffer[50]; // dados sensor LED vermelho
#else
uint32_t irBuffer[50];
uint32_t redBuffer[50];
#endif
int32_t spo2; // valor SPO2
int8_t validSPO2; // indicador se cálculo SPO2 é válido
int32_t heartRate; // valor frequência cardíaca
int8_t validHeartRate; // indicador se cálculo FC é válido
void setup() {
Serial.begin(115200);
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);
// Inicializa sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { // Porta I2C padrão, 400kHz
Serial.println(F("MAX30105 não encontrado. Verifique ligação/alimentação."));
while (1);
}
particleSensor.setup(55, 4, 2, 200, 411, 4096); // Configura sensor
}
void loop() {
// Lê primeiras 50 amostras e determina faixa do sinal
for (byte i = 0; i < 50; i++) {
while (particleSensor.available() == false)
particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer[i], DEC);
}
// Calcula FC e SpO2 após primeiras 50 amostras (primeiros 4 segundos)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// Continuamente amostra MAX30102. FC e SpO2 calculados a cada 1 segundo
while (1) {
// Descarte primeiras 25 amostras na memória e desloque últimas 25 para topo
for (byte i = 25; i < 50; i++) {
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
// Coleta 25 novas amostras antes de calcular FC
for (byte i = 25; i < 50; i++) {
while (particleSensor.available() == false)
particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);
Serial.print(F(", HR="));
Serial.print(heartRate, DEC);
Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);
Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);
}
// Após 25 novas amostras, recalcula HR e SP02
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}
void printToScreen() {
oled.clear();
oled.setCursor(0, 0);
if (validSPO2 && validHeartRate) {
oled.print(F("FC: "));
oled.println(heartRate, DEC);
oled.print(F("SPO2: "));
oled.println(spo2, DEC);
} else {
oled.print(F("Não válido"));
}
}
Peças Personalizadas e Gabinetes
Arquivos para impressão 3D disponíveis na seção de anexos do projeto original.
Esquemáticos

Processo de manufatura
- Log do Projeto FirePick Delta: Construindo uma MicroFactory Open-Source com OpenPnP
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Construa um Homem de Ferro com Arduino: Componentes, Sensores e Guia Passo a Passo
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Construa um Braço Robótico 3D Impresso Funcional com Arduino – Guia Passo a Passo
- Oxímetro de Pulso Portátil para Uso Emergencial Durante COVID-19
- Controlador de Umidificador DIY com Arduino e Relé – Configuração Segura de Alta Tensão
- Jogo Pong Neon em Matriz NeoPixel com Arduino Nano
- Health Band: Pulseira Inteligente para Monitoramento de Idosos com Arduino Nano e DPS310
- Por Que Código Aberto Impulsiona Inovação na Borda — eBook Essencial