成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

轻松脉冲率传感器项目

这是ppg或photopletysmograph 项目 - 或使用红外反射光的脉冲率传感器。是的,我 绝对讨厌那个词(PhotoPlethysmograph),不得不思考如何说 它。但首先,因为这是一个如此荒谬的词,那么这个词是什么意思? 照片添加到前端,从希腊致密麦米斯 (增加,放大),Graphos(写)。所以它是一个灯(照片)音量 增加(致内)写(图)测量。

[资源: http://clas.mq.edu.au/speech/physiology/respiration/etymology/index.html]

PhotoPlethysMography是测量体积变化的方法 由它含有的空气或血液的变化导致的器官,然后 以图形形式绘图。在这种情况下,你正在测量 通过检测反射红外光,从指尖来操作心脏 传感器由于在手指中流动的血液而变化。

PPG电路

从现在开始'LL只是坚持PPG的讨论的其余部分!

该项目使用匹配的一对红外发射器和接收器 组件(光电晶体管和LED)以产生可用的有用PPG信号 使用opamp放大。然后使用微控制器转换输出 ADC并由微控制器处理,以提供心率读数 beats-per-minute.

警告: 这个项目不是为了 medical use.

始发信号是项目中最关键的部分,并获得 良好的信号需要使用最合适的传感器(匹配的红外对) 在反射模式下。您可以在彼此旁边安排传感器(反射 IR检测到的IR)或在手指上的一个(手指下方)(IR的传输 通过手指光)。

该项目中的一对传感器用于反射模式,提供a 有用的输出对来自反射光的变化非常敏感 手指中的血液流动。

事实上,任何标准灯泡都将是如此敏感的输出 触发输出,只需通过在光线和传感器之间挥动手)“ 是为什么专业设备使用光不包括封面来停止虚假 当您需要高灵敏度时触发以获得良好的PPG输出。我做了 一个简单的小纸板盖,粘着胶枪!

KY-039

起初我尝试使用KY-039设备(非常令人沮丧)'s output 太低了,无法获得有用的操作;你需要10000的收益,甚至是那么 你必须保持非常静止的允许信号只能高于噪音! (那是它,如果它正确地定位 - 真的只是运气)。

使用和匹配对,特别是那些旨在发射和发射的对 接收红外线允许远远较大的信号不受噪声 它只需要100个谦虚的标称增益100.基本上不要使用 KY-039 and don'浪费任何时间。

脉冲率传感器:红外线TX,RX对

对于该项目,使用匹配的一对发射器409和接收器309:

SHF409 - 发射器IF(MAX)100mA和VF 1.3V,输出:950nm

SFH309 - 接收器IC = 15mA(浪涌75mA,VCE 35V,输入范围:380〜1180nm, 最大灵敏度860nm.

注意:您可以使用任何类似的匹配对IR Tx和Rx二极管和二极管 晶体管,但请注意,SHF409发射器能够处理最大值 连续电流为100mA(即使它处于一个非常小的包装)和 标准远程IR TX二极管不能够进行该电流水平。如果你 使用不同的IR发射器,然后更改电流限制电阻以停止 吹起来!即检查设备的数据表。

警告: 这些设备发出高度集中的无形 对人眼有害的光。所以覆盖设备并没有 把它们靠近你的眼睛。

脉冲率传感器软件操作

脉冲率传感器软件的目标是检测峰值和 记录10秒内的峰值数(在软件中可更改)和 然后在每分钟节拍的心率下工作。检测峰需要 关于进入信号的假设,因为正常ppg具有许多槽和 不得不忽视的山谷。

一种方法是使用移动的平均滤波器完全平滑 信号以便处理减少数据即,将所有令人不安的人平滑 噪音波动。这略有无聊,因为有趣的是看到更多 实际信号(具有有趣的信号过渡)所以在这个项目中 微控制器的输出完好无损即,原始ADC输出是 用过的。代替平滑,算法用于忽略部分 信号在整个地方波动。

下面的曲线使用Arduino IDE的串行监视器(Opdebug是 在代码中定义)显示软件中的变量:RAWVALUE(PPG - 蓝色),MAX_PEAK(最大峰值PPG信号 - 红色)和AVG(平均 - 黄色 - 左侧显示了平均值的测量期的开始 高 - 后来沉降到“平均”信号电平):

典型的 脉冲率传感器PPG输出(蓝色)检测脉冲(红线)和平均值 (yellow)

心率传感器PPG波形平均和峰值

该算法已找到最大峰值(由红线指示 信号的顶部)并将此结果存储在软件(递增) 变量num_peaks)。请注意MAX_PEAK值的顶部是如何保持一段时间 (定义dly_ignore设置),其显示其余算法忽略 设置毫秒的输入信号(在本例中为130ms) - a 程序的单独部分包含峰值(max_peak变量)常数 虽然这次过去(但这不是严格的必要而是允许 延迟可视化)。在此之后,最大峰值值衰减 允许算法找到下一个峰值,即使它不如的那么高 前一个即,对于不稳定的脉冲或当信号不那么大 您将手指移动到传感器等。

