XD-58C PulseSensor 脉搏心率传感器#

1. 模块介绍#

Img

1.1 工作原理#

XD-58C 是一款光电反射式心率传感器:它用绿色LED光照射手指皮肤,血液流过时会吸收部分光线,传感器里的光敏元件(光电二极管)检测反射回来的光强变化——心跳一次,血量波动一次,光强就起伏一次,就像用手机手电筒照手指时看到的微微“跳动的红光”。这种微小变化被放大并转换成电压信号输出。

1.2 主要特性和参数#

参数

数值

说明

传感器类型

光电反射式(PPG)

不接触血管,仅贴手指表面即可工作

输出信号

模拟电压(0–3.3V)

像水龙头出水量一样连续变化,Arduino 的 analogRead() 可直接读取

心率测量范围

50–250 BPM(次/分钟)

正常人静息心率约60–100,运动后可达150+

响应时间

≤10秒(首次稳定读数)

手指放稳后,约10秒内开始输出可靠数据

尺寸

22mm × 15mm × 4mm(含导线)

约一枚硬币大小,带3根彩色排线

1.3 应用场景#

  • 学生健康课:实时显示自己静息/运动后的心率变化

  • 物联网项目:心率触发LED灯颜色变化(如心跳快时变红)

  • 初级医疗教具:理解脉搏与血液循环的关系

  • 不适合临床诊断:本模块无医疗器械认证,仅作教学与兴趣开发


2. 引脚定义#

XD-58C 模块采用 3线制排线引出(红/黑/白三色杜邦线,无编号数字,按颜色区分)。出厂已焊接好,无需识别焊盘编号。

颜色(线序)

功能

电平

说明

红色线(R)

VCC

+3.3V 或 +5V

模块供电输入;可接Arduino 3.3V或5V引脚(二者均可,模块内部有稳压)

黑色线(B)

GND

0V(地)

必须与Arduino共地,否则信号无效

白色线(W)

OUTPUT(模拟信号输出)

0–3.3V 模拟电压

接Arduino模拟引脚(如A0),不能接数字引脚(如D2)

✅ 实际模块上无“A0”“VCC”等丝印文字,只靠线色识别。请认准:红→电源、黑→地、白→信号。


3. 电气参数#

项目

参数

说明

工作电压

3.3V – 5.5V DC

Arduino Uno 的 3.3V 和 5V 引脚均满足,推荐用 5V(信号幅度更大,抗干扰更好)

工作电流

≤4mA(静态)|≤8mA(LED亮时)

由Arduino直接供电完全足够,无需外接电源

输出阻抗

<1kΩ

可直接接入Arduino模拟引脚,无需额外运放

工作温度

-10℃ – 60℃

室内常温环境稳定工作


4. 接线说明#

⚠️ 特别提醒:这里是以Arduino Uno 开发板为例,也可以使用其他开发板。

请严格按以下表格连接(仅3根线):

XD-58C 线缆颜色

接 Arduino Uno 的哪个孔位?

操作步骤

红色线(VCC)

5V 引脚(位于板子下一排标着“5V”的接口孔)

插入任意一个标“5V”的孔

黑色线(GND)

GND 引脚(紧邻 5V 孔,标着“GND”)

必须与红色线插在同一侧GND孔

紫色线(OUTPUT)

A0 引脚(板子左侧一列标着“A0”至“A5”的模拟引脚)

插入标有“A0”的金属孔(不是数字引脚D0)

Img

接线完成后的样子:

  • Uno 板上:5V孔插红线、同一侧GND孔插黑线、A0孔插白线

  • 传感器:夹在食指指尖(指甲盖背面,肉厚处),LED绿光应清晰可见(暗光下更准)

⚠️ 注意:如果夹不稳,可用胶带轻固定;但不要缠绕过紧(影响血流,导致读数偏低或中断)。


5. Arduino IDE下载安装#

5.1 Windows 系统#

特别提醒:本教程采用的 Arduino IDE 版本是 2.3.8 。如果是其他版本的话,不能保证本教程提供的示例代码能编译和上传成功。

5.1.1 Arduino IDE下载#

我们先到Arduino官方的网站:Software | Arduino 下载 Arduino IDE。

Arduino 软件有很多版本,有Windows,Mac,Linux系统的(如下图),而且还有过去老的版本,你只需要下载一个适合自己计算机系统的版本即可。

这里是以下载 Windows Win 10 or newer(64-bit) 为例,你也可以根据自己所需,选择下载 Windows ZIP file。选择如下图。

Img

这里我们以Windows系统的为例给大家介绍下载和安装的步骤。Windows系统的也有两个版本,一个版本是安装版:Windows Win 10 or newer(64-bit) ;另一个是下载版:Windows ZIP file,是不用安装,直接下载文件到电脑,解压缩就可以用了。

