XD-58C PulseSensor 脉搏心率传感器#
1. 模块介绍#

1.1 工作原理#
XD-58C 是一款光电反射式心率传感器:它用绿色LED光照射手指皮肤,血液流过时会吸收部分光线,传感器里的光敏元件(光电二极管)检测反射回来的光强变化——心跳一次,血量波动一次,光强就起伏一次,就像用手机手电筒照手指时看到的微微“跳动的红光”。这种微小变化被放大并转换成电压信号输出。
1.2 主要特性和参数#
参数 |
数值 |
说明 |
|---|---|---|
传感器类型 |
光电反射式(PPG) |
不接触血管,仅贴手指表面即可工作 |
输出信号 |
模拟电压(0–3.3V) |
像水龙头出水量一样连续变化,Arduino 的 |
心率测量范围 |
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”的孔 |
黑色线(GND) |
|
必须与红色线插在同一侧GND孔 |
紫色线(OUTPUT) |
|
插入标有“A0”的金属孔(不是数字引脚D0) |

✅ 接线完成后的样子:
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。选择如下图。

这里我们以Windows系统的为例给大家介绍下载和安装的步骤。Windows系统的也有两个版本,一个版本是安装版:Windows Win 10 or newer(64-bit) ;另一个是下载版:Windows ZIP file,是不用安装,直接下载文件到电脑,解压缩就可以用了。
5.1.2 Arduino IDE安装#
1. 保存从软件页面下载的.exe文件到硬盘驱动器,然后简单地运行该文件.

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

3. 选择安装选项.

4. 选择安装位置.

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

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)。选择如下图。

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

5.3 设置Arduino IDE语言#
⚠️ 特别提醒:Windows系统、MAC系统等不同系统,arduino IDE语言设置方法差不多,可以参考。
1. 首先打开Arduino IDE.

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

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

5.4 Arduino IDE说明#

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

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


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

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)以及串口号。


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

1. 点击 Arduino IDE 右上角
图标(串口监视器)
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)以及串口号。


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

第一次运行可能显示“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次采样平均)。