MAX30102 血氧调试笔记

2023-05-16

一、血氧测量原理

1.1 PPG波形介绍

血氧饱和度(英语:Oxygen saturation),或称血氧浓度,是指血中氧饱和血红蛋白相对于总血红蛋白(不饱和+饱和)的比例。人体需要并调节血液中的氧气非常精确和特定的平衡。 人体的正常动脉血氧饱和度为95-100%。 如果该水平低于90%,则被认为是低氧血症。

血氧的测量主要分为透射式和反射式。目前的主流是透射式。但是两者原理差不多,都是使用发光二极管(红光RED,红外IR,绿光GREEN和蓝光BLUE等)照射被测部位,然后使用一个光电二极管接收透射/反射的光线,将光信号转换为电信号。然后通过高精度的ADC测量反射回的电流大小,评估血液中的含氧量。

图1 典型PPG 波形

上图是一个典型的PPG波形,即光电二极管接收到原始的光信号波形。波形(由图中间的白色横虚线)可分为两部分:DC signal 和 AC signal,即直流信号和交流信号。

其中直流信号由下到上可分为以下三部分的反射:组织(issue),静脉血(Venous blood)和不跳动的动脉血(Non pulsatile arterial blood)。当然对于不同年龄、性别和肤色等人不同,对应的DC signal 值也会不同。所以后面的血氧计算都是使用相对值。

而 AC signal 交流信号就比较单一:由跳动的动脉血反射得到。其中波峰对应心脏的收缩(Systole),波谷对应心脏舒张(Diastole)。

1.2 心率计算(HR)

通过计算AC signal 两个波峰的时间(图中两条竖着的黑色虚线),我们就能计算出心率,这里不再赘述。至于选择哪个通道的数据(红光或红外),其实都是可以的,一般是使用信号较好的那个通道(通常为红外)。

1.3 灌注指数(PI)

临床上,交流分量与直流分量的幅值之比反映了人体的血流灌注能力,称为血流灌注指数(Perfusion Index,PI)。一般情况下灌注度越高,表明信号质量越好。其表达式为:

PI = AC/DC * 100%

1.4 血氧计算(SpO2)

血压计算公式也比较简单,这里MAX30102是一路红光,一路红外。只分别算出红光的交流除以红光的直流即: ACred/DCred,和红外的交流除以红外的直流分量即:ACired/DCired。然后两者再相除得到R。

得到 R 然后查表即可得到血氧值,也可以通过下面美信拟合的公式计算:

SpO2 = -45.060*R*R + 30.354 *R + 94.845

二、MAX30102传感器原理

由上面的原理我们简化为:将RED/IR 光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号,再经过AD转换成数字信号。简化过程:光--> 电 --> 数字信号。所以我们需要控制光源LED的电流强度和采样率,光敏传感器的ADC精度(xbit)等。

图2 MAX30102 系统框图

三、MAX30102寄存器配置

3.1 初始化配置

在一般的配置中我们让设备开机直接开始进入SpO2/HR 模式就好(PROX_INT_EN 置 0),设置两个LED的电流都为0x40,然后开启 RDY 中断使能。这样每次数据采集ok就可以中断一次去处理数据。

// 主要寄存器配置参数
MAX30102_Write_Byte(MODE_CONFIG, 0X40);         //RESET FIRST

am_util_delay_ms(20);
MAX30102_Write_Byte(INTERRUPT_ENABLE1, 0xC0);   // A_FULL_EN, PPG_RDY_EN set to 1.
MAX30102_Write_Byte(INTERRUPT_ENABLE2, 0x02);   //TEMP RDY EN 0x02
MAX30102_Write_Byte(FIFO_WR_PTR, 0x00);         //recommend to clear first     
MAX30102_Write_Byte(OVERFLOW_COUNTER, 0x00);    //recommend to clear first     
MAX30102_Write_Byte(FIFO_RE_PTR, 0x00);         //recommend to clear first     

MAX30102_Write_Byte(FIFO_CONFIG, 0x0f);         //sample avg = 1, fifo rollover=false, fifo almost full = 17    
MAX30102_Write_Byte(MODE_CONFIG, 0x03);         //SpO2 mode. RED and IR
MAX30102_Write_Byte(SPO2_CONFIG, 0x2B);         // SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit     
MAX30102_Write_Byte(DIE_TEMP_CONFIG, 0x01);     //TEMP_EN set 1.