5.1.2 Arduino IDE安装#

1. 保存从软件页面下载的.exe文件到硬盘驱动器,然后简单地运行该文件.

Img

2. 阅读许可协议并同意.

Img

3. 选择安装选项.

Img

4. 选择安装位置.

Img

5. 单击 “Finish” 并运行Arduino IDE

Img

5.2 MacOS 系统#

特别提醒:本教程采用的 Arduino IDE 版本是 2.3.8 。如果是其他版本的话,不能保证本教程提供的示例代码能编译和上传成功。

5.2.1 Arduino IDE下载#

我们先到Arduino官方的网站:Software | Arduino 下载 Arduino IDE。

不同的系统,需要下载不同的Arduino IDE,下载方式和Windows类似。这里是以下载 macOS Intel 10.15 Catalina or newer(64-bit) 为例,你也可以根据自己所需,选择下载 macOS Apple Silicon 11 Big Sur or newer(64-bit)。选择如下图。

Img

5.2.2 Arduino IDE安装#

Arduino IDE下载之后,双击下载的arduino_ide_xxxx.dmg文件并按照说明将 Arduino IDE.app 复制粘贴到 Applications 文件夹,几秒钟后您将看到 Arduino IDE 安装成功.

Img

5.3 设置Arduino IDE语言#

⚠️ 特别提醒:Windows系统、MAC系统等不同系统,arduino IDE语言设置方法差不多,可以参考。

1. 首先打开Arduino IDE.

Img

2. 点击“File ——>Preferences…”,在Preferences对话框中,单击 “English” 按钮选择 “中文(简体)”,然后单击 “OK”.

Img

3. 这样,arduino IDE的语言切换完成了,arduino IDE的语言为中文(简体)。

Img

5.4 Arduino IDE说明#

Img

1. “文件”:列表里面的功能有新建项目,打开程序,打开最近使用的代码,打开示例代码,关闭IDE,保存代码,首选项,高级设置等。

2. “编辑”:列表里面的功能有复制,粘贴,自动格式化,字体大小等这个一般都是使用快捷键进行操作。(建议坚持使用快捷键,接触多了就水到渠成了)。

3. “项目”:列明里面的常用功能有验证\编译代码,上传代码,导入库等。

4. “工具”:列表里面的常用功能有开发板选择,端口选择,这两个很重要。

5. “帮助”:点击这个可以查看IDE版本已经官方的参考文件。

6. “串口绘图仪”:它会将串口的数据以折线图的样式显示出来。

7. “串口监视器”:可以将我们需要查看的数据在这里进行打印显示。

8. 验证程序按钮。

9. 验证并上传程序按钮。

10. “项目文件夹”:可以新建项目,还可以只有arduino Cloud进行同步和编辑。

11. “开发板管理器”:可以添加或删除开发板。

12. “库管理”:就要添加和删除库。

13. “调试”:可以对代码进行监视与断点调试。

14. 搜索框。

15. 代码编辑区。

16. IDE提示区(上传代码报错或成功)和串口监视器显示区

6. 安装驱动#

1. 使用USB数据线将开发板和电脑连接起来,如果开发板未被电脑识别,可能需要手动安装 Arduino 官方驱动。

2. 驱动安装步骤:

(1). 将开发板通过 USB 数据线连接到电脑。

(2). 打开设备管理器,查看是否识别到开发板。

(3). 如果未识别,下载并安装 Arduino 官方驱动

A. 点击官网链接:https://www.keyesrobot.cn/zh-cn/latest

Img

B. 点击 “下载中心”,进入下载中心页面,向下滑找到 驱动程序下载 部分。

Img

Img

C. 根据开发板的USB驱动芯片和电脑系统来选择下载安装对应的USB驱动。

Img

7. 示例代码#

7.1 基础使用代码(显示原始波形与心率)#

复制粘贴到 Arduino IDE,选择板卡“Arduino Uno”,端口正确后点击 ✔️上传。

// XD-58C 基础读取程序(零基础版)
const int sensorPin = A0;  // 紫线接A0 → 必须与接线一致
int sensorValue = 0;       // 存储每次读到的数值(0-1023)

void setup() {
  Serial.begin(9600);      // 打开串口监视器,用于看数据
}

void loop() {
  sensorValue = analogRead(sensorPin);  // 读A0电压,转为0-1023数字
  Serial.print("Raw: ");                 // 打印提示文字
  Serial.println(sensorValue);           // 打印原始数值(安静时约500-700,按压时下降)
  delay(50);                             // 每50ms读一次,避免刷屏过快
}

