指尖心跳,通过手指测量心率波形

  • 心跳传感器
  • 检测原理
  • 传感器贴膜
  • arduino接线
  • arduino程序下载
  • STM32接线
  • STM32程序下载
  • 上位机查看
  • 总结


原文链接:https://www.yourcee.com/newsinfo/2923956.html

心跳传感器

Android 使用摄像头测心率 手按摄像头测心率_物联网

本期介绍的pulsesensor就是一款心率传感器,是通过光电反射的原理检测人体脉搏的,人体血管在随着心跳跳动的时候的透光率不同进行的测量,传感器将光电采集到的信号经过滤波、放大等一系列电路处理之后输出为模拟电压量,我们通过检测模拟量电压的大小就可以处理计算出心率数据!

检测原理

手指贴在传感器上面输出电压模拟量,我们通过单片机实时检测电压的大小并通过串口将处理好的数据输出到电脑上,电脑再对数据进行处理,生成波形,心跳等参数,这个过程看起来有点复杂,又是单片机处理数据又是电脑处理数据的,不要担心官方有提供多种型号单片机的程序(STM32、arduino、51系列),电脑上的数据处理呢也是开源的,所以我们这里是不需要写程序的,只要会下载就行,看到这里是不是突然就松了口气哈哈!

传感器贴膜

Android 使用摄像头测心率 手按摄像头测心率_stm32_02


点击图片购买

新传感器到手我们先不要急着接线,先在正面和背面贴个膜和粘扣,一个防止手指流汗到上面的电子器件上,另一个就是避免手指触摸的静电干扰也方便固定,废话不多说,看两张贴好的图片就会了!
贴之前



Android 使用摄像头测心率 手按摄像头测心率_引脚_03

图1 传感器正面




Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_04

图2 传感器背面


贴膜之后



Android 使用摄像头测心率 手按摄像头测心率_stm32_05

图1 正面贴膜




Android 使用摄像头测心率 手按摄像头测心率_物联网_06

图2 背面粘扣


arduino接线

硬件接线之前我们先介绍一下传感器的引脚,传感器上面有标+,-,S三个引脚丝印,具体对应功能参照下表就好

引脚名称

引脚功能

+

电源正极(3.3V或5V均可)

-

电源负

S

模拟输出引脚

本期先用arduino去处理心率数据,我们先介绍一下和arduino开发板的接线,使用的是arduino的A0端口检测传感器输出的模拟量,其他的引脚就是供电引脚,引脚较少接线比较简单参考下表和下图接线即可

arduino

传感器

5V

+

GND

-

A0

S

Android 使用摄像头测心率 手按摄像头测心率_stm32_07

arduino程序下载

资料里面找下下面文件双击打开即可(arduino软件以及驱动安装百度官网即可,资料很多)

Android 使用摄像头测心率 手按摄像头测心率_Android 使用摄像头测心率_08


选择好开发板和串口

Android 使用摄像头测心率 手按摄像头测心率_stm32_09


点击下载,等待下载完

Android 使用摄像头测心率 手按摄像头测心率_物联网_10


接下来使用不需要使用STM32的可直接跳转到上位机的使用!

STM32接线

我们再看STM32的接线,上面arduino的使用在网上以及产品资料里面都有说明相对来说会比较容易一些,查看资料我们发现STM32的使用只提供了代码并没有文档进行说明如何操作(对了,需要资料可在下方留言邮箱或者私聊),我们这里用STM32F103ZET6的板子就行操作,打开资料,找到下方的32程序的压缩包解压出来

Android 使用摄像头测心率 手按摄像头测心率_引脚_11


解压出来之后找到工程打开,没有安装MDK5的百度找安装教程即可(网上很多)

Android 使用摄像头测心率 手按摄像头测心率_物联网_12


打开之后我们先看到主函数部分,下面贴出主函数代码

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();
  MX_USART2_UART_Init();
  HAL_TIM_Base_Start_IT(&htim3);
  while (1)
  {
    sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data
    if (QS == true)
    {
      sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix
      sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix
      QS = false;                      // reset the Quantified Self flag for next time
    }
    HAL_Delay(20); //delay for 20ms
  }
}

查看上面代码 MX_USART2_UART_Init(); 可以看到STM32处理传感器之后输出的数据是从串口2输出的,STM32F103 UART2对应TX为PA2,RX为PA3,我们确定串口是从这两个引脚输出之后只需要把这两个引脚连接到USB-TTL之后把数据转换到电脑上即可

USB-TTL

STM32系统板

RX

PA2

TX

PA3

打开函数 MX_ADC1_Init(); 贴出函数部分代码

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig;
  
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  HAL_ADC_Init(&hadc1);
  
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

分析上面代码可以看到使用的STM32的ADC1通道0,手册查看ADC管家对照表可以知道ADC1通道0对应的PA0引脚,这个采集就是使用的PA0引脚去采集传感器的信号了,接线参考下表即可

STM32

传感器

3v3

+

GND

-

PA0

S

Android 使用摄像头测心率 手按摄像头测心率_Android 使用摄像头测心率_13

STM32程序下载

接好线之后把供电的数据线、ST-LINK、USB-TTL接到电脑上,然后下载程序进去即可(串口下载和ST-LINK之类都可以),我这里使用ST-LINK下载程序,先在魔术棒里面修改DEVICE为ZE

Android 使用摄像头测心率 手按摄像头测心率_stm32_14


Android 使用摄像头测心率 手按摄像头测心率_物联网_15


DEBUG里面按照下图来配置即可

Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_16


Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_17


Android 使用摄像头测心率 手按摄像头测心率_Android 使用摄像头测心率_18


配置完之后我这里使用的是ST-LINK直接在MDK里面点击下载就行

Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_19


等一会STM32的程序就下载完成了

上位机查看

下载完程序arduino的话直接插到电脑上即可,STM32供好电将之前接好线的USB-TTL插到电脑上,上位机Processing可自行百度下载也可以点击下方链接下载
链接: 点我下载.

下载好之后双击下图所示的打开

Android 使用摄像头测心率 手按摄像头测心率_stm32_20


进入上位机界面后点击文件,点击打开,找到资料中名称为 PulseSensorAmpd_Processing_1dot1 的文件打开

Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_21


Android 使用摄像头测心率 手按摄像头测心率_stm32_22


打开之后先运行一下然后退出来查看串口号

Android 使用摄像头测心率 手按摄像头测心率_自动驾驶_23


在设备管理器里面找到arduino或者STM32对应的端口号,我这里以arduino为例

Android 使用摄像头测心率 手按摄像头测心率_物联网_24

接下来找到下面这部分代码,COM1、COM5、COM6、COM8对应0、1、2、3,COM5对应1,将Serial.list()[0]中括号中的0修改成1即可对应打开COM5

port = new Serial(this, Serial.list()[1], 115200);
 port.clear();  
 port.bufferUntil('\n');

如果前面的步骤没问题打开之后像下面这样把手指放上去就能看到波形,不要绑太紧,压着手指会让心跳测量偏高

Android 使用摄像头测心率 手按摄像头测心率_物联网_25

Android 使用摄像头测心率 手按摄像头测心率_物联网_26