当前位置: 首页 > article >正文

心率测量-arduino+matlab

参考:【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com)

1 原理

心跳检测模块,由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏,是这样工作的:当手指放在发射器与接收器之间,红外发射LED发射的光将穿过手指,到被接收器接收。而血压会随着脉搏变化,导致红外接收器接收到的光通量也会随之变化,因此可以通过红外光接收的情况来统计监测心跳。

红外心率测量是一种基于光学原理来检测人体心率的方法,其工作原理主要涉及光的发射、吸收、反射以及信号处理等过程,以下是具体介绍:

光学原理


1. **光源发射**


   - 红外心率测量设备通常使用红外发光二极管(LED)作为光源。这种LED能够发射特定波长的红外光,一般在700 - 1000纳米左右。例如,常用的波长为940纳米的红外LED,其发射的光具有良好的穿透性,能够穿透皮肤表层到达皮下组织。


2. **光的吸收与反射**


   - 当红外光照射到人体手指、耳垂或手腕等部位时,部分光会被组织吸收,部分光会被反射回来。人体的血液中含有大量的血红蛋白,血红蛋白对红外光有特定的吸收特性。血液中的血红蛋白和氧合血红蛋白对红外光的吸收量会随着血液的流动而发生变化。
   - 在心脏收缩(心缩期)时,大量血液被泵入动脉,血管扩张,血液量增加,对红外光的吸收也会相应增加,反射光的强度就会减弱;而在心脏舒张(心舒期)时,血管收缩,血液量相对减少,对红外光的吸收减少,反射光的强度增强。这种反射光强度的变化与心脏的搏动密切相关。

信号检测与处理


1. **光电检测**


   - 设备中有一个光电传感器(如光电二极管),它能够将反射回来的红外光信号转换为电信号。当反射光强度发生变化时,光电传感器输出的电信号的幅度也会随之变化。例如,当反射光强度减弱时,输出的电信号幅度减小;当反射光强度增强时,输出的电信号幅度增大。


2. **信号放大与滤波**


   - 由于光电传感器输出的信号通常比较微弱,需要经过放大电路进行放大。同时,人体周围环境可能存在各种干扰信号,如电磁干扰、环境光干扰等。为了提取出准确的心率信号,还需要通过滤波电路去除这些干扰信号。滤波电路一般会设计为带通滤波器,只允许与心率频率范围(通常为0.5 - 5赫兹)相符的信号通过。


3. **信号处理与心率计算**


   - 放大和滤波后的信号是一个随时间变化的周期性信号,其周期与心脏的搏动周期相对应。通过数字信号处理技术,如快速傅里叶变换(FFT)等方法,可以分析信号的频率成分,提取出心率信号的频率。心率的计算公式为心率(次/分钟)= 60 × 信号频率(赫兹)。例如,如果信号频率为1赫兹,那么心率就是60次/分钟。

红外心率测量技术具有非侵入性、操作方便、测量速度快等优点,广泛应用于医疗健康监测设备、智能穿戴设备(如智能手环、智能手表)等领域。然而,它也存在一些局限性,比如在手指等部位有污垢、指甲油等情况时,可能会影响红外光的反射和吸收,从而导致测量结果不准确。

2接线图

信号端接模拟量A0端口

电路修改说明: arduino板子的VIN--供电, GND, A0采集信号。但我感觉这个模块太简单了,就没有其他电路。怀疑不是心电检测。

下面这个怎么看也不是心率信号。

需要安装signal process 工具包,否则无法处理peak函数

% 确保安装了MATLAB Support Package for Arduino Hardware
% 如果未安装,请运行以下命令:
% matlab.addons.install('https://github.com/mathworks/arduinoio/archive/master.zip')% 初始化Arduino连接
clear 
a = arduino('COM6', 'Uno'); % 根据实际使用的端口修改COM3% 配置引脚模式
configurePin(a, 'A0', 'AnalogInput'); % 设置A0为模拟输入
configurePin(a, 'D13', 'DigitalOutput'); % 设置D13为数字输出% 初始化变量
sampleRate = 100; % 采样率100Hz
windowSize = 100; % 用于计算心率的窗口大小
data = zeros(windowSize, 1); % 初始化数据缓冲区
heartRate = 0; % 初始化心率
ledState = 0; % LED初始状态% 主循环
for i = 1:1000 % 读取1000个数据点% 读取A0端口的模拟值pulseValue = readVoltage(a, 'A0');% 将读取的值存储到数据缓冲区data(i) = pulseValue;% 如果数据缓冲区已满,计算心率if i >= windowSize% 提取窗口内的数据signal = data(i - windowSize + 1:i);% 检测信号中的峰值[peaks, locs] = findpeaks(signal, 'MinPeakProminence', 10);% 如果检测到多个峰值,计算心率if length(peaks) > 1avgPeakDistance = mean(diff(locs)); % 计算平均峰值间隔heartRate = 60 / (avgPeakDistance / sampleRate); % 计算心率(单位:bpm)fprintf('Heart Rate: %.2f BPM\n', heartRate);endend% 控制D13端口的LED闪烁if heartRate > 0ledState = ~ledState; % 切换LED状态writeDigitalPin(a, 'D13', ledState); % 写入LED状态end% 短暂延时以匹配采样率pause(1 / sampleRate);
endfigure
plot(signal)
title('心率检测信号')
% 关闭Arduino连接
clear 

