PulseSensor心率传感器详解(STM32)

news2024/9/26 5:18:42

目录

一、介绍

二、传感器原理

1.接线图

2.引脚描述

3.工作原理:光电容积法原理

4.工作原理:心率采样数据处理算法

三、程序设计

main.c文件

adcx.h文件

adc.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        PulseSensor传感器是一种基于光学原理的心率传感器,可以通过测量心脏跳动时的血液流动情况来检测心率。它由一个LED和一个光敏元件组成,LED发出的光线透过皮肤照射到血液中,光敏元件接收反射回来的光线,然后将光信号转换为电信号,从而测量出心率。

以下是土壤湿度传感器的参数:

供电电压 

DC:3.3~5V

检测信号类型

光反射信号(PPG)

输出信号类型

模拟信号

LED峰值波长

515nm(绿光)

信号放大倍数

330

输出信号范围

0~VCC

电流大小

~4ma

 

哔哩哔哩视频

PulseSensor心率传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.接线图

         传感器只有三个引脚,分别为信号输出 S 脚 、电源正极 VCC 以及电源负极 GND,供电电压为 3.3V - 5V,可通过杜邦线与开发板连接。上电后, 传感器会不断从 S 脚输出采集到的电压模拟值。

2.引脚描述

引脚名称

描述

S

脉搏信号输出

+

5V(3.3V)电源输入

-

GND

3.工作原理:光电容积法原理

        光电容积法的基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏测量的。光源一般采用对动脉血有选择性的特定波长的发光二极管(515nm的绿光)。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透过光率发生改变,此时由光电变换器接收人体组织反射的光线,转变为电信号并将其放大和输出。由于脉搏是随心脏的搏动而周期性变化的信号,动脉血管容积也周期性变化,因此光电变换器的电信号变化周期就是脉搏率。

4.工作原理:心率采样数据处理算法

        测量相邻两次脉搏的时间间隔,再用一分钟除以这个间隔得出心率。

IBI: 相邻两次脉搏的时间间隔(单位:ms),BPM:心率,一分钟内的心跳次数且:BPM = 60 / IBI。我们的最终目的就是要求出 IBI 的值,并通过 IBI 计算出实时心率。其核心操作在于识别一个脉搏信号

①选取阈值

首先动态计算出参考阈值,然后用用阈值对信号判定、识别一个波峰

② 计算特征点

选取信号上升到振幅的一半作为特征点,我们可以捕获这个特征点作为一个有效脉搏的标志,然后计算 IBI

三、程序设计

1.使用STM32F103C8T6读取PulseSensor心率传感器采集的数据

2.将读取得到的温湿度数据同时在OLED上显示

PulseSensor

PA0

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "adcx.h"
#include "timer.h"

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	PulseSensor心率传感器实验                     
 * 版本			: V1.0
 * 日期			: 2024.8.19
 * MCU			:	STM32F103C8T6
 * 接口			:	参看ADCX.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

extern _Bool Timer_Flag ;			//时间到 标准位
extern _Bool update_flag;			//更新标志变量

//要写入到STM32 FLASH的字符串数组
u8 TEXT_Buffer[]={"0000000"};
#define SIZE sizeof(TEXT_Buffer)	 	//数组长度
//#define FLASH_SAVE_ADDR  0X08020000 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
#define FLASH_SAVE_ADDR  0X0800f400 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)


