Arduino UNO 驱动 OLED 实时显示 ECG 心电波形
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | |
| uECG 设备 (心电采集模块) | 1 | |
| nRF24L01+ 无线模块 | 1 | 必须供电 3.3V,建议并联 1-10µF 电容稳压 |
| 0.96″ OLED 显示屏 (128×64, SSD1306, I2C) | 1 | 模块自带上拉电阻最佳 |
项目介绍
作者编写了 uECG Arduino 库,大幅简化从 uECG 设备获取数据的流程。配合 RF24 库与 Adafruit SSD1306 库,可在 OLED 上实时绘制心电波形并显示 BPM、RR 间期、步数、电量等参数。
接线原理图
- nRF24 接 SPI 总线 (D13/D12/D11) + CS(D10) + CE(D9),供电 3.3V。
- OLED 接 I2C (A4/A5),供电 5V。


核心代码逻辑
#include <uECG.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int rf_cen = 9, rf_cs = 10;
uint8_t ecg_screen[128];
float ecg_avg = 0, ecg_max = 1, ecg_min = -1;
int ecg_size = 40;
uint32_t prev_data_count = 0, prev_displ = 0;
int displ_phase = 0;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay(); display.display();
uECG.begin(rf_cs, rf_cen);
}
void loop() {
uECG.run(); // 必须高频调用,防止丢包
uint32_t data_count = uECG.getDataCount();
int new_data = data_count - prev_data_count;
prev_data_count = data_count;
if (new_data > 0) {
int16_t ecg_data[8];
uECG.getECG(ecg_data, new_data);
// 滚动缓冲区并归一化映射到屏幕坐标
for (int x = 0; x < new_data; x++) {
ecg_avg = ecg_avg * 0.99 + 0.01 * ecg_data[x];
ecg_max = ecg_max * 0.995 + ecg_avg * 0.005;
ecg_min = ecg_min * 0.995 + ecg_avg * 0.005;
ecg_max = max(ecg_max, ecg_data[x]);
ecg_min = min(ecg_min, ecg_data[x]);
int ecg_y = 63 - ecg_size * (ecg_data[x] - ecg_min) / (ecg_max - ecg_min + 1);
ecg_screen[127 - new_data + x] = ecg_y;
}
}
// 分相位绘制:参数区、波形前半、波形后半、刷屏,每 30ms 一个相位
if (millis() - prev_displ > 30) {
prev_displ = millis();
if (displ_phase == 0) { // 显示 BPM、RR、步数、电池
display.clearDisplay();
display.setCursor(0,0);
display.print("BPM: "); display.println(uECG.getBPM());
display.print("RR: "); display.println(uECG.getLastRR());
display.print("steps: "); display.print(uECG.getSteps());
// 电池图标绘制省略
}
else if (displ_phase == 1) { // 波形前半段
for (int x = 1; x < 64; x++)
display.drawLine(x-1, ecg_screen[x-1], x, ecg_screen[x], WHITE);
}
else if (displ_phase == 2) { // 波形后半段
for (int x = 64; x < 127; x++)
display.drawLine(x-1, ecg_screen[x-1], x, ecg_screen[x], WHITE);
}
else if (displ_phase == 3) display.display();
displ_phase = (displ_phase + 1) % 4;
}
}
数据处理
uECG 设备板载计算 BPM、GSR、HRV 等参数,也可获取原始 ECG 数据 (偶尔丢包但可用)。库示例中包含串口打印与 OLED 显示两种模式。

代码库
GitHub: uECG_library (含 OLED 与串口示例)
制造工艺
- 树莓派构建稳健传感器 API:基于 GY‑91 多功能模块的 Flask 实现
- TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
- 用 Arduino UNO 和 OLED 显示屏制作经典 Pong 游戏:分步教程
- JX 波形发生器 – 基于 Arduino 的 DDS 振荡器,带 OLED 显示屏
- DIY VR 滑板:用 Arduino、Google Cardboard 与蓝牙打造虚拟滑雪体验
- Arduino Nano 驱动 128x64 OLED 实时运行康威生命游戏 (元胞自动机)
- DIY Arduino LCD 游戏机:16x2 字符屏打造“躲避防守队员”足球小游戏
- Arduino入门教程01:开始你的第一个项目
- Maxim MAX86150:集成 PPG 与 ECG 的移动健康监测模块
- Verilog 模块基础:结构与语法
- 掌握Verilog参数:构建可复用可扩展模块
- Java 9 模块系统:链接时、自定义运行时镜像与实战