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

【stm32简单外设篇】- 手指心跳检测模块

一、适用场景
适用场景:心率/脉搏检测实验、可穿戴设备入门(手环/指夹)、健康监测教学演示、生理信号采集与滤波算法练习、运动/康复监测、物联网健康数据采集等。

二、器材清单

手指心跳检测模块×1

stm32f103(或其它 STM32)开发板 ×1

若干杜邦线 ×1组

稳定电源 5V×1

三、工作原理(要点)

当手指放在发射器与接收器之间,红外发射LED发射的光将穿过手指,到被接收器接收。而血压会随着脉搏变化,导致红外接收器接收到的光通量也会随之变化,因此可以通过红外光接收的情况来统计监测心跳,但是这也导致它很容易受干扰,如环境光照强度,倾斜角度等。

四、接线示意

GNDGND

VCC5V/3.3V电源

标准库

SPC1

HAL库

SPA0

五、示例代码

标准库

#include "adc_time.h" #include "stm32f10x.h" volatile uint16_t adc_light; void adcgpio_init() { GPIO_InitTypeDef PC; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); PC.GPIO_Pin = GPIO_Pin_1; PC.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC,&PC); } void adcmode_init() { ADC_InitTypeDef adc; NVIC_InitTypeDef nvic; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); adc.ADC_Mode=ADC_Mode_Independent; adc.ADC_ScanConvMode = DISABLE; adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 1; ADC_Init(ADC2,&adc); RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5); ADC_ITConfig(ADC2,ADC_IT_EOC,ENABLE); ADC_Cmd(ADC2,ENABLE); ADC_ResetCalibration(ADC2); while(ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2); while(ADC_GetCalibrationStatus(ADC2)); ADC_SoftwareStartConvCmd(ADC2,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); nvic.NVIC_IRQChannel = ADC1_2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 3; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); } void adctime_Init() { adcgpio_init(); adcmode_init(); } void ADC1_2_IRQHandler(void) { if(ADC_GetITStatus(ADC2,ADC_IT_EOC) == SET) { adc_light = ADC_GetConversionValue(ADC2); } ADC_ClearITPendingBit(ADC2,ADC_IT_EOC); } #include "stm32f10x.h" #include "stdio.h" #include "bsp_SysTick.h" #include "adc_time.h" #include "breathing.h" #include "bsp_usart.h" char showlight[20]; extern volatile uint16_t adc_light; int main() { static double oldValue = 0; double value =0; SysTick_Init(); USART_Config(); adctime_Init(); while(1) { value = 0.75 * oldValue + (1 - 0.75) * adc_light;//这个平滑就是取本次和上一次测量数据的加权平均值 sprintf(showlight,"light:%f\n",value); Usart_SendString(USART1,showlight); oldValue = value; Delay_us(1000000); } // return 0; }

HAL库

int main(void) { /* USER CODE BEGIN 1 */ char show[20]={0}; static double oldValue = 0; double value =0; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { //#1。启动常规序列 HAL_ADC_Start(&hadc1); //#2.等待转换完成 HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY); //#3。获取结果 uint32_t dr = HAL_ADC_GetValue(&hadc1); //#4.把结果转换成电压 value = 0.75 * oldValue + (1 - 0.75) * dr;//这个平滑就是取本次和上一次测量数据的加权平均值 sprintf(show,"adc:%d,light:%f\r\n",dr,value); HAL_UART_Transmit(&huart1,show,strlen(show),HAL_MAX_DELAY); oldValue = value; HAL_Delay(500); // if(voltage>1.5f)//光线暗 // HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET);// 灭灯 // else//光线亮 // HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); // 亮灯 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

​ 六、讲解视频

https://www.bilibili.com/video/BV1VCvvBCEeb/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV19xvBBQER4/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1QhvBBEE6G/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

http://www.jsqmd.com/news/425159/

相关文章:

  • 【stm32简单外设篇】- 水位传感器
  • 大数据架构数据压缩技术:从Snappy到Zstandard
  • 2026年AI直播讲师平台推荐榜:甄选企业实测解析 - 品牌鉴赏师
  • 2026年2月围栏厂家推荐:市政工程护栏中标企业盘点 - 品牌鉴赏师
  • 吐血整理!提示工程架构师的AI上下文工程时序预测模型优化方案
  • 告别GPU依赖:基于StructBERT的轻量级中文情感分析WebUI实战评测
  • 2026年热门的不锈钢景观护栏厂家优质品牌推荐 - 品牌鉴赏师
  • 孟庆涛与 GEO 2.0:定义2026年生成式引擎优化的新行业标准
  • ABC447F题解
  • [Vitest] mockClear, mockReset, mockRestore
  • 沙拉查词 + AnkiConnect 完整操作指南
  • 设计模式--装饰器模式
  • C++进阶之bind绑定:用法实例(四百四十二)
  • 初中数学基础差?2026实测4家靠谱线上机构,精准补漏不踩坑|家长收藏 - 品牌测评鉴赏家
  • 改进粒子群算法优化混合储能系统容量配置程序
  • 《从0到1!AI应用架构师对比学习实践的快速入门指南》
  • Tic Tac DREAMIN’
  • go基础之流程控制
  • 中考数学提分|实测4家主流线上机构,避坑不踩雷,直接抄作业 - 品牌测评鉴赏家
  • 2026青木川古镇民宿权威排名|青云客栈蝉联第一,自驾亲子首选(附避坑指南) - 一个呆呆
  • 初中数学线上培训机构推荐|4家实测不踩坑,适配不同基础孩子 - 品牌测评鉴赏家
  • if language is ONLY for the sounds for chating。
  • 初中数学培优选对线上机构,少走1年弯路!实测4家主流平台,家长直接抄作业 - 品牌测评鉴赏家
  • 小学数学培优|2026实测3家线上机构,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • 100种思维模型概念(多个角度分析问题)
  • 小学数学基础差?4家靠谱线上机构实测推荐!家长闭眼抄作业 - 品牌测评鉴赏家
  • 多项式和生成函
  • 背单词 纯英文 2026年03月
  • 冲刺中考数学哪家线上辅导班好?实测5家,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • .NET周刊【月第期 --】