当前位置:网站首页>【心率传感器与Arduino连接读取心率数据】
【心率传感器与Arduino连接读取心率数据】
2022-08-02 03:29:00 【WENJIE科技】
心率传感器与Arduino连接读取心率数据
前言
这篇文章我们想用一个简单的脉搏传感器来测量心跳。这款脉搏传感器是一款精心设计的 Arduino 即插即用心率传感器。该传感器易于使用并具有许多应用,这就是为什么它是希望将实时心率数据整合到他们的项目中的学生、艺术家、运动员、制造商以及游戏和移动开发人员的完美选择。
脉冲传感器引脚
脉冲传感器配有带三个公头连接器的扁平带状电缆。脉冲传感器的引脚分配如下:Signal==》是传感器模块的模拟输出引脚,它将直接为我们提供传感器的模拟读数。
VCC==》是传感器的电源引脚。将其连接到 Arduino 的 5V 引脚。
GND==》是传感器的接地引脚。将其连接到 Arduino 的接地引脚。
脉冲传感器模块如何工作?
光脉冲传感器的基本工作非常简单易懂。光脉冲传感器通过皮肤照射波长为 550 nm 的绿光并测量反射光;这种脉冲检测方法称为光电容积描记图。脉冲传感器的工作如下。脉搏传感器通过皮肤照射光线并用光电探测器测量反射。这种通过光检测脉冲的方法称为光电容积描记图。传感器的工作可以分为两部分,一是心率测量,二是血氧水平测量。
血红蛋白中的氧有一个特殊的特性,就是可以吸收一定量的绿光。血液中的氧气越多,血液就会变得越红,从而增加光的吸收率,并减少反射。当血液通过手指的静脉泵出时,反射光的数量会发生变化,从而产生振荡波形。通过测量这个波,我们可以获得心跳读数。来自传感器的信号幅度非常小且嘈杂,这就是为什么信号通过低通滤波器通过,然后被 Arduino 读取的运算放大器放大的原因。
脉冲传感器模块组成
这是一种低功耗、低成本、坚固耐用的传感器,可用于许多不同的应用,这使得它在需要测量心率的许多不同应用中很受欢迎。如果您查看传感器的正面,您只能看到 LED 和光电二极管本身。但真正的电路在传感器的背面。电路中的低功率高带宽运算放大器被配置为为电路提供一些增益,我们有一个反向电压保护二极管来保护电路免受 ESD 和反向电压的影响。PCB 中的其他电容器和电阻器用于 RC 滤波器,以减少电路中的任何外部噪声。
关于脉冲传感器模块的常见问题
你能从脉搏中看出血压吗?
脉搏将提供估计收缩压所需的基本信息(血压读数的上限)。请记住,这是一个非常粗略的估计,仅表明收缩压是否不低。应使用袖带和听诊器进行血压监测。
血压测量中的收缩压和舒张压是什么?
血压是用两个数字测量的:第一个数字称为收缩压,用于测量心脏跳动时动脉中的压力。第二个数字称为舒张压,用于测量心脏在两次跳动之间休息时的动脉压力。
什么是血压的神经控制?
血压和血流的神经调节取决于位于延髓的心血管中心。这组神经元对血压的变化以及氧气、二氧化碳和其他因素(如 pH 值)的血液浓度的变化作出反应。
什么是 HRM 传感器?
心率监测器 (HRM) 是一种个人监测设备,可让人们实时测量/显示心率或记录心率以供日后研究。它主要用于在进行各种体育锻炼时收集心率数据
脉冲传感器模块电路图
脉冲传感器模块的电路图如下所示。该电路的第一个重要部分是 10uF 滤波电容,然后是绿色 LED 和 470R 电阻。
470R 电阻是传感器模块的限流电阻。同样在电路中,您可以看到电路通过二极管供电。二极管有两个用途:首先它起到反极性保护的作用,其次它保护电路免受瞬态影响。在二极管之后,功率在 MCP6001 运算放大器和 APDS-9008 光电二极管传感器 IC 之间分配。传感器 IC 的输出幅度非常低且嘈杂。这就是为什么我们需要通过一组 RC 低通滤波器对其进行滤波,然后经过运算放大器放大清理后的信号,然后我们可以使用微控制器处理数据。
Arduino 心率传感器 - 连接图
现在我们完全了解了脉搏传感器的工作原理;我们可以将所有需要的电线连接到 Arduino UNO 板,在本文的这一部分,我们将讨论这个!
Arduino脉冲传感器电路图如上图所示。我们正在使用 Arduino 的 A0 引脚来处理来自传感器的数据。传感器的电源引脚连接到 Arduino 的 5V 和接地引脚。实际测试硬件如下图所示。
Arduino 代码
Arduino脉搏传感器代码简单易懂,大部分难点都由PulseSensorPlayground.h库处理,说到库这不是Arduino的标准库,需要用库管理器单独安装. 为此,只需在库管理器窗口中搜索 pulsesensor 并安装 Joel Murphy、Yury Gitman 的 PulseSensor Playground。一旦安装完成并且一切准备就绪,我们就可以继续代码的下一部分。
正如我们之前所说,这个项目的代码部分将非常简单,这就是为什么我们使用库中的一个简单示例代码来为我们管理所有繁重的工作。但是让我们不要偷懒,看看代码是如何工作的。
我们通过包含处理传感器数据所需的所有必需库和变量来开始我们的代码。
#define USE_ARDUINO_INTERRUPTS true // Set-up low-level interrupts for most acurate BPM maths.
#include <PulseSensorPlayground.h> // Includes the PulseSensorPlayground Library.
// Variables
const int PulseWire = 0; // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13; // The on-board Arduino LED, close to PIN 13.
int Threshold = 550; // Determine which Signal to "count as a beat" and which to ignore.
// Use the "Getting Started Project" to fine-tune Threshold Value beyond default setting.
// Other
接下来,我们创建一个名为“pulseSensor”的PulseSensorPlayground对象实例,使用该实例我们将能够访问该类的所有方法。
PulseSensorPlayground pulseSensor; // Creates an instance of the PulseSensorPlayground object called "pulseSensor
接下来,我们有我们的设置功能。在 setup 函数中,我们初始化串口进行调试。
接下来,我们通过将变量分配给它来配置 PulseSensor 对象。接下来,我们将 LED13 变量传递给pulseSensor.blinkOnPulse函数,该函数将通过心跳使 LED 闪烁。然后我们在pulseSensor.setThreshold变量的帮助下设置传感器的阈值。最后我们创建了一个脉冲传感器对象并结束了我们的设置函数。
void setup() {
Serial.begin(9600); // For Serial Monitor
// Configure the PulseSensor object, by assigning our variables to it.
pulseSensor.analogInput(PulseWire);
pulseSensor.blinkOnPulse(LED13); //auto-magically blink Arduino's LED with heartbeat.
pulseSensor.setThreshold(Threshold);
// Double-check the "pulseSensor" object was created and "began" seeing a signal.
if (pulseSensor.begin()) {
Serial.println("We created a pulseSensor Object !"); //This prints one time at Arduino power-up, or on Arduino reset.
}
}
接下来我们有我们的循环功能。在循环函数中,我们调用pulseSensor对象上的函数,该函数将 BPM 作为整数返回,我们保存在myBPM变量中。现在我们不断检查是否发生了节拍。如果是这样,我们在串行监视器窗口中打印结果。
void loop() {
int myBPM = pulseSensor.getBeatsPerMinute(); // Calls function on our pulseSensor object that returns BPM as an "int".
// "myBPM" hold this BPM value now.
if (pulseSensor.sawStartOfBeat()) {
// Constantly test to see if "a beat happened".
Serial.println(" A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
Serial.print("BPM: "); // Print phrase "BPM: "
Serial.println(myBPM); // Print the value inside of myBPM.
}
delay(20); // considered best practice in a simple sketch
}
心率传感器模块的工作
下面的 gif 显示了Arduino 脉冲传感器的实际电路。您可以在窗口的左侧看到我们的 Arduino,我们已将脉搏传感器连接到该 Arduino。传感器用一条胶带粘在我的手指上,在窗口的右侧,您可以看到串行监视器窗口,您可以在其中看到传感器测量的实时心率。
完整代码
#define USE_ARDUINO_INTERRUPTS true // Set-up low-level interrupts for most acurate BPM math.
#include <PulseSensorPlayground.h> // Includes the PulseSensorPlayground Library.
// Variables
const int PulseWire = 0; // PulseSensor PURPLE WIRE connected to ANALOG PIN 0
const int LED13 = 13; // The on-board Arduino LED, close to PIN 13.
int Threshold = 550; // Determine which Signal to "count as a beat" and which to ignore.
// Use the "Gettting Started Project" to fine-tune Threshold Value beyond default setting.
// Otherwise leave the default "550" value.
PulseSensorPlayground pulseSensor; // Creates an instance of the PulseSensorPlayground object called "pulseSensor"
void setup() {
Serial.begin(9600); // For Serial Monitor
// Configure the PulseSensor object, by assigning our variables to it.
pulseSensor.analogInput(PulseWire);
pulseSensor.blinkOnPulse(LED13); //auto-magically blink Arduino's LED with heartbeat.
pulseSensor.setThreshold(Threshold);
// Double-check the "pulseSensor" object was created and "began" seeing a signal.
if (pulseSensor.begin()) {
Serial.println("We created a pulseSensor Object !"); //This prints one time at Arduino power-up, or on Arduino reset.
}
}
void loop() {
int myBPM = pulseSensor.getBeatsPerMinute(); // Calls function on our pulseSensor object that returns BPM as an "int".
// "myBPM" hold this BPM value now.
if (pulseSensor.sawStartOfBeat()) {
// Constantly test to see if "a beat happened".
Serial.println(" A HeartBeat Happened ! "); // If test is "true", print a message "a heartbeat happened".
Serial.print("BPM: "); // Print phrase "BPM: "
Serial.println(myBPM); // Print the value inside of myBPM.
}
delay(20); // considered best practice in a simple sketch.
}
边栏推荐
- Arduino D1----Mlx90614红外温度传感器接线和安装包
- 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
- Jetpack中各个组件简介
- 一分钟get:缓存穿透、缓存击穿、缓存雪崩
- Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
- Dcat Admin 关闭代码生成器 登录指定地址
- 解决composer安装太慢 更换国内镜像
- Larave 自定义公共函数以及引入使用
- Gradle源码解析:生命周期的三个阶段
- C# 常用方法记录
猜你喜欢
Binder机制详解(二)
[Spark]-协同过滤
laravel 写api接口时 session获取不到处理办法
解决flex布局warp自动换行下最后一行居中问题
如何在正则表达式里表达可能存在也可能不存在的内容?
umi3 权限路由PrivateRoute未执行
Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx
同时安装VirtualBox和VMware,虚拟机如何上网
树莓派4b安装win11/10过程全教程(附蓝屏inaccessible boot device解决办法)
自定义view实现半圆弧进度条
随机推荐
面试必备:Android性能分析与优化实战进阶手册
Binder机制详解(三)
View与ViewGroup
树莓派4B打开文件管理时出现闪退
View的滑动
Jetpack中各个组件简介
账务处理程序、记账凭证账务处理程序、汇总记账凭证账务处理程序、科目汇总表账务处理程序、会计信息化概述、信息化环境下会计账务处理的基本要求(此章出1道小题)
解决flex布局warp自动换行下最后一行居中问题
Laravel 验证唯一时排除修改时的数据
Windows下MySQL数据库报“ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:8000‘ (10061)”错误解决
RecyclerView使用和原理解析
synchronized锁原理详解
浅谈性能优化:APP的启动流程分析与优化
蓝桥杯:国二选手经验贴 附蓝桥杯历年真题
《scala 编程(第3版)》学习笔记4
完整安装 Laravel-Admin 框架
Vision Transformer(ViT)论文精读和Pytorch实现代码解析
Go中的一些优化笔记,简约而不简单
Go 程序太大了,能要个延迟初始化不?
electron-builder打包不成功解决方法