当前位置: 首页 > 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;驱动电机转动。电机通过减速齿轮组带动输出轴…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...