MAX30102_Write_Byte(LED1_PULSE_AMP,  0X40);     //Choose value for ~ 13mA for LED1(red)
MAX30102_Write_Byte(LED2_PULSE_AMP,  0X40);     //Choose value for ~ 13mA for LED2(ir)

MAX30102_Read_Byte(INTERRUPT_STATUS1);          //clear int flag first.不然可能无法进中断
MAX30102_Read_Byte(INTERRUPT_STATUS2);

3.2 FIFO读取数据

MAX30102 FIFO 的深度为32,每个buf是6个字节(两通道数据,每通道3字节)。我么可以开启 PPG_RDY_EN,这样就能每来一个新的数据,就会中断一次通知我们去取数据。读FIFO_DATA 就会自动清掉中断标志位。

图3 FIFO 寄存器

FIFO相关的寄存器有4个。虽然是显示均可读写(R/W),但是实际上只有 FIFO Read Pointer可以写(应用在读数据出错,往回重读一次的情况)。其他 FIFO 寄存器均为只读。

  • FIFO Write Pointer:好理解,就是写指针寄存器。保存下一个新数据在 FIFO 中的写地址。每次来一个数据,这个写指针会自动移动一位。
  • Over Flow Counter: 如果32个FIFO深度满了,就会在这里增加1,表示溢出。
  • FIFO Read Pointer:FIFO读指针,始终指向下一个待读取的FIFO地址。如果数据读取后,读地址也会自动增加。
  • FIFO Data Register: 可以简单的理解为 *FIFO_RD_PTR,始终指向下一个数据。

I2C寄存器映射中的FIFO_DATA寄存器指向要从FIFO读取的下一个样本。 FIFO_RD_PTR指向此样本。所以虽然通过连续读 FIFO_DATA 不会使该寄存器自增,但是 FIFO_DATA 寄存器实际是映射到FIFO_RD_PTR,而FIFO_RD_PTR 寄存器始终指向下一个待读取的数据,所以对FIFO_DATA 连续读,是能够实现的。读 FIFO 函数如下:

/*****************************************************************************************
* Function Name: MAX30102_Read_FIFO_Data
* Description  : 通过硬件I2C,读取FIFO中的数据RED, IR.
* Arguments	   : *data:两路电流值大小
* Return Value : none
******************************************************************************************/
void MAX30102_Read_FIFO_Data(uint32_t *data)
{
    uint8_t tmp[6];
    
    MAX30102_Read_Len(FIFO_DATA, tmp, 6);
    data[0] = ((tmp[0]<<16 | tmp[1]<<8 | tmp[2]) & 0x03ffff);
    data[1] = ((tmp[3]<<16 | tmp[4]<<8 | tmp[5]) & 0x03ffff);

    //am_util_stdio_printf("%d, %d\n", data[0], data[1]);
}

3.3 采样率和精度设置

简单的说想要更高的ADC精度(位数),就得提高脉宽(增加ADC的采样时间)。但是脉宽又会受限制于采样率,如果采样率太高,这个每个周期的时间短可能太短,就不足以满足高采样率的脉宽要求。所以具体的设置参考下表:

图4 脉宽示意图

图5 两种模式各自允许设置采样率表

由上表可知,如果我们在SpO2模式想要ADC的精度为 18bits,脉宽只能为400us,且采样率最高只能到400Hz。两个LED的点亮时序如下图所示:

图6 两路LED的开启时序

四、接近检测功能(Proximity Mode)

通过以上的配置我们已经可以实现两路(红光和红外)PPG的采集。但是为了优化设备的体验,我们期望当手指离开传感器后,能够自动关闭LED,待手指插入后能自动开启继续采集。这样可以做到省电且减少红外的释放,所以我们需要能够自动的调节血氧传感器的开启和停止。而这个的实现就依赖于「接近检测功能」。

「接近检测功能」可以由硬件(传感器本身的Proximity Mode功能)或者软件(应用程序控制LED电流)两种方法实现。基本原理都一样:就是当 红外/红灯 的接收光线低于某一阀值后(表示手指离开),我们就将红灯熄灭,同时降低红外电流且降低采样率,这样达到不漏光且省电的效果。这个时候红外工作在低采样率阶段,如果这时有手指接入,如果达到启动阀值,则重新开始正常的采样,恢复采样率和红光/红外电流。

