Monitor de eletrocardiograma (ECG) em tempo real, exibindo a forma de onda cardíaca no display colorido do M5Stack Basic com cálculo automático de BPM.
Para quem é este projeto?
Para estudantes de eletrônica, engenharia biomédica, makers e entusiastas que querem aprender sobre aquisição de sinais biológicos com microcontroladores.
- Como Funciona
- Hardware Necessário
- Diagrama de Ligação
- Instalação do Ambiente
- Instalação das Bibliotecas
- Carregando o Código
- Usando o Monitor
- Entendendo o Código
- Solução de Problemas
- Próximos Passos
- Licença
Eletrodos → AD8232 → Sinal Analógico → ESP32 ADC → Processamento → Display M5Stack
(pele) (filtro/amplificador) (GPIO 36) (detecção BPM) (forma de onda)
O AD8232 é um chip especializado para leitura de biopotenciais. Ele:
- Amplifica o sinal elétrico fraco do coração (~1 mV) para algo legível (~1 V)
- Filtra ruídos de 60 Hz (rede elétrica) e artefatos de movimento
- Detecta se os eletrodos estão corretamente posicionados (pinos LO+ e LO-)
O ESP32 no M5Stack lê esse sinal pelo ADC de 12 bits (~250 amostras/segundo) e:
- Desenha a forma de onda em tempo real no display de 320×240 px
- Detecta os picos R da onda QRS para calcular o intervalo RR
- Calcula o BPM com média móvel de 4 batimentos
Para a teoria completa, veja docs/como-funciona.md.
| Componente | Quantidade | Notas |
|---|---|---|
| M5Stack Basic Development Kit v2.7 | 1 | ESP32, display 320×240 IPS |
| Módulo Sensor AD8232 ECG | 1 | Inclui cabo e eletrodos |
| Eletrodos descartáveis (snap) | 3 | Para ECG de Derivação I |
| Cabos jumper macho-macho | 5 | Para conexão ao M5Stack |
| Cabo USB-C | 1 | Para programar e alimentar |
⚠️ Aviso Médico: Este projeto é exclusivamente educacional. Não use para diagnóstico ou monitoramento clínico. O sinal pode ser afetado por movimento, má fixação dos eletrodos e interferências elétricas.
| Pino AD8232 | Pino M5Stack Basic | Função |
|---|---|---|
OUTPUT |
GPIO 36 |
Sinal ECG analógico |
LO+ |
GPIO 35 |
Detecção de eletrodo solto (+) |
LO- |
GPIO 25 |
Detecção de eletrodo solto (−) |
3.3V |
3.3V |
Alimentação |
GND |
GND |
Terra |
┌─────────────────────────────────────────────┐
│ AD8232 │
│ │
│ [GND]───────────────────────► GND │
│ [3.3V]──────────────────────► 3.3V │
│ [OUTPUT]────────────────────► GPIO 36 │
│ [LO+]───────────────────────► GPIO 35 │
│ [LO-]───────────────────────► GPIO 25 │
│ │
│ [RA] ──────► Eletrodo DIREITO (braço dir) │
│ [LA] ──────► Eletrodo ESQUERDO (braço esq)│
│ [RL] ──────► Eletrodo REFERÊNCIA (perna) │
└─────────────────────────────────────────────┘
│
▼
┌──────────────────────────┐
│ M5Stack Basic v2.7 │
│ ┌────────────────────┐ │
│ │ Display 320×240 │ │
│ │ ╔══════════════╗ │ │
│ │ ║ ECG Monitor ║ │ │
│ │ ║ ♥ 72 BPM ║ │ │
│ │ ║ ~∿∿∿∿∿∿∿∿∿~ ║ │ │
│ │ ╚══════════════╝ │ │
│ └────────────────────┘ │
│ [A] [B] [C] │
└──────────────────────────┘
RA (vermelho) LA (amarelo)
● ●
Braço Braço
Direito Esquerdo
RL (verde/preto)
●
Perna
Esquerda
(ou abdômen)
Dica: Limpe a pele com álcool antes de fixar os eletrodos. Fique imóvel durante a leitura para evitar artefatos de movimento.
Baixe a versão 2.x em arduino.cc/en/software.
No Arduino IDE, vá em File → Preferences e adicione esta URL em Additional boards manager URLs:
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
Depois vá em Tools → Board → Boards Manager, pesquise M5Stack e instale.
Tools → Board → M5Stack → M5Stack-Core-ESP32
Conecte o M5Stack via USB-C e vá em Tools → Port e selecione a porta COM correspondente (Windows: COM3, COM4...; Linux/Mac: /dev/ttyUSB0 ou /dev/cu.usbserial-...).
No Arduino IDE, vá em Tools → Manage Libraries e instale:
| Biblioteca | Versão mínima | Autor |
|---|---|---|
M5Stack |
0.4.0 | M5Stack |
Todas as outras dependências (TFT_eSPI, Wire, etc.) são instaladas automaticamente junto com a biblioteca M5Stack.
- Abra a pasta
ecg_ad8232_m5stack/no Arduino IDE (ou clique duas vezes emecg_ad8232_m5stack.ino) - Verifique as configurações:
- Board: M5Stack-Core-ESP32
- Upload Speed: 921600
- Port: sua porta COM
- Clique em Upload (→) e aguarde a mensagem
Done uploading - O M5Stack reiniciará automaticamente
┌──────────────────────────────────────────────┐
│ ECG Monitor AD8232 Eletrodos OK ♥ │ ← Header
│ BPM: 72 BPM │
├──────────────────────────────────────────────┤
│ │
│ · · · · · · · · · · · · · · · · · · · · · │
│ ▲ │
│ ___/\___/\___/\__/ \___/\___/\___/\___/\_ │ ← Forma de onda ECG
│ ▼ │
│ · · · · · · · · · · · · · · · · · · · · · │
│ │
├──────────────────────────────────────────────┤
│ [A]Calibrar [B]Reset [C]Info │ ← Botões
└──────────────────────────────────────────────┘
| Botão | Função |
|---|---|
| [A] Calibrar | Lê 500 amostras (~2s) e ajusta automaticamente o limiar de detecção de pico para o seu sinal. Use se o BPM não estiver sendo detectado. |
| [B] Reset | Reinicia o gráfico, BPM e todos os contadores. |
| [C] Info | Exibe tela com parâmetros do sistema, status atual e versão. |
Abra Tools → Serial Plotter no Arduino IDE com 115200 baud para visualizar o sinal ECG bruto no computador. Útil para depuração.
O código está organizado em funções bem separadas:
setup()
├── M5.begin() — inicializa display, botões
├── pinMode(LO_PLUS/MINUS) — configura detecção de lead-off
├── analogReadResolution(12) — ADC de 12 bits (0-4095)
└── drawUI() — desenha interface
loop()
├── Amostragem (~250 Hz)
│ ├── digitalRead(LO_PLUS/MINUS) — eletrodos conectados?
│ ├── analogRead(ECG_PIN) — lê sinal do AD8232
│ ├── Serial.println(raw) — envia para Serial Plotter
│ ├── detectPeak() — detecta batimento cardíaco
│ └── drawGraph() — desenha no display
└── Botões
├── BtnA → calibrateThreshold()
├── BtnB → reset
└── BtnC → showInfoScreen()
Sinal ADC: ____/\____/\____
^ ^
│ └─ descida após pico acima do limiar → BATIMENTO!
└─── subida detectada (ascending = true)
Intervalo RR = tempo entre dois batimentos consecutivos
BPM = 60.000 ms / RR_médio (média de 4 batimentos)
#define ECG_PIN 36 // GPIO do sinal analógico
#define LO_PLUS 35 // GPIO lead-off +
#define LO_MINUS 25 // GPIO lead-off -
#define SAMPLE_INTERVAL_MS 4 // 1000/4 = 250 Hz
#define DEFAULT_THRESHOLD 2500 // limiar de pico (0-4095)
#define RR_HISTORY 4 // média de quantos batimentosVeja o guia completo em docs/troubleshooting.md.
Problemas mais comuns:
| Sintoma | Causa provável | Solução |
|---|---|---|
| Tela preta | Cabo USB, placa errada | Verifique conexão e board selecionado |
| "ELETRODO SOLTO" | LO+ ou LO- mal conectado | Verifique ligações nos GPIOs 35 e 25 |
| Forma de onda plana | Eletrodo sem contato | Reposicione e pressione eletrodos |
| BPM incorreto | Limiar desajustado | Pressione [A] para calibrar |
| Muito ruído | Interferência 60 Hz | Afaste-se de fontes de energia, carregadores |
Ideias para evoluir o projeto:
- Salvar dados no SD card — o M5Stack Basic tem slot microSD
- Enviar dados via Wi-Fi — ESP32 tem Wi-Fi integrado; envie para um servidor MQTT ou dashboard web
- Detecção de arritmia — análise de variabilidade do RR interval (HRV)
- Filtro digital por software — implementar filtro passa-banda 0.5–40 Hz por código
- Alarme sonoro — usar o buzzer do M5Stack para alertas de BPM fora do normal
- Análise FFT — transformada de Fourier do sinal ECG para análise de frequências
- Datasheet AD8232 (Analog Devices)
- M5Stack Basic v2.7 Docs
- ESP32 ADC Reference
- Como funciona um ECG (Wikipedia)
Distribuído sob a licença MIT. Veja LICENSE para detalhes.
Feito com ❤️ para a comunidade maker brasileira.
Se este projeto te ajudou, deixe uma ⭐ no repositório!