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

## 1. 模块介绍

![Img](./media/img-02.png)

### 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. 接线说明  

⚠️ <span style="color: rgb(255, 76, 65);">**特别提醒：这里是以Arduino Uno 开发板为例，也可以使用其他开发板。**</span>

**请严格按以下表格连接（仅3根线）：**  

| XD-58C 线缆颜色 | 接 Arduino Uno 的哪个孔位？ | 操作步骤 |
|----------------|------------------------------|----------|
| 红色线（VCC） | `5V` 引脚（位于板子下一排标着“5V”的接口孔） | 插入任意一个标“5V”的孔|
| 黑色线（GND） | `GND` 引脚（紧邻 `5V` 孔，标着“GND”） | **必须与红色线插在同一侧GND孔** |
| 紫色线（OUTPUT） | `A0` 引脚（板子左侧一列标着“A0”至“A5”的模拟引脚） | 插入标有“A0”的金属孔（不是数字引脚D0） |

![Img](./media/img-03.png)

✅ **接线完成后的样子：**

- Uno 板上：5V孔插红线、同一侧GND孔插黑线、A0孔插白线  
- 传感器：夹在食指指尖（指甲盖背面，肉厚处），LED绿光应清晰可见（暗光下更准）  

⚠️ 注意：如果夹不稳，可用胶带轻固定；但**不要缠绕过紧**（影响血流，导致读数偏低或中断）。

---

## 5. Arduino IDE下载安装

### 5.1 Windows 系统

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

#### 5.1.1 Arduino IDE下载 

我们先到Arduino官方的网站：[Software | Arduino](https://www.arduino.cc/en/software/) 下载 Arduino IDE。

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

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

![Img](./media/Arduino_2.3.6-a2.png)

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

#### 5.1.2 Arduino IDE安装

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

![Img](./media/Arduino_2.3.6-a5.png)

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

![Img](./media/Arduino_2.3.6-a6.png)

3\. 选择安装选项.

![Img](./media/Arduino_2.3.6-a7.png)

4\. 选择安装位置.

![Img](./media/Arduino_2.3.6-a8.png)

5\. 单击 "Finish" 并运行Arduino IDE

![Img](./media/Arduino_2.3.6-a9.png)

### 5.2 MacOS 系统

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

#### 5.2.1 Arduino IDE下载

我们先到Arduino官方的网站：[Software | Arduino](https://www.arduino.cc/en/software/) 下载 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](./media/Arduino_2.3.6-a4.png)

#### 5.2.2 Arduino IDE安装

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

![Img](./media/Arduino_2.3.6-Mac.png)


### 5.3 设置Arduino IDE语言

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

1\. 首先打开Arduino IDE.

![Img](./media/Arduino_2.3.6-ArduinoIDE.png)

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

![Img](./media/Arduino_2.3.6-a29-1.png)

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

![Img](./media/Arduino_2.3.6-a29-2.png)

### 5.4 Arduino IDE说明

![Img](./media/Arduino_2.3.6-a35.png)

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](https://www.keyesrobot.cn/zh-cn/latest)

![Img](./media/BA1.png)

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

![Img](./media/BA2.png)

![Img](./media/img-51.png)

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

![Img](./media/img-32.png)

## 7. 示例代码  

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

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

```arduino
// 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](./media/img-05.png)

![Img](./media/img-00.png)

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

![Img](./media/img-17.png)

1\. 点击 Arduino IDE 右上角 ![Img](./media/img-01.png) 图标（串口监视器）

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

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

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

---

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

此代码自动识别心跳峰值，每15秒更新一次心率值（更接近真实心率）：

```arduino
// 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](./media/img-09.png)

![Img](./media/img-53.png)

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

![Img](./media/img-39.png)


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

---