4.1 硬件实现(不推荐)

实际测试发现,MAX30102其接近功能只能使用红光去做接近检测,所以就算手指拔出进入「接近模式」也会有红色的光发散出来,影响体验所以不推荐。但还是简要的说明其操作步骤:

  1. 先将 MODE 设置为「SpO2/HR 模式」;
  2. 将 PROX_INT_EN 置为 1;(必须的!相当于使能硬件的Proximity Mode功能。置0则不会进入接近模式,直接数据采集);
  3. 设置手指离开后,传感器进入「接近模式」后的红色LED电流大小:PILOT_PA ;
  4. 设置手指插入后,传感器恢复「SpO2/HR 模式」的阀值:PROX_INT_THRESH;

图7 两个工作模式的转换

主要寄存器配置如下:

MAX30102_Write_Byte(MODE_CONFIG, 0X40);         //RESET FIRST

am_util_delay_ms(20);
MAX30102_Write_Byte(INTERRUPT_ENABLE1, 0xD0);   // A_FULL_EN, PPG_RDY_EN, PROX_INT_EN set to 1.
MAX30102_Write_Byte(INTERRUPT_ENABLE2, 0x02);   //TEMP RDY EN 0x02
MAX30102_Write_Byte(FIFO_WR_PTR, 0x00);         //recommend to clear first     
MAX30102_Write_Byte(OVERFLOW_COUNTER, 0x00);    //recommend to clear first     
MAX30102_Write_Byte(FIFO_RE_PTR, 0x00);         //recommend to clear first     

MAX30102_Write_Byte(FIFO_CONFIG, 0x0f);         //sample avg = 1, fifo rollover=false, fifo almost full = 17    
MAX30102_Write_Byte(MODE_CONFIG, 0x03);         //SpO2 mode. RED and IR
MAX30102_Write_Byte(SPO2_CONFIG, 0x2B);         //SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit     
MAX30102_Write_Byte(DIE_TEMP_CONFIG, 0x01);     //TEMP_EN set 1.

MAX30102_Write_Byte(LED1_PULSE_AMP,  0X40);     //Choose value for ~ 13mA for LED1(red)
MAX30102_Write_Byte(LED2_PULSE_AMP,  0X40);     //Choose value for ~ 13mA for LED2(ir)
MAX30102_Write_Byte(PILOT_PA, 0x01);            //Choose value for ~ 0.2mA for Pilot LED (IR)
MAX30102_Write_Byte(PROX_INT_THRESH, 0x01);     //唤醒血氧LED的阀值

MAX30102_Read_Byte(INTERRUPT_STATUS1);          //clear int flag first.不然可能无法进中断
MAX30102_Read_Byte(INTERRUPT_STATUS2);

上述配置后,由于 PROX_INT_EN 已经置1,所以设备开机即进入「接近模式」。可以看到红色灯微微亮起(此时红外没有工作),此时红灯电流大小就是我们 PILOT_PA 寄存器设置的值。如果此时有手指插入,使红色接收管大于 PROX_INT_THRESH 设置的值,那么就会进入 「SpO2/HR 模式」,开始正常采集。

开始正常采集后,就算手指离开探头也不会自动进入「接近模式」,想要进入需要我们手动的再次写 MODE 寄存器:MAX30102_Write_Byte(MODE_CONFIG, 0x03); 至于何时写 MODE 寄存器,需要应用程序通过用户设置的阀值去判断。

4.2 软件实现(推荐)

如果使用软件实现接近检测,我们就可以使用红外灯去做接近检测,这样肉眼就看不到红外光,更合理。

主要思路是:我们初始化时只点亮红外灯,关闭红灯(驱动电流设为0)。然后在 Data DRDY 的中断里,根据自己设定的红外阀值去需要此时是否有手指插入。如果超过阀值就设置两个 LED 的为正常采样率、电流大小;如果再次低于阀值则关闭红灯,降低红外的采样率和电流降低功耗。

步骤:1. Initial Setting – SW proximity mode

开机后,先关闭红灯,红外灯5ms电流,调低采样率,等待手指插入。