7.2 预期现象(上传后操作)#

先点击“工具” --→ “开发板” --→ “Arduino AVR Boards” --→ “Arduino Uno”,再点击“工具” --→ “端口” --→ “COMxx”。请务必选择正确的开发板(例如 Arduino Uno)以及串口号。

Img

Img

准备就绪后,点击上传按钮,将示例代码烧录到开发板中。

Img

1. 点击 Arduino IDE 右上角 Img 图标(串口监视器)

2. 设置右下角波特率选 9600

3. 将手指夹稳,静坐10秒 → 屏幕出现上下跳动的数字(如 623, 618, 630…)

4. 轻轻按压/松开手指 → 数字明显下降/回升 → 说明信号正常


7.3 进阶应用代码(计算并显示心率BPM)#

此代码自动识别心跳峰值,每15秒更新一次心率值(更接近真实心率):

// XD-58C 心率计算版(含滤波与峰值检测)
const int sensorPin = A0;
int rate[10];           // 存最近10次心跳间隔(毫秒)
int rateIndex = 0;
long lastBeatTime = 0;
int threshold = 550;    // 判断心跳的阈值(需根据实际调整)
int lastValue = 0;
int beats = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("PulseSensor Ready. Press finger to start.");
}

void loop() {
  int value = analogRead(sensorPin);     // 读原始值
  if (value > threshold && lastValue <= threshold) {  // 上升沿过阈值 → 可能是心跳
    long now = millis();
    if (now - lastBeatTime > 300) {      // 防抖:两次跳变至少隔300ms
      long interval = now - lastBeatTime;
      rate[rateIndex] = interval;        // 记录本次间隔
      rateIndex = (rateIndex + 1) % 10;  // 循环存10个
      lastBeatTime = now;
      beats++;
    }
  }
  lastValue = value;

  // 每15秒计算一次平均心率
  static unsigned long lastPrint = 0;
  if (millis() - lastPrint > 15000) {
    lastPrint = millis();
    if (beats > 0) {
      long sum = 0;
      for (int i = 0; i < 10; i++) sum += rate[i];
      float avgInterval = sum / 10.0;
      float bpm = 60000.0 / avgInterval; // 60秒÷平均间隔(毫秒)= 每分钟次数
      Serial.print("Heart Rate: ");
      Serial.print((int)bpm);
      Serial.println(" BPM");
      beats = 0;
    } else {
      Serial.println("No beat detected. Check finger placement.");
    }
  }
}

7.4 运行提示#

先点击“工具” --→ “开发板” --→ “Arduino AVR Boards” --→ “Arduino Uno”,再点击“工具” --→ “端口” --→ “COMxx”。请务必选择正确的开发板(例如 Arduino Uno)以及串口号。

Img

Img

准备就绪后,点击上传按钮,将示例代码烧录到开发板中。

Img

  • 第一次运行可能显示“No beat detected”,属正常 → 保持手指放松、环境较暗、夹稳10秒再看结果。

  • 心率值稳定后,静坐时典型值:60–80 BPM;深呼吸后可能降至55;快走后升至90–110。


8. 常见问题#

❓ Q1:串口监视器全是“0”或固定不变的数字(如一直显示512)#

原因:紫色线没接A0,或接到了D0/D1等数字引脚;或红线/黑线未同时接入Uno控制板(缺电源或缺地)。

解决:拔掉所有线,重新按【接线说明】表格逐根确认——红→5V、黑→GND(同侧)、白→A0。

❓ Q2:数值乱跳(如10、980、3、1023交替出现),无法稳定#

原因:手指未夹稳、环境太亮(日光直射)、或传感器LED被遮挡。

解决:关灯/拉窗帘;换用食指或中指(肉厚处);确保夹子金属触点完全贴合皮肤,无毛发/指甲阻挡。

❓ Q3:串口显示“Heart Rate: 0 BPM”或数值远高于250#

原因:阈值 threshold = 550 不匹配当前环境(不同人肤色/血管深度不同)。

解决:将代码中 int threshold = 550; 改为 520(肤色较深者)或 580(肤色较浅者),重新上传测试。

❓ Q4:夹上手指后LED不亮(无绿光)#

原因:红线未接到5V(或接错成3.3V且接触不良);或模块损坏。

解决:用万用表测红线对黑线电压,应为4.8–5.2V;若无电压,检查USB线是否松动、电脑USB口是否供电正常。

❓ Q5:心率值忽高忽低(如65→180→45循环)#

原因:手指轻微移动造成信号突变,或袖口/手表压迫手腕影响回流。

解决:手臂平放桌面,手掌自然张开;移除手腕附近束缚物;等待30秒让数值自动收敛(代码已含10次采样平均)。