亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino UNO 驱动 OLED 实时显示 ECG 心电波形

组件与物料

组件数量备注
Arduino UNO1
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 间期、步数、电量等参数。

接线原理图

Arduino UNO 驱动 OLED 实时显示 ECG 心电波形
Arduino UNO 驱动 OLED 实时显示 ECG 心电波形

核心代码逻辑

#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 显示两种模式。

Arduino UNO 驱动 OLED 实时显示 ECG 心电波形

代码库

GitHub: uECG_library (含 OLED 与串口示例)

制造工艺

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