// 主要寄存器配置
//寄存器地址 设置参数
0x0C 0x00 //RED LED: 0mA
0x0D 0x19 //IR LED: 5mA
0x0A 0x43 //SPO2 CONFIGURATION 
          //SPO2_ADC_RGE : 8uA (this is a good starting point, try other settings in order to fine tune your design), 
          //SPO2_SR : 50HZ, LED_PW : 400us
0x08 0x00 //FIFO CONFIG
0x11 0x12 //Multi-LED 1
0x12 0x00 //Multi-LED 2
0x04 0x00 //FIFO RESET
0x05 0x00 //FIFO RESET
0x06 0x00 //FIFO RESET
0x09 0x07 //Mode Configuration : Multi-LED Mode
0x02 0x40 //PPG RDY Interrupt Enable
current mode = proximity

2.在 DRDY IRQ Handler的中断里面去判断手指拔出与否,如果有手指则进入正常的采集模式,开启红灯,恢复高采样率。

// 主要寄存器配置(中断伪代码)
// Read 6 bytes from FIFO(first 3bytes : IR, next 3bytes : RED)
if ( IR Count > 2000 and current mode == proximity ) {  // 进入正常采集模式
    0x0C 0x? //RED LED: desired LED current for RED
    0x0D 0x? //IR LED: desired LED current for IR
    0x0A 0x4E //SPO2 CONFIGURATION SPO2_ADC_RGE : 8uA, SPO2_SR : 400HZ, LED_PW : 400us
    0x08 0x40 //FIFO CONFIG : SMP_AVG : 4 Samples : 100 Hz ODR
    current mode = HRM_SPO2
} 
else if ( IR Count < 5000 and current mode == HRM_SPO2 ) {  // 进入接近模式(待手指插入)
    0x0C 0x00 //RED LED: 0mA
    0x0D 0x19 //IR LED: 5mA
    0x0A 0x43 //SPO2 CONFIGURATION SPO2_ADC_RGE : 8uA, SPO2_SR : 50HZ, LED_PW : 400us
    0x04 0x00 //FIFO RESET
    0x05 0x00 //FIFO RESET
    0x06 0x00 //FIFO RESET
    0x08 0x00 //FIFO CONFIG
    current mode = proximity
}

需要注意,程序中 2000 和 5000 这两个阀值需要根据实际的情况去设置。

4.3 最终效果

两路PPG实时波形效果(蓝色曲线为红光,白色线为红外):可以看出放入手指后,由于有反射,接收到的电流显著增大。

图8 对比手指插入后ppg的变化

图9 两路PPG细节(白色-红外,绿色-红光)

参考资料

[1] Proximity mode

[2] Pulse oximetry: Understanding its basic principles facilitates appreciation of its limitations