脉冲率传感器检测PPG信号

如果存在真实的ppg信号信号之间的差异'max_peak' and 'avg'变量提供信号抑制方法。在软件中的话 差异低于60个ADC值,如定义Quote_Threshold(带5V PSU这是292mV)然后,信号被认为是噪音,因此 忽略了。在上面的图像中,您可以看到我们的信号峰值 对(蓝色)感兴趣,高于平均水平(黄色)。

该软件有效地忽略了噪声阈值水平以下的任何内容 即,输出PPG信号时,信号在170到185之间变化(ADC 值)因此被忽略了。

脉冲率传感器检测峰值

可靠地检测信号峰需要几个计算的变量 处理传入信号:

  • Ravalue - 当前ADC阅读。
  • UP - 1如果我们正在向上遍历信号,而且为0进行 down.
  • RAW_TOT-测量期内的所有样本。
  • RAW_NUM - 测量期内的样本数。
  • Avg., (from raw_tot and raw_num) – the average ADC reading (over the measurement period).
  • max_peak.- Max ADC value in the measurement period (decayed down slowly).
  • 阈值 - Max-Peak少于Max_Peak的1/8。

软件算法的简单思想是平均输入传入 ADC样本并将此值与峰值进行比较。如果是进入的ADC 样品超过一定阈值,峰值平均值高于a 噪声阈值然后假设这是一个心跳脉冲。

脉冲率传感器示例代码

注意:单击下面的框中的任何文本将复制整个批次 the clipboard.

// Copyright John Main
#include <Wire.h>

#define sensorPin A0
#define buzzerPin 11
#define ledPin 13

// Coment out one of the following,
//#define opText  // For serial monitor
#define opDebug // For serial plotter

#define MEASURE_TIME 10000
#define NOISE_THRESHOLD 60
#define DLY_IGNORE 130
#define PSEP Serial.print(" ")

在 t period = 0, cline = 0;
在 t num_peaks,max_peak,avg_peak;
unsigned long time_was,ctimer;
unsigned long peak_time;
unsigned long raw_tot,raw_num;
unsigned long threshold;

void setup() {

  pinMode(ledPin, OUTPUT); // Inbuilt LED

  Serial.begin(9600);
  Serial.println("Heart Rate Monitor");
  Serial.print(MEASURE_TIME/1000);
  Serial.println("sec update...");

  tone(11,1000,50);
  tone(11,500,150);
  peak_time = time_was = millis();
  num_peaks = 0;

  threshold = 0;
  raw_tot = raw_num = 0;
  ctimer = millis();
}

