基于 Arduino Nano 和 MAX30102 的心率监测仪(16x2 LCD 显示)
组件与物料
| Arduino Nano R3 | ×1 |
| MAX30102 心率传感器模块 | ×1 |
| Adafruit RGB 背光 LCD - 16x2 | ×1 |
| 旋转电位器(通用) | ×1 |
所需工具与设备
| 电烙铁(通用) |
应用与在线服务
| Arduino IDE |
项目简介
这是一个基于 MAX30102 传感器模块的简易心率监测仪。我参考 Arduino 库编写了简单代码,测得的数值在 16x2 LCD 屏幕上显示:第一行显示平均每分钟心跳数(BPM),第二行显示反射红外光的数值。该数值应保持恒定以获得更准确的读数。
代码
Arduino 代码
/* 光学心率检测 (PBA 算法) 使用 MAX30105 Breakout By: Bennu @ MH-ET LIVE Date: October 2nd, 2017 https://github.com/MHEtLive/MH-ET-LIVE-max30102 此演示展示如何使用外周搏动振幅 (PBA) 算法读取心率或每分钟搏动数 (BPM)。 最好用橡皮筋或其他固定装置将传感器固定在手指上。 人类很难对物体施加恒定压力。当你将手指按在传感器上时,压力变化会导致手指血液流动不同,从而使传感器读数变得不稳定。 硬件连接 (Breakoutboard 到 Arduino): -5V = 5V (允许 3.3V) -GND = GND -SDA = A4 (或 SDA) -SCL = A5 (或 SCL) -INT = 未连接 MAX30105 Breakout 可处理 5V 或 3.3V I2C 逻辑。建议使用 5V 供电,也可在 3.3V 下运行。 */ #include#include "MAX30105.h" #include #include "heartRate.h" MAX30105 particleSensor; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const byte RATE_SIZE = 4; // 增加此值可获得更多平均值,4 为宜 byte rates[RATE_SIZE]; // 心率数组 byte rateSpot = 0; long lastBeat = 0; // 上次心跳发生的时间 float beatsPerMinute; int beatAvg; void setup() { Serial.begin(9600); lcd.begin(16, 2); Serial.println("初始化中..."); // 初始化传感器 if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { // 使用默认 I2C 端口,400kHz 速度 Serial.println("未找到 MAX30105,请检查接线/供电。"); while (1); } Serial.println("请将食指平稳按在传感器上。"); particleSensor.setup(); // 使用默认设置配置传感器 particleSensor.setPulseAmplitudeRed(0x0A); // 红色 LED 低亮度指示传感器运行 particleSensor.setPulseAmplitudeGreen(0); // 关闭绿色 LED } void loop() { long irValue = particleSensor.getIR(); if (checkForBeat(irValue) == true) { // 检测到心跳! long delta = millis() - lastBeat; lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); if (beatsPerMinute < 255 && beatsPerMinute > 20) { rates[rateSpot++] = (byte)beatsPerMinute; // 存储读数 rateSpot %= RATE_SIZE; // 循环变量 // 计算平均值 beatAvg = 0; for (byte x = 0; x < RATE_SIZE; x++) beatAvg += rates[x]; beatAvg /= RATE_SIZE; } } Serial.print("IR="); Serial.print(irValue); Serial.print(", BPM="); Serial.print(beatsPerMinute); Serial.print(", Avg BPM="); Serial.print(beatAvg); if (irValue < 50000) Serial.print(" 无手指?"); Serial.println(); lcd.setCursor(0,0); lcd.print("BPM: "); lcd.print(beatAvg); lcd.setCursor(0,1); lcd.print(" IR: "); lcd.print(irValue); }
原理图

制造工艺
- 远程心率监测系统:AWS IoT 告警 + 树莓派 Windows IoT 可视化
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- 用光敏电阻和 Arduino 制作精准心率监测仪
- 热水器点火器监测器:Arduino Nano + 树莓派 Zero 监控热电偶电压,熄火即时推送
- 基于 Arduino Mega 与物联网传感器的高级家庭监控系统
- 打造可靠的 Arduino 气象站:DHT 传感器 + LCD + RTC
- 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南
- 用蜂鸣器和摇杆制作经典 Arduino LCD 街机游戏
- 用 XOD 可视化编程为 Arduino 快速构建 LCD 菜单系统,零代码实现
- 智能服装集成心率传感器实现可靠可穿戴监测