当前位置: 首页 > news >正文

PulseSensor心率传感器详解(STM32)

目录

一、介绍

二、传感器原理

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_0void 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);//PA0GPIO_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转换时间21usADC_Cmd(ADCx, ENABLE);ADC_ResetCalibration(ADCx);									//复位校准while(ADC_GetResetCalibrationStatus(ADCx));	//等待校准结束,校准结束状态为RESETADC_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;
} 	 

四、实验效果 

五、资料获取

项目分享

相关文章:

PulseSensor心率传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.接线图 2.引脚描述 3.工作原理&#xff1a;光电容积法原理 4.工作原理&#xff1a;心率采样数据处理算法 三、程序设计 main.c文件 adcx.h文件 adc.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 PulseSensor传感器是一种基…...

NISP 一级 | 3.1 网络基础知识

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;Internet 和 TCP/IP 协议 因特网&#xff08;Internet&#xff09;通过 TCP/IP 协议将遍布在全世界各地的计算机互联&#xff0c;从而形成超级计算机网络。因特网为用户提供了非…...

模拟网络丢包常用方法以及工具

文章目录 背景常用方法代码实现使用方法测试代码 使用网络流量控制工具 常用工具Clumsy 背景 在软件开发过程中&#xff0c;经常需要模拟不同的网络环境来测试应用在不同条件下的表现。 这些模拟可以采用多种方式进行&#xff0c;包括在代码中实现随机丢包、随机延时、乱序&am…...

ABC 370 E - Avoid K Partition

原题链接&#xff1a;E - Avoid K Partition 题意&#xff1a;给长度为n的数组&#xff0c;将数组划分成任意份&#xff0c;但是每一份的总和都不能是k&#xff0c;问有多少种分割方法。 思路&#xff1a;dp&#xff0c;f[i]&#xff0c;代表前i个元素满足题意的划分的总和&a…...

C++: set与map容器的介绍与使用

本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…...

单片机-STM32 看门狗(八)

目录 一、看门狗概念 1、定义&#xff1a; 二、单片机中的看门狗 1、功能描述&#xff1a; 2、看门狗设置部分 预分频寄存器(IWDG_PR) 3、窗口看门狗 特性&#xff1a; 4、看门狗配置&#xff1a; 一、看门狗概念 看门狗--定时器&#xff08;不属于基本定时器、通用定…...

iOS 18.1将上线新功能,可惜这波国内的小伙伴无缘了

在科技巨头苹果持续推动其生态系统全球化的进程中&#xff0c;最新的iOS 18.1、iPadOS 18.1及macOS 15.1开发者测试版发布&#xff0c;不仅为开发者们带来了新功能的预览&#xff0c;还悄然间对Apple智能功能的地区限制进行了微妙而重要的调整。 这一变化&#xff0c;虽看似细…...

MySQL中DML操作(二)

默认值处理&#xff08;DEFAULT&#xff09; 在MySQL中可以使用DEFAULT为列设定一个默认值。如果在插入数据时并未指定该列的值&#xff0c;那么MySQL将默认值添加到该列中。 创建表时指定列的默认值 CREATE TABLE 表名(列名 类型 default 默认值......); 示例&#xff1a;…...

LLMs技术 | 整合Ollama实现本地LLMs调用

前言 近两年AIGC发展的非常迅速&#xff0c;从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型&#xff0c;再到后来的小参数模型&#xff0c;从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化&#xff0c;还有模型的使用方式。…...

【C-实践】文件服务器(3.0)

文件服务器1.0文件服务器2.0文件服务器4.0 概述 使用了 tcp epoll 线程池 生产者消费者模型&#xff0c;实现文件服务器 有两个进程&#xff0c;主进程负责接收退出信号用来退出整个程序&#xff1b;子进程负责管理线程池、客户端连接以及线程池的退出 子进程中的主线程生…...

LeetCode 2181.合并零之间的节点

题目描述 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff0c;其值是所有已合并节点的值之和。然后将所有 0 …...

千益畅行,共享旅游卡,引领旅游新潮流

千益畅行旅游卡是一款专为旅游爱好者打造的超值卡片。它就像一把神奇的钥匙&#xff0c;为您打开国内丰富多彩的旅游世界。 我们的旅游卡拥有众多令人惊喜的特点。首先&#xff0c;它涵盖了国内 40 多条精心策划的旅游线路&#xff0c;无论您是向往历史文化名城的厚重底蕴&…...

K均值聚类

根据到给点样本的距离&#xff0c;来聚类。 1.曼哈顿距离、 2.欧几里得距离 直线距离 3.切比雪夫距离 4.闵氏距离 5.余弦相似度 对数据大小/长度等不关注&#xff0c;只关注相似度。 6.汉明距离 二进制距离 二、密度聚类 DBSCAN 前提是样本是根据紧密程度分布的。 先用超参…...

【Ubuntu】安装常用软件包

安装java 直接输入java&#xff0c;如果没有安装的话会提醒你输入命令安装&#xff0c;类似 Command java not found, but can be installed with: sudo apt install jdkxxxxxxxxxxxxxx然后选一个版本安装就好&#xff0c;我这里选的jdk17,安装完确认一下 ubuntuVM-4-13-ubu…...

探索全光网技术 | 全光网产品解决方案整理-(宇洪科技)

探索全光网技术 |全光网产品解决方案整理-宇洪科技 目录 一、数据中心场景1、方案概述2、方案需求3、相关产品4、产品推荐5、方案价值 二、教育场景1、方案概述2、方案需求3、相关产品4、方案价值 三、医疗场景1、方案概述2、方案需求3、相关产品4、方案价值 注&#xff1a;本文…...

资料分析(2)