[3] GUIDELINES FOR SPO2 MEASUREMENT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MAX30102 血氧调试笔记 的相关文章

  • linux创建和删除crontab定时任务

    一 添加sheel脚本 1 首先创建一个执行程序 xff1a vim a sh 2 编辑 xff1a xff01 bin bash python3 python py gt gt test2 log 2 gt amp 1 3 添加权限 xf
  • sphinx文档生成脚手架工具安装和使用

    1 sphinx的安装与使用 1 1 安装sphinx sphinx官方安装说明 xff1a Installing Sphinx Sphinx documentation readthedoc官方说明 xff1a Getting Start
  • geth客户端安装

    geth是以太坊的官方客户端 xff0c 它是一个命令行工具 xff0c 提供很多命令和选项 xff0c 可以运行以太坊节点 创建和管理账户 发送交易 挖矿 部署智能合约等 下面介绍geth的三种安装方法 xff1a 直接下载可执行文件 在
  • win系统下,利用goland来build生成geth.exe可执行文件

    golang环境搭建 具体安装方法就不再赘述 xff0c 但是以太坊对golang的版本有要求 xff0c 得1 7及以上 xff0c 推荐1 9 3 go ethereum代码下载 可以直接访问https github com ether
  • 删除容器命令

    删除容器使用 docker rm 命令 1 删除容器 1 首先需要停止所有的容器 docker stop docker ps a q 2 删除所有的容器 只删除单个时把后面的变量改为container id即可 docker rm dock
  • 正则 (?:)

    X 在正 则中表示所匹配的子组X不作为结果输出 正常情况 X 中的X会被作为新增的一个组序号输出 xff0c 比如 A B xff0c A的序号1 B的序号2 如果 A B xff0c A将没有序号不输出 B的序号为1 规范化url xff
  • 用maven-replacer插件选择正则表达式替换

    在前端html或者jsp中会引入一些诸如css js等静态资源 xff0c 但是有时候浏览器会有缓存 xff0c 更新js后 xff0c 返现一些用户看到的仍然是旧的 xff0c 说明没有生效 这样的话一般是在引入静态资源的时候添加时间戳
  • 【LeetCode股票买卖系列:123. 买卖股票的最佳时机 III 暴力递归=>记忆化搜索=>动态规划】

    x1f680 算法题 x1f680 x1f332 算法刷题专栏 面试必备算法 面试高频算法 x1f340 x1f332 越难的东西 越要努力坚持 xff0c 因为它具有很高的价值 xff0c 算法就是这样 x1f332 作者简介 xff1a
  • [模版]线段树

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 判断是否属于同一子网

    include lt bits stdc 43 43 h gt using namespace std int main char a 10 b1 10 b2 10 while scanf 34 s s s 34 a b1 b2 61 EO
  • 单点登录之cas6.5安装部署

    目录 一 准备工作二 安装 jdk11三 安装gradle三 安装tomcat四 下载cas并编译五 部署六 访问 一 准备工作 需要的包 xff1a jdk11 tomcat9 GRADLE7 2 cas overlay template
  • 单点登录之cas集成禅道

    目录 一 前言二 添加应用 xff0c 开启免密登录三 请求格式 一 前言 禅道11 5 1版本开始 xff0c 增加了第三方应用免密登录禅道的功能 xff0c 可以利用此功能实现单点登录 二 添加应用 xff0c 开启免密登录 三 请求格
  • Oracle ora-12514报错解决方法

    目录 一 问题描述二 解决方法 一 问题描述 Oracle 报错 ora 12514 二 解决方法 修改 tnsnames ora xff0c 一般在 D oracle product 10 2 0 client 1 NETWORK ADM
  • “你需要来自XXX的权限才能对此文件夹进行更改”的解决方法

    目录 一 问题描述二 解决方法1 方法1 xff1a 鼠标右键文件夹 xff0c 选择 属性 gt 安全 选项卡 xff0c 对用户进行授权2 方法2 xff1a 选择 高级 xff0c 更改所有者 xff0c 并添加至权限条目3 方法3
  • windows10获取超级管理员权限

    目录 一 新建文本文件 xff0c 命名为带 reg后缀的文件 xff0c 添加以下内容二 鼠标双击运行三 鼠标右键要获取权限的文件夹 xff0c 选择 获取超级管理员权限 一 新建文本文件 xff0c 命名为带 reg后缀的文件 xff0
  • python2.7安装

    目录 一 下载二 安装三 设置环境变量四 验证 一 下载 1 通过 python 官网 https www python org 找到 2 7 版本进行下载 xff1a https www python org downloads rele

