当前位置: 首页 > news >正文

用Arduino Nano和AD8232模块DIY一个心率监测手环(附完整代码与电路图)

用Arduino Nano和AD8232模块DIY一个心率监测手环(附完整代码与电路图)

在智能穿戴设备日益普及的今天,心率监测已成为健康管理的基础功能。但对于电子爱好者而言,商业产品的封闭性往往限制了探索的可能性。本文将带你用不到200元的成本,打造一个完全开源的心率监测手环原型。不同于市面上简单的光电式心率检测方案,我们采用医疗级的AD8232心电模块,通过电极直接捕捉心脏电信号,实现更精准的测量。

这个项目特别适合:

  • 想深入了解生物电信号采集的Arduino玩家
  • 需要可定制心率监测方案的创客
  • 对医疗电子设备原理感兴趣的学生群体

你将获得:

  1. 完整的硬件连接方案(含电极选型技巧)
  2. 经过实际验证的滤波算法代码
  3. 3D打印外壳设计文件
  4. 信号干扰处理实战经验

1. 硬件准备与电路设计

1.1 核心元件选型

AD8232模块是这个项目的心脏,它能将微伏级的心电信号放大到Arduino可读取的范围。市面上常见两种版本:

  • 基础版(约60元):仅包含必要滤波电路
  • 增强版(约90元):额外集成右腿驱动电路,抗干扰能力更强

建议选择增强版,特别是在移动场景下。以下是主要元件清单:

元件规格数量备注
Arduino NanoATmega328P1也可用Pro Mini
AD8232模块带RLD电路1推荐HiLetgo品牌
电极片一次性医用3直径3cm以上为佳
锂电池3.7V 500mAh1带充放电保护
OLED屏0.96寸 I2C1显示实时心率

1.2 关键电路连接

电极片的正确贴放至关重要:

  • RA(右臂):右侧锁骨下方
  • LA(左臂):左侧肋骨下方
  • RL(右腿):任意下肢位置(降低共模干扰)

接线示意图:

AD8232 Arduino Nano OUT → A0 LOD+ → D2 LOD- → D3 3.3V → 3.3V GND → GND

注意:电极导线建议使用屏蔽线,长度不超过50cm,并避免与电源线平行走线

2. 软件实现与信号处理

2.1 基础数据采集

先安装必要的库:

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>

初始化代码框架:

void setup() { Serial.begin(115200); pinMode(2, INPUT); // LOD+ pinMode(3, INPUT); // LOD- if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("OLED init failed"); while(1); } }

2.2 自适应滤波算法

原始心电信号通常包含三类主要噪声:

  1. 基线漂移(<0.5Hz)
  2. 工频干扰(50/60Hz)
  3. 肌电噪声(20-500Hz)

实现移动平均滤波:

#define FILTER_WINDOW 20 int filterBuffer[FILTER_WINDOW]; int filterIndex = 0; int movingAverage(int raw) { filterBuffer[filterIndex] = raw; filterIndex = (filterIndex + 1) % FILTER_WINDOW; long sum = 0; for(int i=0; i<FILTER_WINDOW; i++) { sum += filterBuffer[i]; } return sum / FILTER_WINDOW; }

2.3 心率计算逻辑

采用峰值检测算法:

bool detectPeak(int value, int threshold) { static int lastValue = 0; bool isPeak = (value > threshold) && (lastValue <= threshold); lastValue = value; return isPeak; } void loop() { int raw = analogRead(A0); int filtered = movingAverage(raw); if(detectPeak(filtered, 500)) { unsigned long currentMillis = millis(); static unsigned long lastPeak = 0; if(lastPeak > 0) { int bpm = 60000 / (currentMillis - lastPeak); display.clearDisplay(); display.setCursor(0,0); display.print("HR: "); display.print(bpm); display.display(); } lastPeak = currentMillis; } }

3. 佩戴优化与干扰处理

3.1 常见问题排查表

现象可能原因解决方案
数据跳动剧烈电极接触不良用酒精清洁皮肤
基线持续漂移呼吸运动影响改用胸带式固定
周期性干扰电源工频噪声开启RLD功能
信号完全消失导线断裂检查焊点连接

3.2 运动场景优化

在移动测试中,我们发现三个关键改进点:

  1. 电极固定方式:改用导电硅胶腕带比一次性电极更耐用
  2. 电源隔离:在AD8232的VCC与GND间加装100μF钽电容
  3. 软件去噪:增加滑动窗标准差检测,自动剔除异常值

运动模式下的改进算法:

float calculateStdDev(int *buffer, int size) { float mean = 0, sum = 0; for(int i=0; i<size; i++) mean += buffer[i]; mean /= size; for(int i=0; i<size; i++) sum += pow(buffer[i] - mean, 2); return sqrt(sum/size); }

4. 产品化改进方案

4.1 3D打印外壳设计

使用Fusion 360设计的壳体应包含:

  • 主板固定卡槽(2mm间隙)
  • 电极接口防水结构
  • 腕带连接孔(22mm标准尺寸)

关键尺寸参数:

总厚度:12mm 内部腔体:40×25×8mm 按钮开孔:Φ6mm

4.2 低功耗优化技巧

通过以下调整可使续航延长至72小时:

  1. 修改Arduino的熔丝位,将时钟降至8MHz
  2. 采用中断唤醒模式采集数据
  3. OLED屏设置1秒刷新间隔

电源管理代码片段:

#include <avr/sleep.h> void enterSleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); }

4.3 数据持久化方案

添加MicroSD模块存储原始波形:

#include <SPI.h> #include <SD.h> void saveECGData(int value) { File dataFile = SD.open("ecg.csv", FILE_WRITE); if(dataFile) { dataFile.print(millis()); dataFile.print(","); dataFile.println(value); dataFile.close(); } }

在实际测试中,这个DIY设备的静息心率测量误差可以控制在±2bpm以内,足以满足日常健康监测需求。最让我惊喜的是,通过优化电极贴放位置,甚至能捕捉到明显的心律不齐特征。当然,这不能作为医疗诊断依据,但对于了解心脏活动规律是非常直观的教学工具。

http://www.jsqmd.com/news/673790/

相关文章:

  • 收藏!AI入行指南:小白程序员必备的岗位选择、技能树与学习路径
  • 终极跨平台RGB灯光控制:OpenRGB一站式解决方案彻底告别软件混乱
  • JavaScript的Object.hasOwn:比hasOwnProperty更安全的属性检查
  • 手机变随身Linux服务器:用Termux+Ubuntu搭建个人网盘/博客的踩坑实录
  • idea 插件envfile初体验
  • 如何快速实现音频转文字:免费开源工具完整指南
  • CityEngine规则文件(.cga)完全解读:从‘看不懂’到能改‘屋顶样式’和‘楼层高度’
  • 无线调试中的端口转发问题
  • 解码CAN总线数据帧:从帧起始到帧结束的逐段精讲
  • 剖析 Sa-Token 权限认证:从注解到拦截器的完整调用链路
  • qemu基础-xml详解
  • Qwen2.5-VL-7B-Instruct部署避坑指南:显存不足报错、端口冲突、路径权限问题汇总
  • 自媒体人,别再纠结文笔了,读者想看的是“解决方案”
  • Dev-C++也能做图形界面?用C++写一个带界面的五子棋对战程序(含AI人机对战)
  • 别再搞混了!STSW-LINK004/007/009到底该用哪个?一张图帮你选对ST-Link工具
  • 超越风险比:用R语言RMST重新审视临床生存数据,以肝硬化研究为例
  • 从Docker到Kubernetes:深入理解容器资源限制背后的systemd cgroups机制
  • 蓝队视角:彻底理解PTH/PTK/PTT,手把手配置检测与防御规则(含Sigma/YARA)
  • 告别黑屏:手把手教你用C语言在Linux下玩转framebuffer画图(附完整代码)
  • Blender3mfFormat插件:3D打印工作流的完整解决方案
  • 避坑指南:在Windows/Mac本地用Diffusers库跑通Stable Diffusion U-Net推理的完整流程
  • Windows平台Termius进阶:从安装激活到个性化汉化实战
  • OAuth2.0实战避坑:C# WebAPI资源服务器如何优雅验证Bearer Token(附RefreshToken自动刷新方案)
  • 神经网络 —— 搭建神经网络(实例)
  • 从Altium到CAM350:Gerber文件生成与DFM检查全流程实战
  • 从心电图到电机控制:拆解仪表放大器(INA)在医疗与工业中的真实应用电路
  • 【深度补全实战】从RGBD相机到算法落地:非激光雷达场景下的深度图修复技术选型与避坑指南
  • 用STM32C8T6做个遥控小车?手把手教你驱动PS2手柄(附完整代码)
  • Multi-Agent 调度器的三种类型:集中调度、分布式协商、Token Bus
  • 别再死记硬背MPC公式了!用Python+CVXOPT带你直观理解模型预测控制