极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: eagler8

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

[复制链接]
 楼主| 发表于 2019-9-3 14:35:03 | 显示全部楼层

模块有两个发光二极管,一个光检测器,优化光学和低噪声的仿真信号处理,以检测脉搏血氧饱和度和心脏速率信号。
1、只需要将手指头紧贴在传感器上,就能估计 脉搏血氧饱和度(SpO2)及脉搏(相当于心跳)。
2、携带氧气的红血球能吸收较多红外光(850-1000nm),未携带氧气的红血球则是吸收较多的红光(600-750nm)。
3、因此pulse oximeter就是一个迷你的分光计,利用不同红血球之吸收光谱的原理,来分析血氧饱和度。
4、这种实时而快速的测量方式,也广泛被运用在许多临床的参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 14:45:15 | 显示全部楼层
模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 14:49:18 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 14:50:53 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 14:52:55 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 14:55:42 | 显示全部楼层

经过多方寻找,从一个研究MAX30102算法的程序中找到了一个经过亲自验证有效的实际血氧标定计算公式:

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

其中的R可以通过红光和红外光光强的对数值计算得到,这个标定表达式实际上是对血氧饱和度的二次曲线拟合,是经过测量得到的。最后终于可以输出血氧饱和度数据了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 15:03:59 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 15:06:07 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 15:08:23 | 显示全部楼层
应用
辅助健身设备
智能电话
平板电脑
可穿戴设备

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 15:11:24 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 15:37:44 | 显示全部楼层
与Pulse sensor这种传感器(具体见系列实验之95)相比,MAX30102的有点在于:
1.集成度高:MAX30102将两个发光LED、光电检测二极管、ADC、环境光抑制电路和光学机械外壳都集成在了一起,形成了一个完整模块。这样的优势就是体积小、能耗小、外界干扰小,易于集成系统。
2.数字输出:MAX30102本身自带18位高精度ADC,使用I2C接口与外接MCU通信。而且自身还有FIFO,可以减轻MCU负担,降低功耗。
3.功能丰富:MAX30102集成了LED驱动电路,可以根据不同情况调节LED电流,采样率也可以根据不同应用进行选择。此外还集成了片上温度传感器,可以随时监测片上温度(对血氧饱和度计算有用)。
       正是有以上一些优点,现在的模拟集成前端(AFE)都走向了集成化、小型化、数字化的方向,模拟电路的门槛越来越低了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 18:09:39 | 显示全部楼层
MAX30102的发光部分包括两个LED,一个是红光LED(660nm),另一个是红外光LED(880nm),这个是测量血氧饱和度SPO2最常见的配置。接收部分是一个对可见光和红外光都敏感的光电二极管,其接收的光强度信号转换为电流信号,经过环境光消除电路后,最后被自带的18位ADC进行采样转化,至此模拟部分完成。AD转化后的数字经过数字滤波后储存在数据寄存器中,最后可通过I2C总线被外接MCU读取。在硬件上,LED的电源和其他部分的电源不是同一个,因为LED为了保证足够的出射光强,需要瞬间大电流(最大50ma),这就要求LED的正向电压足够大(要求3.1V以上)。而其余的AD转换和I2C总线部分,为了实现低功耗要求电压足够小(要求1.8V),所以传感器需要两路独立的电源。此外,由于LED电源会产生瞬间大电流,所以电源引脚附近要加一个大电容减轻对电源电压的影响。



传统的脉搏测量方法主要有三种:一是从心电信号中提取;二是从测量血压时压力传感器测到的波动来计算脉率;三是光电容积法。前两种方法提取信号都会限制病人的活动,如果长时间使用会增加病人生理和心理上的不舒适感。而光电容积法脉搏测量作为监护测量中最普遍的方法之一,其具有方法简单、佩戴方便、可靠性高等特点。

光电容积法的基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的。其使用的传感器由光源和光电变换器两部分组成,通过绑带或夹子固定在病人的手指、手腕或耳垂上。光源一般采用对动脉血中氧合血红蛋白(HbO2)和去氧血红蛋白(Hb)有选择性的特定波长的发光二极管(一般选用660nm附近的红光和900nm附近的红外光)。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透光率发生改变,此时由光电变换器接收经人体组织反射的光线,转变为电信号并将其放大和输出。由于脉搏是随心脏的搏动而周期性变化的信号,动脉血管容积也呈现周期性变化,因此光电变换器的电信号变化周期就是脉搏率。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 18:25:16 | 显示全部楼层
  1. /*
  2. 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
  3. 实验一百零四: MAX30102血氧仪手腕心率脉搏检测心跳传感器模块
  4. 1、安装库:IDE-工具-管理库-搜索“MAX30105”-安装
  5. 2、项目:串口读取测量数据
  6. 3、连线(I2C):
  7. VIN  → 3.3V
  8. GND  →  GND
  9. SDA  接 A4
  10. SCL  接 A5
  11. */

  12. #include <Wire.h>
  13. #include "MAX30105.h"
  14. #include "heartRate.h"

  15. MAX30105 particleSensor;

  16. const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
  17. byte rates[RATE_SIZE]; //Array of heart rates
  18. byte rateSpot = 0;
  19. long lastBeat = 0; //Time at which the last beat occurred

  20. float beatsPerMinute;
  21. int beatAvg;

  22. void setup()
  23. {
  24.   Serial.begin(115200);
  25.   Serial.println("Initializing...");

  26.   // Initialize sensor
  27.   if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  28.   {
  29.     Serial.println("MAX30105 was not found. Please check wiring/power. ");
  30.     while (1);
  31.   }
  32.   
  33.   Serial.println("Place your index finger on the sensor with steady pressure.");

  34.   particleSensor.setup(); //Configure sensor with default settings
  35.   particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  36.   particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
  37. }

  38. void loop()
  39. {
  40.   long irValue = particleSensor.getIR();

  41.   if (checkForBeat(irValue) == true)
  42.   {
  43.     //We sensed a beat!
  44.     long delta = millis() - lastBeat;
  45.     lastBeat = millis();

  46.     beatsPerMinute = 60 / (delta / 1000.0);

  47.     if (beatsPerMinute < 255 && beatsPerMinute > 20)
  48.     {
  49.       rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
  50.       rateSpot %= RATE_SIZE; //Wrap variable

  51.       //Take average of readings
  52.       beatAvg = 0;
  53.       for (byte x = 0 ; x < RATE_SIZE ; x++)
  54.         beatAvg += rates[x];
  55.       beatAvg /= RATE_SIZE;
  56.     }
  57.   }

  58.   Serial.print("IR=");
  59.   Serial.print(irValue);
  60.   Serial.print(", BPM=");
  61.   Serial.print(beatsPerMinute);
  62.   Serial.print(", Avg BPM=");
  63.   Serial.print(beatAvg);
  64.   Serial.println();
  65.   delay(1000);
  66. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 18:30:22 | 显示全部楼层
Initializing...
Place your index finger on the sensor with steady pressure.
正在初始化…
将食指稳定地放在传感器上。
(初始化后的串口数据-未放上手指)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-3 18:34:18 | 显示全部楼层


放上手指,只有一组数据,比较平稳估计是血氧值,大约95%

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-6-6 06:10 , Processed in 0.057991 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表