C B 增长量不变就是1002020 上面是利滚利:按照20%当利息 本题:涨跌幅度的意思就是增长率&#xff0c;本题是按照增长率不变的情况下进行计算D B 7551400X>1.2*100000 B B B 总体增量部分增量之和 先进行计算固定通信业务收入的增长量移动通信业务实现收入的增长量 增长量现期…...

百元以下蓝牙耳机性价比之王品牌?四大高能性价比机型推荐

面对市场上琳琅满目的蓝牙耳机品牌和型号&#xff0c;消费者往往难以抉择&#xff0c;特别是当预算限定在百元以下时&#xff0c;找到一款既满足基本功能又具备一定品质的蓝牙耳机变得尤其困难&#xff0c;那么百元以下蓝牙耳机性价比之王品牌&#xff1f;尽管价格是一个重要的…...

考场考生行为检测数据集 7000张 带标注 voc yolo

数据集名称&#xff1a; 考场考生行为检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;7000张标注类型&#xff1a;行为检测&#xff08;例如&#xff1a;作弊、玩手机、睡觉等&#xff09;格式兼容性&#xff1a;支持VOC和YOLO标注格式 数据集内容&#xff1a; 该…...

深度学习算法,该如何深入,举例说明

深度学习算法的深入学习可以从理论和实践两个方面进行。理论上&#xff0c;深入理解深度学习需要掌握数学基础&#xff08;如线性代数、概率论、微积分&#xff09;、机器学习基础和深度学习框架原理。实践上&#xff0c;可以通过实现和优化深度学习模型来提升技能。 理论深入…...

舵机的原理及应用

舵机是一种位置(角度)伺服的驱动器&#xff0c;主要由外壳、电机、减速齿轮组、位置传感器和控制电路等部分组成。一、工作原理 舵机的工作原理是控制电路接收信号源的控制信号&#xff0c;并将其转换为电流信号&#xff0c;驱动电机转动。电机通过减速齿轮组带动输出轴…...

Nacos与Eureka--微服务注册中心

Nacos与Eureka Nacos和Eureka都是微服务架构中常用的服务发现和注册中心解决方案&#xff0c;它们帮助微服务架构中的各个服务实例进行互相发现和通信。 Nacos 是由阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它支持服务的注册与发现&#xff0c;并且提供了配…...

Android 调试桥——ADB

文章目录 前言ADB 的主要功能设备连接与管理应用安装与卸载文件传输日志查看设备重启 常用命令连接方式有线无线注意点 前言 ADB&#xff08;Android Debug Bridge&#xff0c;安卓调试桥&#xff09;是 Android SDK 提供的一种命令行工具&#xff0c;用于在开发者的计算机和 …...

闲鱼放弃成为淘宝复刻版了吗?上线学生专属交易交流版块“学生鱼”频道

闲鱼是阿里巴巴旗下闲置用品交易平台&#xff0c;目前拥有超5亿用户规模、4000万日活&#xff0c;在去年被阿里定位为第一批战略创新业务&#xff0c;更是肩负“造血”的重任。闲鱼并未明确表示放弃成为淘宝&#xff0c;但近期确实上线了一个针对学生群体的专属交易交流版块——…...

【学习笔记11】如何找到twitter中自己的cookie?

步骤 在浏览器中打开twitter网站&#xff0c;按下CtrlShiftI(i)按下面步骤以此点击 参考 如何找到自己的Facebook XS Cookie和X/Twitter Auth_Token? 一張圖秒懂...

新办建筑智能化专项乙级设计资质,郑州企业需要达到哪些要求?

新办建筑智能化专项乙级设计资质&#xff0c;郑州企业需要达到以下要求&#xff1a; 一、企业基本条件 法人资格&#xff1a; 申请企业必须具有独立法人资格&#xff0c;能够在郑州地区合法经营。注册资本&#xff1a; 企业的注册资本需达到规定标准&#xff0c;通常要求不低于…...

项目管理:项目执行过程中的控制点——基线

项目进度基线详细记录了项目各项活动的计划开始时间、计划结束时间&#xff0c;是项目团队在执行和监控项目进度时的重要参考标准&#xff0c;使得项目执行过程中的任何偏差都能被及时发现和纠正。 基线在项目执行中的作用 1、监控与对比&#xff1a;基线为项目管理者提供了…...

NVIDIA驱动学习

lspci | grep -i vga 输出&#xff1a; 2d:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1) 99:00.0 VGA compatible controller: NVIDIA Corporation Device 2230 (rev a1) import torch print(torch.version.cuda) # 应该显示 CUDA 版本 print(to…...

小小GCD、LCM拿下拿下

目录 最大公约数&#xff08;GCD&#xff09; 最大公约数&#xff08;GCD&#xff09;求解&#xff1a; 一、辗转相除法 二、三目运算符 三、位运算 最大公约数&#xff08;GCD&#xff09;模板&#xff1a; 最大公约数&#xff08;GCD&#xff09;例题&#xff1a; 最…...

如何集成Android平台GB28181设备接入模块?

技术优势 大牛直播SDK的Android平台GB28181设备接入模块在适用场景、音视频能力、定位与通信、数据管理、安全性与稳定性、配置与扩展性以及集成与维护等方面均表现出显著的优势。这些优势使得该模块在视频监控、巡检抢修、远程指挥等多个领域具有广泛的应用前景和重要的应用价…...

mysql——关于表的增删改查(CRUD)

目录 比较运算符和逻辑运算符图 一、增加&#xff08;Create&#xff09; 1、全列插入 2、指定列插入 二、查询&#xff08;Retrieve&#xff09; 1、全列查询 2、指定列查询 3、别名&#xff08;as&#xff09; 4、表达式查询 5、去重&#xff08;distinct&#xff09; 6、…...