int main(void)
{ 
	unsigned char p[16]=" ";
	u8 datatemp[SIZE];	
	_Bool Heart_OK = 0;				//读取到正确心率标志位
	unsigned char Heart = 0;		//心率值
	
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级
	
	USART1_Config();//串口初始化
	
	OLED_Init();
	printf("Start \n");
	delay_ms(1000);
	//显示“血氧:”
	OLED_ShowChinese(0,0,0,16,1);
	OLED_ShowChinese(16,0,1,16,1);
	OLED_ShowChar(32,0,':',16,1);
	
	ADCx_Init();
	TIM3_Int_Init(1999,71);			//定时2ms中断
	TIM2_Int_Init(199,7199);		//10Khz的计数频率,计数到500为20ms 
	

//  while (1)
//  {
//		LED_Toggle();

//		printf("光照强度: %d\r\n",light);
//		
//		OLED_ShowNum(80,0,light,3,16,1);

//		delay_ms(500);
//  }

 	while(1)
	{	
		if(Timer_Flag==1)					//500ms到 读取数据
		{
			Timer_Flag = 0;					//清除标志
			TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断		
			delay_ms(500);
			TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断

			TIM_Cmd(TIM2, ENABLE);  		//使能TIMx	
			if (QS == true)					//读取到了心率信号
			{			
				QS = false; 				//清除标志 等待下一次读取
				if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)		//读取到的值再正常心率区间 40-160内
				{
					Heart_OK = 1;			//标志位置一
					Heart = BPM;			//心率传递给Heart
				}
				else
				{
					Heart_OK = 0;			//标志位清零
					Heart = 0;				//设置为0
				}	
			}
		}
	
		delay_ms(20);	

		if(Heart_OK==1)								//读取到正确心率
		{
			OLED_ShowNum(40,0,Heart,3,16,1);
		}
		else
		{
			OLED_ShowString(32,0,":---r/min",16,1);
		}

	}	
}


adcx.h文件

#ifndef _ADCX_H_
#define _ADCX_H_
#include "stm32f10x.h"                  // Device header

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	PulseSensor心率传感器实验                     
 * 版本			: V1.0
 * 日期			: 2024.8.19
 * MCU			:	STM32F103C8T6
 * 接口			:	参看ADCX.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

// ADC 编号选择
// 可以是 ADC1/2/3
#define    ADCx                          ADC1
#define    ADC_CLK                       RCC_APB2Periph_ADC1

#define		PulseSensor_GPIO_CLK							RCC_APB2Periph_GPIOA
#define 	PulseSensor_GPIO_PORT							GPIOA
#define 	PulseSensor_GPIO_PIN							GPIO_Pin_0

void ADCx_Init(void);
u16  Get_Adc(u8 ch); 
u16  Get_Adc_Average(u8 ch,u8 times); 
 
#endif

adc.c文件

#include "adcx.h"
#include "delay.h"
		   
