亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

从 KY-039 到心率

组件和用品

Arduino UNO
× 1
KY-039 心跳传感器
× 1
跳线(通用)
× 1

关于这个项目

在 Arduino 的 37 个传感器组中 ,有一个心跳传感器。这个名字承诺太多了。人们倾向于认为它通过 I2C 或类似的东西提供了一个数字,一个数字就是心跳率。传感器提供的只是一个从 0 到 1023 的“模拟”值,告诉光传感器接收到多少红外线,或者实际上有多少东西遮挡了光传感器 .数值越高,红外线越少。

简而言之:将手指放在 IR LED 和传感器的光晶体管之间。您的心跳会扩张手指中的血管,从而过滤红外线。这会产生脉动信号。

在这个项目中,我描述了这个信号是如何转换成心跳频率的,比如 66 BPM(每分钟心跳次数)。

简单的步骤

如果您只是读取并绘制来自 KY-039 传感器的值,您会得到如下结果:

这些值是整数值。不是很准确。而是计算一堆它们的平均值并绘制平均值。你得到这个:

在这里你已经可以看到心脏的脉搏了。获取脉冲每次显着上升之间的时间差。从中您可以计算出 BPM 中的心率。

(上图中的小锯齿形图案是人造光造成的,50 Hz,另一个必须处理的事情。)

步骤说明

这是一些简单的代码,用于输出您从 KY-039 传感器读取的任何内容:

// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop(){ while(1) { Serial.print(analogRead(sensorPin)); Serial.print('\n'); }}  

你可能得到的是这样的:

由于这是串行监视器窗口以 9600 波特读取来自 Arduino 的串行输出的标题,因此整个过程由 Serial.print() 计时 函数,它将设置读取和绘制值的速率。无论如何,曲线非常参差不齐,因为它在 360 和 383 之间变化并且只有整数值。

平滑

要获得更平滑的输出,请取传感器最后 20 个读数的平均值。这是我如何做到的。我定义了一个常数,告诉我想要多少读数:

#define samp_siz 20 

然后我有一个保存该读数数量的数组:

int 读取[samp_siz];  

对于每个新读数,我从总和中减去最旧的读数,然后将最新读数添加到总和中。在数组中,我用最新的读数替换了最旧的读数。

 reader =analogRead (sensorPin); // 读取传感器总和 -=read[ptr]; // 从 sum sum +=reader 中减去最早的读数; // 将最新读数添加到总和中 read[ptr] =reader; // 在数组中保存最新读数 last =float(sum) / samp_siz; // 现在计算平均值 ptr++; // 更新数组的索引,有 ptr %=samp_siz; // 需要时从 0 重新启动 

串行监视器中的数组大小为 20,波特率为 9600,我可能会得到这样的绘图:

在这里,您看到的实际心跳是一条陡峭的上升曲线。但是您还会看到一个小的锯齿形图案。较小的锯齿形来自我的厨房灯,三个 LED 灯泡照亮了房间。我家的电源是 240 伏、50 赫兹的交流电。所以每秒 50 次,光强度增加,显然也在红外波段。我想消除 50 Hz 的噪音。如果我在 20 毫秒期间从传感器读取值并取所有值的平均值,它应该可以工作。让我们看看...

 n =0;开始=毫秒();读者 =0.;做{阅读器+=模拟阅读(sensorPin); // 读取并添加值... n++;现在 =毫秒(); } while (now  

使用这个片段,我以 20 毫秒的块获取传感器读数,这将消除人造光引起的 50 Hz 闪烁。如果您居住在 60 Hz 的国家/地区,请改用 16.67 ms 块。或 16667µs。

因为我已经在 20 ms 部分平滑了曲线,我实际上并不需要我之前使用的数组,但是因为它在那里并且很容易调整大小,所以我把它留在那里。使用大小为 5 的数组似乎可以消除最后一个烦人的噪音。这就是我现在所拥有的:

我需要做的最后一件事是识别重复模式中的任何部分。由于上升的斜率更规律,我就这样做了。请注意所有图形中的 y 轴值有何不同。我真的不能仅仅依靠绝对值。我只能依靠曲线的上升和下降。数学家会谈论导数。如果我找到 n,我就很满意 连续上升的值,其中 n 可能是一个方便的可调值。我从 5 开始。为此我有 rise_threshold 代码中定义的常量。当我发现 5 个连续上升的值时,我知道我处于上升曲线的底部。我花时间。我等待下降曲线,然后等待接下来的 5 个上升值并记录时间。然后我打印相应的BPM。

我做了一个测试 计数 如何 很多 连续 上升 价值观 那里 曲线 找到 那里 之间 10 15. 所以 如果 计数 5、 大多数 确定 知道 找到 开始 心跳。

由于我只在每次心跳后打印,所以不会有太多打印。将有更多时间来读取传感器。我可能会捕捉到更多高频噪音,但我看不到,因为绘图仪没有打开。让我们看看它是如何工作的。

最终代码

#define samp_siz 4#definerise_threshold 5// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop(){ float reading[samp_siz], sum;现在长整数,ptr;最后浮动,读者,开始;浮动第一,第二,第三,之前,print_value;布尔上升;整数上升_计数;国际n; long int last_beat; for (int i =0; i  before) {rise_count++; if (!rising &&rise_count>rise_threshold) { // 好的,我们检测到了上升曲线,这意味着心跳。 // 记录自上次心跳以来的时间,跟踪前两次 // 时间(第一次,第二次,第三次)以获得加权平均值。 // 上升标志阻止我们检测到相同的上升 // 超过一次。上升 =真;第一个 =毫秒() - last_beat; last_beat =毫秒(); // 根据最后三个心跳计算心跳率的加权平均值 print_value =60000./(0.4 * first + 0.3 * second + 0.3 *third); Serial.print(print_value); Serial.print('\n');第三 =第二;第二=第一; } } else { // 好的,曲线正在下降上升 =false;上升计数=0; } 之前 =最后; ptr++; ptr %=samp_siz; }}  

它工作得很好。这是一个视频。

请注意,Arduino 上的微型 RX LED 灯与我的心脏同步闪烁。仅仅是因为当有心跳时,会计算出速率并将其打印到串行,从而使 LED 闪烁。当手指稍微移动时,就会出现读数错误。

进一步发展

现在打印率是根据最后三个节拍计算的。但基于 15 秒的周期来计算它可能更合适。我可以保存 15 个连续的速率值,计算平均值,然后忽略离平均值最远的五个值并计算新的平均值。这几乎可以提供可靠且稳定的心率测量值。

我只在我妻子和我身上测试过传感器。我根据之前的读数所做的增强信号的每一步。其他人可能有另一种心跳,导致不同形状的曲线,这需要另一种方法来找到节拍。也许是下降曲线更容易识别。或者最顶级的。如果脉搏为 180 - 200 BPM,会发生什么?寻找上升曲线可能更棘手。

代码

  • 最终版本
最终版本C/C++
程序读取心跳并在串口窗口打印速率。
#define samp_siz 4#definerise_threshold 4// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ 浮点数 [samp_siz], sum;现在长整数,ptr;最后浮动,读者,开始;浮动第一,第二,第三,之前,print_value;布尔上升;整数上升_计数;国际n; long int last_beat; for (int i =0; i  before) {rise_count++; if (!rising &&rise_count>rise_threshold) { // 好的,我们检测到了上升曲线,这意味着心跳。 // 记录自上次心跳以来的时间,跟踪前两次 // 时间(第一次,第二次,第三次)以获得加权平均值。 // 上升标志可防止我们多次检测到相同的上升。上升 =真;第一个 =毫秒() - last_beat; last_beat =毫秒(); // 根据最后三个心跳计算心跳率的加权平均值 print_value =60000./(0.4 * first + 0.3 * second + 0.3 *third); Serial.print(print_value); Serial.print('\n');第三 =第二;第二=第一; } } else { // 好的,曲线正在下降上升 =false;上升计数=0; } 之前 =最后; ptr++; ptr %=samp_siz; }} 

示意图


制造工艺

  1. 颜色传感器 – 工作和应用
  2. OPT3007 超薄环境光传感器
  3. 环境光传感器的工作和应用
  4. 光学传感器基础知识和应用
  5. 使用 InitialState
  6. Raspberry Pi 温度和光传感器
  7. 太阳能车道灯到 MSP430 无线传感器节点
  8. 使用 Raspberry Pi 和 Twilio 的支持语音和 SMS 的光传感器
  9. Windows 10 IoT Core – 读取心率脉冲
  10. Raspberry Pi 光传感器:简单的 LDR 教程
  11. 数字光传感器
  12. 远程心率监测器