随机推荐

  • sharding报错no table route info

    目录 一 问题描述二 解决方法 一 问题描述 集成 sharding 执行数据库操作报错 xff1a no table route info 二 解决方法 一般为分库分表策略配置错误 xff0c 请检查 application yml 文件
  • Nginx配置http跳转https

    目录 一 return 301二 rewrite三 497 状态码四 meta 刷新 Nginx 可通过多种方式实现 http 跳转 https xff0c 以下列出各种方式的实现方法 一 return 301 这是 Nginx 新版本的写
  • OpenFlow网络、OpenFlow交换机及OpenFlow协议的知识总结

    目录 OpenFlow起源与发展 OpenFlow网络 1 OpenFlow交换机 xff1a 2 FlowVisor xff1a 3 Controller xff1a OpenFlow交换机 分类 安全通道 流表 OpenFlow协议 x
  • 【高效运维】Jenkins之uni-app自动化部署

    目录 一 前言二 使用 Pipeline 创建任务1 创建一个流水线任务2 配置流水线 xff08 1 xff09 配置构建触发器 xff08 2 xff09 配置流水线 xff08 Pipeline script from SCM xff
  • Windows下安装Redis7.0.8

    目录 一 下载二 解压三 启动服务四 客户端连接测试五 把 redis 安装到服务1 安装2 启动服务3 停止服务4 卸载服务 一 下载 官网上没有 windows 版本的 redis 下载 xff0c 需要到 github 下载 xff1
  • 若依微服务版之集成Mybatis-Plus和Lombok

    目录 一 修改根目录 pom xml二 修改 ruoyi common core 的 pom xml三 去掉 nacos 配置文件中的 mybatis 配置 xff0c 添加 mybatis plus 配置四 添加配置类并注入五 注入类六
  • Windows下安装JDK

    目录 一 下载二 安装三 设置环境变量1 新增环境变量 JAVA HOME2 新增环境变量 CLASS PATH3 环境变量 PATH 添加变量值 四 验证 一 下载 下载链接 xff1a https www oracle com java
  • CentOS7下安装superset

    目录 一 前言二 安装 Miniconda1 下载2 安装3 加载环境变量配置文件4 取消激活 base 环境 三 创建 Python3 9 环境1 配置 conda 国内镜像2 创建 superset 环境并指定 Python3 93 激
  • Java--a++与 ++a 与 a=a+1 与a+=1

    a 43 43 等效 a 61 a 43 1 43 43 a 等效 a 43 61 1 计算顺序的区别 xff1a a 43 43 是先参加程序的运行再 43 1 xff0c 而 43 43 a则是先 43 1再参加程序的运行 举例 xff
  • 数据仓库系列文章二:浅谈企业数据仓库总线矩阵

    Kinball在 数据仓库工具箱 一书中 xff0c 详细阐述维度建模思想 xff0c 并给出维度建模的众多实践 维度建模的核心内容和建设过程在实践中已经被大家所熟知 xff0c 网上教程也很多 xff0c 本文不做赘述 本文重点谈一谈企业
  • Java中 List、Set、Map 之间的区别

    小博此篇记录了开发过程中常用的几种集合详解 xff0c 三者的区别对比均从IDEA相关层次图里面所得知 xff0c 基于JDK8 xff0c 如有错误欢迎批评指正 List 列表 List的元素以线性方式存储 xff0c 可以存放重复对象
  • DuiLib介绍及其消息处理剖析

    DirectUI技术 DirectUI意为直接在父窗口上绘图 Paint on parent dc directly 即子窗口不以窗口句柄的形式创建 windowless xff0c 只是逻辑上的窗口 xff0c 绘制在父窗口之上 微软的
  • xargs命令

    原作者地址 xff1a https www cnblogs com chyingp p linux command xargs html 感谢原作者 Linux基础 xff1a xargs命令 简介 xargs可以将输入内容 xff08 通
  • 为何HBase速度很快?

    为何HBase速度很快 xff1f HBase能提供实时计算服务主要原因是由其架构和底层的数据结构决定的 xff0c 即由LSM Tree Log Structured Merge Tree 43 HTable region分区 43 Ca
  • VirtualBox虚拟机不能ping通宿主机的解决方法

    解决VirtualBox虚拟机不能ping通宿主机的问题 问题描述 在VirtualBox虚拟中 xff0c 无法ping通宿主机 xff0c 宿主机可以ping通虚拟机 虚拟机的网络已经设置为 桥接网卡 xff0c 也可以正常上网 问题原
  • CMake 使用方法 & CMakeList.txt

    cmake 简介 CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 43 43 特性 类似UNIX下的automak
  • Hadoop安装目录

    root software hadoop 2 6 0 cdh5 15 1 etc hadoop 第一步骤 vi core site xml lt configuration gt lt property gt lt name gt fs d
  • 前端之浏览器

    你会不会和我一样 xff0c 开发了N年 xff0c 真要讲起浏览器 xff0c 发现自己一无所知 常用那几种浏览器测试 xff1f IE Safari Chrome Mozilla Firefox Opera 主流浏览器的内核有哪些 xf
  • Navicat远程连接Linux环境下MySQL(错误error:1045/1251/2003(10038)/2059)解决方案

    Navicat远程连接Linux环境下MySQL 错误error 1045 1251 2003 10038 2059 解决方案 心路历程 因为之后要学习有关数据库开发的课程 xff0c 我们需要部署云服务器并添加mysql功能 xff0c
  • MAX30102 血氧调试笔记

    一 血氧测量原理 1 1 PPG波形介绍 血氧饱和度 xff08 英语 xff1a Oxygen saturation xff09 xff0c 或称血氧浓度 xff0c 是指血中氧饱和血红蛋白相对于总血红蛋白 xff08 不饱和 43 饱和