void loop() {
   static 在 t up=1;
   unsigned long ms;
   在 t period=0;
   在 t Avg. = 0; // temp var.
   在 t rawValue = analogRead (sensorPin);

   raw_tot += rawValue;
   raw_num++;
   Avg. = raw_tot/raw_num;

   // Decay max peak to allow change to lower peak values.
   // debug plot (millis()-peak_time) - not algo. shows delay on plot = straight line.
   if ( (millis()-peak_time)>DLY_IGNORE ) max_peak.--;

   // Capture max peak.
   if (rawValue>max_peak  ) max_peak. = rawValue;

   // Set the threshold 1/8th below the max peak.
   threshold = (max_peak-(max_peak>>4));

#ifdef opDebug
   // Raw outputs for serial plotter
   Serial.print(rawValue);   PSEP;
   Serial.print(avg);        PSEP;
   Serial.print(max_peak);   PSEP;
   Serial.print(threshold);

   Serial.println("");
#else
   delay(15);
#endif

#ifdef opText
   if ((millis()-ctimer)>1000) { // Confidence timer
      ctimer=millis();
      Serial.print(",");
      cline++;
      if (cline%61==0) Serial.println(); // Line wrap
   }
#endif

   // Value must be > minimum,
   // and bigger than a fraction below the max measured peak,
   // and not found within x ms of the last peak (100ms :max 300bpm).
   //
   if (up==1 && threshold > Avg. &&
               rawValue > threshold &&
               rawValue-avg > NOISE_THRESHOLD &&
               ((millis()-peak_time)>DLY_IGNORE)
                ) {
      ms = millis();
      peak_time = ms;
      up = 0;

      // Check n second timeout after a peak
      period = (ms-time_was);
      if (period>MEASURE_TIME) { // Output and restart if > n secs period finished.

#ifdef opText
         Serial.println();
         Serial.print(MEASURE_TIME/1000);
         Serial.print(" sec: ");
         Serial.print(period);
         Serial.print(" n: ");
         Serial.print(num_peaks);
         Serial.print(" peak: ");
         Serial.print(max_peak);
         Serial.print(" num peaks ");
         Serial.print(num_peaks);

         // Since this is not an interrupt driven timer, nominal n sec period will be larger than 5000 ms.
         // so work out beats in period for 1min
         Serial.print(" BPM ");
         Serial.println(num_peaks * (60000/(float)period));
#else
         delay(8);
#endif

         time_was = ms;
         num_peaks = 0;
         max_peak. = 0;
         Avg. = 0;
         cline = 0; // Don't need newline as output is generated.

         raw_tot=raw_num=0;
      }

      // Indicators
      digitalWrite(ledPin,1);
      tone(11,500,30);
      digitalWrite(ledPin,0);

      num_peaks++;

   } else if (up==0 && rawValue<threshold)  up = 1;
}





脉冲率传感器代码操作

在主循环中,操作序列如下:

获得ADC样本:RAPVALUE

更新RAW_TOT和RAW_NUM并计算AVG。

如果上次找到峰值以来的时间大于dly_ignore那么 decay max_peak.

如果ADC值大于电流,则捕获新的MAX_PEAK值 rawValue.

完成阈值(max_peak减去1/8)。

如果定义了Opdebug,则打印值。

如果定义了Optex,则打印置信度输出。

如果我们找到了一个峰值,那就锻炼了。

阈值大于平均信号 and...

Ravalue大于阈值 and...

RAVALUE和平均值之间的差异是 >噪音水平和......

我们不在忽略信号期间。

如果上面是真的,请询问问题:

测量期结束了吗?

如果是,则显示BPM。和重置期 测量变量。

如果这不是峰值,则检查遍历ADC值:

通过检查

我们发现一个峰值 - 峰值设置为0时 检测计算和

而且RAVVALUE下降低于阈值 (绝对下降)。

如果上面是真的,那么最多可以找到1来找到 next peak signal

脉冲率传感器硬件

脉冲率传感器硬件包括匹配的红外发射器 和接收器对和交流配置的开放式放大器。使用的opmamp是一个 较旧的芯片。一个更现代化的芯片可以将铁路转到铁路,但CA3140只能进入 大约2.6V为5V电源。如果你不'T有一个CA3140使用更现代化的opamp (我有一些这些旧设备并刚刚使用该类型)。一个更好的选择 将是MCP601,因为这具有更高的规格,并且是轨到铁路 输出虽然该项目不严格要求轨到轨输出 运作。你确实确保数据表指出的是 设备可以在单个电源上操作。0至5V。

但请注意,更高的规格。 opamp也不会改善电路 很多,随着所涉及的频率非常低,增益滚动是 由滤波器值(1uf,470k,100k)主导。噪音表现是 虽然改善了。

事实上你不'T需要轨到轨运行(由于电路操作 只是没有那个)。不使用完整的ADC范围,但电路 使用ADC范围的¼到½之间的有用输出提供足够的范围 取决于输入信号I.E.您的手指如何位于 sensor.

注意:您可以在参考电压中为Arduino馈送以允许完整 ADC范围在2.6V(对ADC代码的一些调整)上 给出更精细的分辨率。然而,电路最重要的方面是 首先获得良好的信号,这取决于IR匹配 pair.

PPG AC放大电路

注意:另外 在Arduino Uno引脚11和GND中连接压电扬声器。

