MAX30102心率血氧传感器
MAX30102心率血氧传感器介绍
- 背景
- 基本功能
- 基本结构
- 基本原理
- 采集方法
- 直通式采集方法
- 反射式采集方法
- 血氧采集原理
- Beer-Lambert 定理
- 皮肤组织模型
- 血氧测量过程
- AC / DC 的计算
- 心率采集原理
- 实验结果
- 代码走读
- 资源链接
背景
目前,基本上所有的可穿戴式设备都集成了心率血氧测量的功能,在手表/手环中尤为常见。一般情况下,开发人员用于评估的心率血氧传感器型号用的都是MAX30102/MAX30100。MAX30102EFD如下图所示。

为上图所示的MAX30102传感器增加外围电路后就成为了常见的MAX30102模组,如下图所示。

MAX30102传感器是美国美信公司(maxim integrated)生产的一款集成的脉搏血氧仪和心率监测仪生物传感器模块。由于公司名称是Maxim,所以器件名以MAX开头,型号为30102。不过目前这个公司已经被美国的半导体巨头亚德诺半导体(ADI)公司收购,MAX30102属于一种光学生物传感器,ADI在售的心率血氧传感器还有MAX30101、MAX86140、MAX86141、MAX32664、MAXM86161等,有需要的朋友可以直接去ADI官方对相应的器件功能进行相应的评估。
基本功能
使用MAX30102可以对心率、血氧、温度三个指标进行测量,配合一些MCU能够实现相关物理量的快速采集。
基本结构
链接: MAX30102官方介绍
链接: MAX30102心率血氧评估板数据解算及使用手册
链接: SpO2 测量原理介绍
链接: [心率血氧测量原理论文](file:///C:/Users/23890/Desktop/MAX30102%E8%B5%84%E6%96%99/%E5%BF%83%E7%8E%87%E8%A1%80%E6%B0%A7%E6%B5%8B%E8%AF%95%E5%8E%9F%E7%90%86%E6%96%87%E7%AB%A0.pdf)
基本原理
通过光电的方式对心率和血氧进行测量,在模块上有两个LED,然后又有两套光电二极管。
采集方法
直通式采集方法
在医院测量中常用的一种血氧采集方式,如下图所示,光电传感器和光源分别置于手指的两侧,光源穿过手指被另一侧的光电二极管接收,根据光衰减量计算血氧浓度。

反射式采集方法
常见于一些穿戴设备如常见的手环、手表等设备中。LED光源和光电二极管置于同侧,光穿过皮肤被反射回同侧光电二极管,光电二极管根据光衰减量进行血氧的计算。
血氧采集原理
血氧即血氧饱和度(SpO2),这是一个百分比的概念。物理含义是血液中氧气饱和度的百分比。我们都知道,人体或者动物中有自己的血液循环系统,血液中由血红蛋白携带氧气从动脉流出,然后在携二氧化碳等气体送到肺部。所以会有富氧的血红蛋白
(Hb-O2)和缺氧的血红蛋白(Rhb)之分。所以可以通过血液中富氧血红蛋白占总血红蛋白的比例来定义血氧饱和度。所以SpO2可以用以下表达式描述,C代表血红蛋白的数量:
S p O 2 = C [ H b O 2 ] C [ H b O 2 ] + C [ R H b ] × 100 \mathrm{SpO}_{2}= \frac{\mathrm{C}\left[\mathrm{HbO}_{2}\right]}{\mathrm{C}\left[\mathrm{HbO}_{2}\right]+\mathrm{C}[\mathrm{RHb}]} \times100 SpO2=C[HbO2]+C[RHb]C[HbO2]×100
Beer-Lambert 定理
Beer-Lambert 定理描述了光在传播过程中通过材料的衰减特性。
I = I 0 e − ε ( λ ) C d I = I_{0} e^{-\varepsilon (\lambda )Cd} I=I0e−ε(λ)Cd
根据上面的公式,可以计算得到
A = ln I 0 I = ε ( λ ) C d A = \ln_{}{\frac{I_{0} }{I} } =\varepsilon (\lambda )Cd A=lnII0=ε(λ)Cd
A 这里代表光线总的衰减量, I 0 为入射光强度, I 为反射光强度。 ε ( λ ) 称为摩尔消光系数,指物质对某波长的光的吸收能力的量度。 C 是穿透材料的浓度, d 为光传播路径。 A 这里代表光线总的衰减量,I_{0}为入射光强度,I为反射光强度。\\\varepsilon (\lambda )称为摩尔消光系数,指物质对某波长的光的吸收能力的量度。\\C是穿透材料的浓度,d为光传播路径。 A这里代表光线总的衰减量,I0为入射光强度,I为反射光强度。ε(λ)称为摩尔消光系数,指物质对某波长的光的吸收能力的量度。C是穿透材料的浓度,d为光传播路径。
皮肤组织模型
使用光电方式完成血氧测量基于下面的三层主要结构的基本模型。光线首先穿透皮肤组织,下面一层是动脉血,动脉血由心脏推动,心脏跳动一次血液产生一次脉动。第二层是静脉血及分布的毛细血管,第三层是骨头、肌肉等其他物质。光线穿透这三层物质被光电二极管接收,根据光线衰减量对血氧含量进行测量。

那么,根据上面的Beer-Lambert 定理,针对测量的具体场景,测量过程的衰减为三层穿透物质衰减量的叠加。
A = d [ ε H b O 2 ( λ ) C [ H b O 2 ] + ε R H b ( λ ) C [ R H b ] + ε other ( λ ) C [ other ] ] A=d\left[\varepsilon_{\mathrm{HbO}_{2}}(\lambda) C\left[\mathrm{HbO}_{2}\right]+\varepsilon_{\mathrm{RHb}}(\lambda) C[\mathrm{RHb}]+\varepsilon_{\text {other }}(\lambda) C[\text { other }]\right] A=d[εHbO2(λ)C[HbO2]+εRHb(λ)C[RHb]+εother (λ)C[ other ]]
血氧测量过程
基本的测量原理是使用一个LED照射待测量点,这个测量点可能是手指、耳垂等位置,接收端的光电二极管对穿透上面三层结构的反射光进行计算,进而得出血氧含量。具体的细节在于,三层模型中的脉动血会对光线产生不同程度的吸收和调制。穿透皮肤的反射光线称为PPG(photoplethysmographic)信号,正常情况下,PPG信号如下图所示。值得注意的是,为了保证高精度,一般使用两种不同波长的光(660nm和880nm)进行照射并根据结果进行联合计算。

常见的计算过程需要知道R的值,R与SpO2强相关,可以根据R直接计算SpO2
R = A C red / D C red A C ired / D C ired \mathrm{R}=\frac{\mathrm{AC}_{\text {red }} / \mathrm{DC}_{\text {red }}}{\mathrm{AC}_{\text {ired }} / \mathrm{DC}_{\text {ired }}} R=ACired /DCired ACred /DCred
R与SpO2的关系式由经验的出来的,比较简单的一种计算方式为:
S p O 2 = 104 − 17 R SpO2 = 104 - 17R SpO2=104−17R
AC / DC 的计算
AC是交流分量,DC是直流分量。通常情况下,光电二极管接收到的典型的波形如下:

估算AC、DC值的方法如下:找两个波谷点,两个波谷点之间有一个波峰点,两个波谷点相连成一条直线,与Y轴平行的线穿过波峰点会与两个波谷点连接成的直线相交于一点,这个点就是DC点,DC点的Y轴对应值就是直流分量,AC分量的值为波峰点到DC点之间的差值。
为什么是这样没有弄明白。
里面有两种不同波长的光对与皮肤的穿透的原理的论文没有弄明白。
心率采集原理
血管脉动的频率和心脏跳动的频率相同,血管脉动会导致光衰减量的不同。心脏每跳动一次,会产生一个波峰点和一个波谷点,典型的波形如下,通过计算波峰和波谷之间的时间差就能够计算心率。

实验结果
串口调试助手测量的结果如下图所示。心率数据为83,血氧浓度98。

代码走读
资源链接
内容涵盖: MAX30102 DataSheet (英文版)、
相关文章:
MAX30102心率血氧传感器
MAX30102心率血氧传感器介绍 背景基本功能基本结构基本原理采集方法直通式采集方法反射式采集方法 血氧采集原理Beer-Lambert 定理皮肤组织模型血氧测量过程AC / DC 的计算 心率采集原理 实验结果代码走读资源链接 背景 目前,基本上所有的可穿戴式设备都集成了心率…...
高效解决 TypeError : ‘ numpy._DTypeMeta‘ object is not subscriptable 问题
文章目录 问题描述解决问题 问题描述 解决问题 参考博文 打开报错位置 AppData\Roaming\Python\Python39\site-packages\cv2\typing\ 添加single-quotes,即单引号 博主说The trick is to use single-quotes to avoid the infamous TypeError: ‘numpy._DTypeMeta’…...
Hadoop作业篇(一)
一、选择题 1. 以下哪一项不属于Hadoop可以运行的模式__C____。 A. 单机(本地)模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 C. 互联模式 不属于Hadoop可以运行的模式。 Hadoop主要有四种运行模式: A. 单机(本地…...
SpringCloud中的分布式锁用法详解(Java+Redis SETNX命令)
前言: 在分布式系统中,保证数据的一致性和并发控制是至关重要的。分布式锁能够解决多个进程/线程同时访问共享资源的问题,确保只有一个进程/线程能够获得锁。本文将介绍如何使用Java和Redis实现分布式锁,并提供示例代码和注意事项…...
初学者如何选择:前端开发还是后端开发?
#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人,我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先,让我们将编程世界的大城市比作前端开发和后端开…...
从php页面插入MySQL的数据变为乱码如何解决?
在 PHP 页面中向 MySQL 数据库插入数据时,如果数据出现乱码,可能是因为字符集设置不正确或者字符编码不匹配。 数据库字符集设置不正确: 确保数据库的字符集设置与您的应用程序所使用的字符集一致。通常情况下,UTF-8 是一个通用的…...
OpenCV防抖实践及代码解析笔记
视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移(比如沿着x、y、z方向上的运动)或旋转(偏航、俯仰、翻滚)。 正如你在上面的图片中看到的,在欧几里得运动模型中,图像…...
函数栈帧的创建与销毁剖析
目录 一、前言 二、基础知识介绍 2.1 寄存器介绍 2.2、汇编指令介绍 三、函数栈帧的创建销毁过程 3.1 调用main函数的函数 3.2 main函数开辟栈帧 3.3 在main函数中创建变量 3.4 调用Add函数前的准备 3.5 为Add函数开辟栈帧 3.6 在Add函数中创建变量并运算 3.7 Add函…...
性能测试-如何进行监控设计
监控设计步骤 首先,你要分析系统的架构。在知道架构中使用的组件之后,再针对每个组件进行监控。 其次,监控要有层次,要有步骤。先全局,后定向定量分析。 最后,通过分析全局、定向、分层的监控数据做分析…...
大数据List去重
概述 两个超大List集合去重,时间最短的方式去实现。 详细 MaxList模块主要是对Java集合大数据去重的相关介绍。 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去…...
CentOS8.2重启网络
查看网络配置命令 # ip addr # nmcli ens160: 已连接 到 ens160"VMware VMXNET3"ethernet (vmxnet3), 00:50:56:B6:34:84, 硬件, mtu 1500ip4 默认inet4 10.3.10.111/24route4 10.3.10.0/24route4 0.0.0.0/0inet6 fe80::250:56ff:feb6:3484/64route6 ff00::/8rou…...
2023年【G1工业锅炉司炉】考试题及G1工业锅炉司炉模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2023年G1工业锅炉司炉考试题为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题,每个月更新的G1工业锅炉司炉模拟考试祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGG0001-2012《锅炉安全技术监…...
观察者模式 行为型设计模式之七
1.定义 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样定义的:定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化࿰…...
数据结构与算法之堆: Leetcode 451. 根据字符出现频率排序 (Typescript版)
根据字符出现频率排序 https://leetcode.cn/problems/sort-characters-by-frequency/ 描述 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。返回 已排序的字符串 。如果有多个答案,返回其…...
吃透底层:从路由到前缀树
前言 今天学到关于路由相关文章,发现动态路由中有一个很常见的实现方式是前缀树,很感兴趣这个算法,故进行记录。 前缀树 Trie(又被叫做字典树)可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含…...
SparkSQL外部数据源
1.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景。 - CSV - JSON - Parquet - ORC - JDBC/ODBC connections - Plain-text files 1.2 读数据格式 所有读取 API 遵循以下调用格式: // …...
林沛满-TCP 是如何避免被发送方分片的?
TCP 可以避免被发送方分片,是因为它主动把数据分成小段再交给网络层。最大的分段大小称为 MSS(Maximum Segment Size),它相当于把 MTU 刨去 IP头和 TCP 头之后的大小,所以一个 MSS 恰好能装进一个 MTU 中。 图4 图 4 …...
Java中的枚举是什么?
Java枚举详解 枚举(Enum)是Java编程语言中的一种特殊数据类型,它用于表示一组具名的常量。枚举提供了一种更加类型安全和易于理解的方式来表示常量值,使代码更加清晰和可维护。 为什么需要枚举? 在介绍Java枚举的具…...
java学习--day24(单例模式序列化Lambda表达式)
文章目录 回顾今天的内容1.单例模式2.序列化3.Lambda表达式3.1入门案例3.2lambda表达式语法格式3.2.1无参无返回值的形式3.2.2有参无返返回值的方法3.2.3无参有返回值3.2.4有参有返回值的 回顾 1.三种创建Class对象的形式Class.forName("")类.class对象.getCalss()字…...
从0开始学go第六天
方法一:gin获取querystring参数 package main//querystring import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/web", func(c *gin.Context) {//获取浏览器那边发请求携带的query String参数//…...
使用HIP编写GPU 算子向量加法
HIP (Heterogeneous-compute Interface for Portability) 来编写一个 GPU 算子(operator)。HIP 是 AMD 推出的 GPU 编程接口,类似 CUDA,但可在 AMD 和 NVIDIA GPU 上运行。下面我给你一个完整示例,演示如何写一个简单算…...
EFM8 I2C Slave外设深度解析:从SMBus思维转换到实战应用
1. 项目概述:从SMBus到I2C Slave的思维转换如果你之前主要接触的是SMBus(系统管理总线)设备,现在要上手Silicon Labs的EFM8LB1或EFM8BB3这类8位MCU的I2C Slave(从机)功能,可能会觉得有点“水土不…...
用TensorFlow和BERT搞定CTI分析:一个实战案例教你从威胁报告中自动提取攻击技战术
基于BERT与TensorFlow的威胁情报自动化分析实战指南 在网络安全领域,威胁情报分析正经历着从人工解读到智能解析的范式转变。传统安全团队每天需要处理数百份威胁报告,分析师往往淹没在大量非结构化文本中,难以快速识别关键攻击模式。本文将展…...
Simics在网络转型与SDN迁移中的核心价值与应用
1. Simics在网络转型与SDN迁移中的核心价值解析网络架构正经历从传统硬件设备向软件定义网络(SDN)和网络功能虚拟化(NFV)的深刻变革。这场变革的核心挑战在于:如何在保持网络高性能的同时,实现控制平面与数据平面的解耦,以及如何将传统网络功…...
基于SpringBoot的门禁与访客管理系统毕业设计
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot框架的门禁与访客管理系统以解决传统门禁系统在智能化管理方面存在的局限性。当前多数门禁系统仍采用封闭式架构设计导致数据…...
数据清洗实战:解锁混乱数据,构建高效企业集成管道
1. 项目概述与核心价值 最近在和一些做企业级应用集成的朋友聊天,发现一个挺有意思的痛点:很多系统在对接时,数据格式五花八门,尤其是那些历史包袱重的老系统,传过来的数据经常是“拧巴”着的。比如,一个本…...
基于Circuit Playground Express与3D打印的机械心脏制作指南
1. 项目概述:一个会“呼吸”的机械心脏如果你对创客、STEAM教育或者互动艺术装置感兴趣,那么亲手制作一个能模拟真实心跳、并且心率可以手动调节的解剖心脏模型,绝对是一个能让你成就感爆棚的项目。这不仅仅是一个静态的展示品,它…...
资源管理器约束设计:从核心原理到YARN/K8s实战配置
1. 项目概述:理解资源管理器约束的核心价值在任何一个复杂的计算或资源管理系统中,资源管理器(Resource Manager, 简称RM)都扮演着“交通警察”或“调度中心”的角色。它的核心职责是公平、高效地分配有限的系统资源&a…...
全栈代码资源聚合库:开发者如何高效利用开源代码示例提升工程能力
1. 项目概述:一个面向开发者的全栈代码资源聚合库最近在GitHub上看到一个挺有意思的项目,叫wuwangzhang1216/claude-code-source-all-in-one。光看这个名字,你大概能猜到这是个什么——没错,这是一个围绕“代码”和“源代码”做文…...
御坂翻译器:5分钟快速上手,让Galgame翻译不再困扰你
御坂翻译器:5分钟快速上手,让Galgame翻译不再困扰你 【免费下载链接】MisakaTranslator 御坂翻译器—Galgame/文字游戏/漫画多语种实时机翻工具 项目地址: https://gitcode.com/gh_mirrors/mi/MisakaTranslator 你是否曾因语言障碍而错过精彩的Ga…...