采集数据data,1000点,不像 心率图

相关文章:

心率测量-arduino+matlab

参考:【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com) 1 原理 心跳检测模块,由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏,是这样工作的:当手指放在发射器与接收器之间,红外发射…...

H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)

以下内容纯为博主分享自己的想法和理解,如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网,来提高网络的可靠性和稳定性&a…...

字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)

⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口&am…...

Centos7下安装hive详细步骤

在Centos 7系统上安装Hive的步骤如下: 下载Hive:首先,在Apache Hive的官方网站上下载最新版本的Hive压缩包,地址为:https://hive.apache.org/downloads.html。选择合适的版本并下载。 解压Hive压缩包:将下…...

Verilog学习-1.模块的结构

module aoi(a,b,c,d,f);/*模块名为aoi,端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...

Linux驱动-块设备驱动

Linux驱动-块设备驱动 一,块设备驱动简介二,无请求队列情况(EMMC和SD卡等)三,请求队列情况(磁盘等带有I/O调度的设备)四,两者在驱动上区别 一,块设备驱动简介 块设备驱动…...

ffmpeg函数简介(封装格式相关)

文章目录 🌟 前置说明:FFmpeg 中 AVFormatContext 是什么?🧩 1. avformat_alloc_context功能:场景: 🧩 2. avformat_open_input功能:说明:返回值: &#x1f9…...

Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...

[随笔] nn.Embedding的前向传播与反向传播

nn.Embedding的前向传播与反向传播 nn.Embedding的前向计算过程 embedding module 的前向过程其实是一个索引(查表)的过程 表的形式是一个 matrix(embedding.weight, learnable parameters) matrix.shape: (v, h) v:…...

搜广推校招面经七十一

滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。 1.1. 直观理解&…...

【算法学习】链表篇:链表的常用技巧和操作总结

算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在各种数据结构中,链表是最常用的几个之一,熟练使用链表和链表相关的算法,可以让我们在处理很多问题上都更加…...

View UI (iview)表格拖拽排序

在使用 iView UI 的 Table 组件进行拖拽排序时&#xff0c;可以通过以下步骤获取最新的排序数据&#xff1a; 1. 启用拖拽功能 在 Table 组件上设置 draggable 属性&#xff0c;并绑定拖拽结束事件 on-row-drop。 <template><Table:columns"columns":dat…...

OpenNMT 部署和集成指南

OpenNMT&#xff08;Open Neural Machine Translation&#xff09;是一个开源的神经机器翻译&#xff08;NMT&#xff09;系统&#xff0c;由 Systran 和 Harvard NLP Group 在 2016 年联合推出。它的目标是为研究人员和企业开发者提供一个高质量、灵活且易于扩展的机器翻译框架…...

2台8卡L20服务器集群推理方案

1、整体流程梳理 #mermaid-svg-0aNtsWUnOH7ewXpN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-icon{fill:#552222;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-text{fill:#552222;stroke:#55…...

HarmonyOS:使用geoLocationManager (位置服务)获取位置信息

一、简介 位置服务提供GNSS定位、网络定位&#xff08;蜂窝基站、WLAN、蓝牙定位技术&#xff09;、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常&#xff0c;可能导致应用异常。 …...

系统分析师(二)--操作系统

概述 进程管理 选项A&#xff1a;该进程中打开的文件 进程中打开的文件是由整个进程来管理的&#xff0c;同一进程下的各个线程都可以对这些打开的文件进行访问和操作&#xff0c;所以进程中打开的文件是可以被这些线程共享的。 选项B&#xff1a;该进程的代码段 进程的代码…...

安科瑞测频仪表:新能源调频困局的破局者

安科瑞顾强 在“双碳”目标推动下&#xff0c;风电、光伏等新能源正加速成为电力供应的核心力量。然而&#xff0c;新能源发电的间歇性与波动性&#xff0c;如同一把“双刃剑”&#xff0c;在提供清洁电力的同时&#xff0c;也给电网稳定运行带来了前所未有的挑战。国家能源局…...

富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程

富士&#xff08;Fujifilm&#xff09;相机拍摄的 RAW 格式文件&#xff08;RAF&#xff09;因其高质量和丰富的图像信息而受到摄影师的喜爱。然而&#xff0c;RAF 文件通常体积较大且不易于分享或直接使用。为了方便处理&#xff0c;许多人选择将其转换为更通用的 JPG 格式。在…...

Linux 入门指令(1)

&#xff08;1&#xff09;ls指令 ls -l可以缩写成 ll 同时一个ls可以加多个后缀 比如 ll -at (2)pwd指令 &#xff08;3&#xff09;cd指令 cd .是当前目录 &#xff08;4&#xff09;touch指令 &#xff08;5&#xff09;mkdir指令 &#xff08;6&#xff09;rmdir和rm…...

Redis缓存数据库一致性

前言&#xff1a; 在系统开发中经常使用关系型数据库&#xff0c;为了提升关系型数据库的读性能&#xff0c;一般会使用redis加一层缓存&#xff0c;缓存和数据库是分离的两次操作&#xff0c;本文用来分析如何操作能保证缓存和数据库的数据一致性。 一、读场景 二、写场景 …...

Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin

Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><u…...

文件相关:treecpmv命令扩展详解

拷贝和移动文件 序号命令对应英文作用01tree [目录名]tree以树状图列出文件目录结构02cp 源文件 目标文件copy复制文件或者目录03mv 源文件 目标文件move移动文件或者目录&#xff0f;文件或者目录重命名 一、 tree命令 &#xff08;1&#xff09;定义 tree 命令可以以树状…...

S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域

在开发平台软件的时候代码中超出了64K的内存&#xff0c;单纯在ld文件中&#xff0c;增加m_data_2的存储长度&#xff0c;原先是0x00007000,我将长度修改为0x00008000,起始地址还是0x20000000,软件编译没有报错堆栈超出&#xff0c;但是软件下载到单片机中之后&#xff0c;144不…...

基于 SysTick 定时器实现任务轮询调度器

文章目录 前言一、SysTick 定时器介绍二、SysTick 驱动设计1. 初始化方法2. SysTick 中断函数3. 时间类 API 三、任务调度器设计1. 任务结构体2. 任务初始化3. 主调度器4. 调度器更新 四、任务函数实现五、总结1. 优缺点分析2. 扩展建议 前言 在嵌入式系统中&#xff0c;对于资…...

【STM32】综合练习——智能风扇系统

目录 0 前言 1 硬件准备 2 功能介绍 3 前置配置 3.1 时钟配置 3.2 文件配置 4 功能实现 4.1 按键功能 4.2 屏幕功能 4.3 调速功能 4.4 倒计时功能 4.5 摇头功能 4.6 测距待机功能 0 前言 由于时间关系&#xff0c;暂停详细更新&#xff0c;本文章中&#xff0c;…...

MyBatis 动态 SQL 使用详解

&#x1f31f; 一、什么是动态 SQL&#xff1f; 动态 SQL 是指根据传入参数&#xff0c;动态拼接生成 SQL 语句&#xff0c;不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…...

【重装系统】大白菜自制U盘装机,备份C盘数据,解决电脑启动黑屏/蓝屏

1. 准备 U 盘 U 盘容量至少 8G&#xff0c;备份 U 盘的数据&#xff08;后期会格式化&#xff09; 2. 从微软官网下载操作系统镜像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下载安装大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盘&#…...

vue实现目录锚点且滚动到指定区域时锚点自动回显——双向锚点

最近在用vue写官网&#xff0c;别问我为什么用vue写官网&#xff0c;问就是不会jq。。。。vue都出现11年了。。。 左侧目录&#xff1a;点击时&#xff0c;右侧区域可以自动滚动到指定的位置。 右侧区域手动滚动时&#xff0c;左侧锚点可以自动切换到对应的目录上 从而实现…...

python——正则表达式

一、简介 在 Python 中&#xff0c;正则表达式主要通过 re 模块实现&#xff0c;用于字符串的匹配、查找、替换等操作。 二、Python的re模块 使用前需要导入&#xff1a; import re 三、常用方法 方法描述re.match(pattern, string)从字符串开头匹配&#xff0c;返回第一个匹…...

Flutter Invalid constant value.

0x00 问题 参数传入变量&#xff0c;报错&#xff01; 代码 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 参数报错&#xff1a;Invalid constant value. 0x01 原因 这种情况&#xff0c;多发生于&#xff…...