脉冲率传感器D.C. AC Opamp的偏置

电阻器R3和R4设置了D.C.偏向5.0的opamp的水平 *(100.0 /(100.0 + 470))= 0.877V,将输入信号电平提高到零 伏特。该偏置不放大(自A.C.仅自动放大器配置 允许更改电流通过)因此此级别直接传递到 output.

注意:这也是为什么可以忽略opamp的VOS参数。

这主要是为了定位在串行中查看的PPG信号 绘图仪。如果您回顾PPG绘图和黄线(平均值), 这也是平均的D.C.水平,它的值约为180个ADC计数 这是:(5/1024.0)* 180 = 0.878V。

你可以忘记这个d.c.水平(但它看起来好多了 输出)。 R3和R4的不平衡值的其他原因是 CA3140的输出只能高达2.6V,因此D.C.级别也是如此 保持信号撞击顶部电压。

如果您使用了铁路到铁路opamp,则更有可能制作设计 使用相同的R3和R4将D.C.水平设置为电源中点。

脉冲率传感器高通角频率:C1,R3,R4

IR接收器的输出被送入1UF电容器,然后送到1UF电容器中 水平设定分压器R3和R4(参见上面的偏置级别)。这个 电容器和两个并联两个电阻,形成高通RC滤波器 角频率:

1.0 /(2 * 3.14159 * 82E3 * 1E-6)= 1.94Hz。

高于此的频率被放大,下面它们降低。

这对于PPG来说有点高(真的需要0.15Hz - 检查专业人士 精确频率范围的规格 - 但你需要更大的 电容器或较小的电阻器)。然而,所选的角频率给出了良好 enough results.

脉冲率传感器A.c。耦合电容:C4 R6

A.c。放大器使用A.C.耦合电容值10UF(C4)。高的 频率信号通过但低频A.C。被封锁了 向D.C.的方式该电容值越高,拐角越低 向上放大信号的频率。

这是A.c中的问题。放大器作为所涉及的频率是 非常低,所以您需要一个大耦合电容来让所需的信号通过 通过即低角频率。在这种情况下,这不是一个真正的动作 你想要的放大器;您希望在较低频率但电容器处获得增益 在较低频率下将其降低,以便较低频率的角频率 必须降低(通过增加R或C)。

解决方案是使该电容大。然后提供一个角落 频率(R6和C4):

1.0 /(2 * 3.14159 * 1E3 * 10E-6)= 15.91 Hz

在其下方放大了此频率之上的频率,它们减小。 它并不足够低的角频率,但它允许信号是 无论如何都看起来很好。

脉冲率传感器额外的噪音去除C3,R5

电解质,与所有电容一样,都不理想,所以C3提供额外的 通过在高频下降低增益(C3和R5)来平滑。角落 frequency is:

1.0 /(2 * 3.14159 * 1000E3 * 100E-9)= 1.59Hz

由于增益降低,​​在此频率降低(部分平滑 输出信号=好)。

脉冲率传感器零件列表

物品 部分 描述 ids.
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1u

100n

10u

SFH409

SFH309

A0

100

10k

470k

100k

1M

1k

CA3140

arduino. Uno.

压电圆盘

陶瓷电容器>6V

电容器

电解电容器

发光二极管

光检测二极管

输出引脚

电阻器

电阻器

电阻器

电阻器

电阻器

电阻器

运算放大器

微控制器板

压电

C1

C2 C3

C4

D1

D2

OP1

R1

R2

R3

R4

R5

R6

U1

木板

SPK1

注意:C1 - 这不得是电解质 - 它必须是非极化 即没有极性。

脉冲率传感器限制和改进

脉冲率传感器算法在它站立时提供了简单的和 有趣的BPM结果和波形输出,但使用中断。而不是 代码绕过循环检查10000 ms是否已通过,如果它具有它 将使用已通过的实际时间计算BPM,这将是 大于10000毫秒(取决于输出的调试数据量)。自从此以来 时间是最佳的,测量仍然足够好以显示 正确的速率。由于它超过10秒测量,BPM值将变化 略微但大致准确。

你可以平均换几读数,以便更稳定的阅读 当然需要更多时间。另一种方法是测量峰值 高峰时间并显示BPM值 - 这也需要平均 输出(读数会随时间变化),但会提供输出 instantaneous output

新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部