/*****************辰哥单片机设计******************
											STM32
 * 项目			:	PulseSensor心率传感器实验                     
 * 版本			: V1.0
 * 日期			: 2024.8.19
 * MCU			:	STM32F103C8T6
 * 接口			:	参看ADCX.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/
			 
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3																	   
void  ADCx_Init(void)
{ 	
	ADC_InitTypeDef   ADC_InitStructure;
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(PulseSensor_GPIO_CLK|ADC_CLK,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	//PA0
	GPIO_InitStructure.GPIO_Pin=PulseSensor_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_Init(PulseSensor_GPIO_PORT,& GPIO_InitStructure);
	
	ADC_DeInit(ADCx);
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADCx和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	      //模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	  //转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;//选择TIM3作为外部触发源
	ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;                	//ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	                              //顺序进行规则转换的ADC通道的数目
	ADC_Init(ADCx, &ADC_InitStructure);	
	
	ADC_ExternalTrigConvCmd(ADCx,ENABLE);//采用外部触发
	ADC_RegularChannelConfig(ADCx, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);//adc转换时间21us
	ADC_Cmd(ADCx, ENABLE);
	
	ADC_ResetCalibration(ADCx);									//复位校准
	while(ADC_GetResetCalibrationStatus(ADCx));	//等待校准结束,校准结束状态为RESET
	ADC_StartCalibration(ADCx);									//AD校准
	while(ADC_GetCalibrationStatus(ADCx));			//等待校准结束	

}				  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADCx, ch, 1, ADC_SampleTime_239Cycles5 );	//ADCx,ADC通道,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADCx, ENABLE);		//使能指定的ADCx的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADCx);	//返回最近一次ADCx规则组的转换结果
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 	 

四、实验效果 

五、资料获取

项目分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.1 溪降技术:峡谷等级规划

Content 4.1 溪降技术&#xff1a;峡谷等级规划概述观看视频课程电子书&#xff1a;峡谷等级评定FFME&#xff08;法国&#xff09;系统FFME等级评定系统 - 工作原理垂直特征或“V”等级水特征或“A”等级难度/持续时间 ACA&#xff08;美国&#xff09;等级评定系统ACA等级评定…

啊!FLUX 模型爆火,电商人爱死!好用快冲!

今天&#xff0c;我来分享一批FLUX模型搭配使用的LORA&#xff0c;可能有些朋友不太了解FLUX模型&#xff0c;这里也做快速做个简要介绍&#xff1a;FLUX模型是在2024年8月1日发布的。这款模型出自Black Forest Labs之手&#xff0c;其团队正是Stable Diffusion的原班人马&…

PCI Express 体系结构导读摘录(三)

系列文章目录 PCI Express 体系结构导读摘录&#xff08;一&#xff09; PCI Express 体系结构导读摘录&#xff08;二&#xff09; PCI Express 体系结构导读摘录&#xff08;三&#xff09; 文章目录 系列文章目录第 6 章  PCIe 总线的事务层6. 1  TLP 的格式6. 1. 1 通用 …

【运维自动化-作业平台】如何快速执行脚本和分发文件

脚本执行和文件分发是作业平台最基本、最核心的两个原子功能&#xff0c;主要分页面快速执行和作业里步骤引用&#xff0c;使用逻辑一样&#xff0c;一起来看看具体如何使用快速执行脚本 核心实现原理就是基于gse的命令管道&#xff0c;把脚本内容以WebPortal的方式透传到目标…

基于yolov8的口罩佩戴检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的口罩佩戴检测系统是一款利用深度学习技术&#xff0c;特别是YOLOv8算法&#xff0c;实现高效、准确检测人脸是否佩戴口罩的系统。YOLOv8作为YOLO系列算法的最新版本&#xff0c;在检测速度和准确性上进行了显著优化&#xff0c;能够实时处理图像和视…

UDP协议程序设计

文章目录 前言一、UDP程序设计是什么&#xff1f;二、使用步骤 1.数据包套接字与多播套接字2.数据报包3.实操展示总结 前言 UDP协议程序相对于TCP协议&#xff0c;就是一个广播喇叭给全村人听和两个人说悄悄话的差别。因此UDP的数据传输效率比TCP高&#xff0c;可以同时分享给所…

《Windows PE》3.1 基本概念

在正式讲解PE文件格式之前&#xff0c;我们有必要先熟悉和PE相关的一些基本概念&#xff0c;以便于更好的理解和掌握PE文件格式。 本节必须掌握的知识点&#xff1a; 地址 指针 数据目录项 节 对齐方式 字符串编码格式 3.1.1 地址 ■在PE文件中涉及到四类地址 ●VA虚拟内存地…

【Linux】Shell 与权限:Linux 系统的双重保障

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;Shell 与权限&#xff1a;Linux 系统的双重保障 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 …

三、搭建网站服务器超详细步骤——FinalShell下载安装使用流程(免费国产的SSH工具)+宝塔安装方法(分享两种安装宝塔的方法)

前言 本篇博客是搭建网站服务器模块下的第3部分 FinalShell下载安装使用流程 在分享这篇博客之前&#xff0c;首先讲一下&#xff0c;FinalShell软件是干什么用的&#xff0c;用大白话进行说明一下&#xff1a;这个软件是一款远程控制和管理服务器的软件&#xff0c;通过S…

C++字符串与整数的相互转换

文章目录 前言字符串转整数stoiisstringstreamatoi 字符转整数to_stringstringstreamsprintf ASCII码转换 前言 题目大致为&#xff1a; 给一组数据&#xff0c;去掉里面的2&#xff0c;然后再返回结果 例如&#xff1a; 输入&#xff1a;{20, 66, 521, 2024} 输出&#xff1…

手机如何切换网络IP地址:‌方法详解与操作指南‌

在当今的数字化时代&#xff0c;‌网络IP地址作为设备在网络中的唯一标识&#xff0c;‌扮演着至关重要的角色。‌对于手机用户而言&#xff0c;‌了解如何切换网络IP地址不仅有助于提升网络体验&#xff0c;‌还能在一定程度上保护个人隐私。‌本文将详细介绍手机切换网络IP地…

仿论坛项目--Kafka,构建TB级异步消息系统

阻塞队列 • BlockingQueue 解决线程通信的问题。阻塞方法&#xff1a;put、take。 • 生产者消费者模式生产者&#xff1a;产生数据的线程。消费者&#xff1a;使用数据的线程。 • 实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue、SynchronousQueue、D…

火语言RPA流程组件介绍--浏览器设置

&#x1f6a9;【组件功能】&#xff1a;浏览器设置&#xff0c;实例化对象&#xff0c;并执行是否显示图片/是否显示浏览器窗体等操作 配置预览 配置说明 操作浏览器类型 内置浏览器 外部浏览器 浏览器位置 本机安装的chrome浏览器可执行文件的路径(选择外部浏览器时必填)…

9月出海风向标:越南国庆节、巴西独立日、游戏外部开发大会、东京电玩节来袭!

9月如期而至&#xff0c;各位出海人准备好迎接新一轮增长机会了吗&#xff1f;以下是9月全球热门节日、行业大会活动信息&#xff1a; 01. 越南国庆节 越南国庆日&#xff0c;也称为“Quốc khnh nước CHXHCN Việt Nam”&#xff0c;是每年的9月2日&#xff0c;这一天标志着…

MySQL Workbench 的入门指南

前言 MySQL Workbench 是一个官方的图形化工具&#xff0c;用于开发、管理和设计 MySQL 数据库服务器。它提供了丰富的功能&#xff0c;可以帮助数据库管理员、开发者以及DBA们高效地工作。下面是一个MySQL Workbench的入门指南&#xff0c;介绍如何安装和使用它。 安装 MyS…

FP7209:非同步升压恒流LED区动IC

前言&#xff1a;LED驱动芯片是什么&#xff1f; LED驱动器&#xff08;LED Driver&#xff09;&#xff0c;是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定&#xff0c;它能适应的电源电压和电流变动范围十分狭窄&#xff0c;稍许偏离…

恋爱相亲交友系统源码原生源码可二次开发APP 小程序 H5,web全适配

直播互动&#xff1a;平台设有专门的直播间&#xff0c;允许房间主人与其他异性用户通过视频连线的方式进行一对一互动。语音视频交流&#xff1a;异性用户可以发起语音或视频通话&#xff0c;以增进了解和交流。群组聊天&#xff1a;用户能够创建群聊&#xff0c;邀请自己关注…

用亚马逊云科技Graviton高性能/低耗能处理器构建AI向量数据库(下篇)

简介&#xff1a; 今天小李哥将介绍亚马逊推出的云平台4代高性能计算处理器Gravition&#xff0c;并利用该处理器构建生成式AI向量数据库。利用向量数据库&#xff0c;我们可以开发和构建多样化的生成式AI应用&#xff0c;如RAG知识库&#xff0c;特定领域知识的聊天机器人等。…

Unity中使用四元数限制旋转

前言 在处理旋转相关的内容的时候&#xff0c;如果使用unity提供的欧拉角描述旋转&#xff0c;会出现一下两种问题 同一旋转的表示不唯一万向节死锁 绕轴90旋转与绕轴90&#xff0b;360旋转的表现是一致的 当某个特定轴达到某个特殊值时&#xff0c;绕一个轴旋转可能会覆盖另一…