基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

news2024/11/26 23:21:12

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

  • 1、系统功能介绍
  • 2、演示视频
  • 3、系统框图
  • 4、系统电路介绍
    • 4.1、STM32单片机最小系统设计
    • 4.2、按键电路设计
    • 4.3、蜂鸣器报警电路设计
    • 4.4、Pulsesensor脉搏心率传感器模块电路设计
  • 5、程序设计
    • 5.1、LCD TFT屏幕初始化
    • 5.2、TFT屏幕显示字符串
    • 5.3、计算心率
  • 6、资料下载

1、系统功能介绍

本设计由STM32F103C8T6单片机核心板电路+心率传感器电路+报警电路+按键+TFT彩屏组成。

  • 1、TFT液晶实时显示心率值。
  • 2、TFT液晶实时显示采集到的的模拟信号的曲线图,直接显示心率变化曲线。
  • 3、通过按键可以设置心率报警阈值,按键有设置按键、设置+、设置-,在设置情况下可以对设置值进行加减。
  • 4、当前心率值超过设置阈值,蜂鸣器报警,同时显示心率值为红色;否则蜂鸣器不报警,心率值显示蓝色。

2、演示视频

  • 演示视频:https://www.bilibili.com/video/BV1mc411C7P2
  • 资料在视频评论区获取

3、系统框图

4、系统电路介绍

4.1、STM32单片机最小系统设计

  • STM32系列处理器是意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。
  • STM32F103C8T6单片机核心板接口电路图如下图所示

4.2、按键电路设计

  • 按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。注意,按键个数可变。其电路原理图如下图所示。
  • 电路原理图如下图所示:

4.3、蜂鸣器报警电路设计

  • 有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
  • 按键电路设计如下图所示:

4.4、Pulsesensor脉搏心率传感器模块电路设计

  • 脉搏心率传感器是用来测试心跳速率的传感器,实质是一款集成了放大电路和噪声消除电路的光学心率传感器。可以通过此传感器开发出和心率有关的互动作品。传感器可以戴在手指或者耳垂上。光电传感器将脉搏信号转换为电信号,此装置需要把手指放在传感器表盘上,光电传感器,此传感器是集成了放大电路和噪声消除电路的光学心率传感器,光电传感器一侧的发光二极管发光,当脉搏跳动时,指尖或者耳垂的动脉血管血容量发生周期性变化,透过指尖的光强度同时发生变化。另一侧的光电三极管将接收到的红外光信号转化为电信号。

  • 电路原理图如下图所示:

  • 实物图

5、程序设计

5.1、LCD TFT屏幕初始化

void Lcd_Init(void)
{
  LCD_CS1 =1;
  if(LCD_CS1==0)
  {
    LCD_WR_REG_DATA(0,0);
    LCD_ShowString(0,0," ");
    LCD_ShowNum(0,0,0,0);
    LCD_Show2Num(0,0,0,0);
    LCD_DrawPoint_big(0,0);
    LCD_DrawRectangle(0,0,0,0);
    Draw_Circle(0,0,0);
  }
  LCD_RES=0;
  delay_ms(20);
  LCD_RES=1;
  delay_ms(20);
  LCD_CS1 =0;  //打开片选使能

  //************* Start Initial Sequence **********// 
  LCD_WR_REG(0xCF);  
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0xD9); 
  LCD_WR_DATA8(0X30); 

  LCD_WR_REG(0xED);  
  LCD_WR_DATA8(0x64); 
  LCD_WR_DATA8(0x03); 
  LCD_WR_DATA8(0X12); 
  LCD_WR_DATA8(0X81); 

  LCD_WR_REG(0xE8);  
  LCD_WR_DATA8(0x85); 
  LCD_WR_DATA8(0x10); 
  LCD_WR_DATA8(0x78); 

  LCD_WR_REG(0xCB);  
  LCD_WR_DATA8(0x39); 
  LCD_WR_DATA8(0x2C); 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x34); 
  LCD_WR_DATA8(0x02); 

  LCD_WR_REG(0xF7);  
  LCD_WR_DATA8(0x20); 

  LCD_WR_REG(0xEA);  
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0xC0);    //Power control 
  LCD_WR_DATA8(0x21);   //VRH[5:0] 

  LCD_WR_REG(0xC1);    //Power control 
  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0] 

  LCD_WR_REG(0xC5);    //VCM control 
  LCD_WR_DATA8(0x32); 
  LCD_WR_DATA8(0x3C); 

  LCD_WR_REG(0xC7);    //VCM control2 
  LCD_WR_DATA8(0XC1); 

  LCD_WR_REG(0x36);    // Memory Access Control 
  LCD_WR_DATA8(0x08); 

  LCD_WR_REG(0x3A);   
  LCD_WR_DATA8(0x55); 

  LCD_WR_REG(0xB1);   
  LCD_WR_DATA8(0x00);   
  LCD_WR_DATA8(0x18); 

  LCD_WR_REG(0xB6);    // Display Function Control 
  LCD_WR_DATA8(0x0A); 
  LCD_WR_DATA8(0xA2); 



  LCD_WR_REG(0xF2);    // 3Gamma Function Disable 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0x26);    //Gamma curve selected 
  LCD_WR_DATA8(0x01); 

  LCD_WR_REG(0xE0);    //Set Gamma 
  LCD_WR_DATA8(0x0F); 
  LCD_WR_DATA8(0x20); 
  LCD_WR_DATA8(0x1E); 
  LCD_WR_DATA8(0x09); 
  LCD_WR_DATA8(0x12); 
  LCD_WR_DATA8(0x0B); 
  LCD_WR_DATA8(0x50); 
  LCD_WR_DATA8(0XBA); 
  LCD_WR_DATA8(0x44); 
  LCD_WR_DATA8(0x09); 
  LCD_WR_DATA8(0x14); 
  LCD_WR_DATA8(0x05); 
  LCD_WR_DATA8(0x23); 
  LCD_WR_DATA8(0x21); 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0XE1);    //Set Gamma 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x19); 
  LCD_WR_DATA8(0x19); 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x12); 
  LCD_WR_DATA8(0x07); 
  LCD_WR_DATA8(0x2D); 
  LCD_WR_DATA8(0x28); 
  LCD_WR_DATA8(0x3F); 
  LCD_WR_DATA8(0x02); 
  LCD_WR_DATA8(0x0A); 
  LCD_WR_DATA8(0x08); 
  LCD_WR_DATA8(0x25); 
  LCD_WR_DATA8(0x2D); 
  LCD_WR_DATA8(0x0F); 

  LCD_WR_REG(0x11);    //Exit Sleep 
  delay_ms(120); 
  LCD_WR_REG(0x29);    //Display on 
 
} 

5.2、TFT屏幕显示字符串

void LCD_ShowString(u16 x,u16 y,const u8 *p)
{         
    while(*p!='\0')
    {       
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
        LCD_ShowChar(x,y,*p,0);
        x+=8;
        p++;
    }  
}

5.3、计算心率

void EXTI0_IRQHandler(void)
{
  if(xinLater>60)   //滤波防止抖动300ms
  {
    if(xinLater>400)		//滤波滤掉手指未放情况
    {
      xinLater =0;		//此时心率为0
    }
    else
    {
      xlTab[count++]=xinLater;//记录前后两次事件间隔 
      xinLater=0;
      if(count>=4)		//记录超过4次进行滤波处理
      {
        xinLv =60000/((xlTab[0]+xlTab[1]+xlTab[2]+xlTab[3])/4*5);//60000单位ms 表示60s /4求平均  *5每次定时5ms
        count=0;		//清除本次记录
      }   
      xinLater =0;	//延时清零
    }
  }
	
	EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
}

6、资料下载

  • 演示视频:https://www.bilibili.com/video/BV1mc411C7P2
  • 资料在视频评论区获取

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

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

相关文章

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿(一)

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

《JavaSE》---21.<简单认识Java的集合框架包装类泛型>

目录 前言 一、什么是集合框架 1.1类和接口总览 二、集合框架的重要性 2.1 开发中的使用 2.2 笔试及面试题 三、背后所涉及的数据结构 3.1 什么是数据结构 3.2 容器背后对应的数据结构 四、包装类 4.1 基本数据类型和对应的包装类 4.2 装箱和拆箱 1.最初的写法 2.…

向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型

向量数据库的原理和实现,包括向量数据库的基本概念、相似性搜索算法、相似性测量算法、过滤算法和向量数据库的选型等等。向量数据库是崭新的领域,目前大部分向量数据库公司的估值乘着 AI 和 GPT 的东风从而飞速的增长,但是在实际的业务场景中…

NodeRed测试modbus RTU或modbus TCP通讯

目录标题 STEP1 添加modbus节点STEP2 查看是否安装成功STEP3 modbusTCP读取写入设置读取设置写入设置 STEP4 读写测试 STEP1 添加modbus节点 节点管理——控制板——安装 找到node-red-contrib-modbus,点击安装 STEP2 查看是否安装成功 安装成功后,左…

Day14 | 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

语言 Java 找树左下角的值 题目链接:找树左下角的值 题目 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路 本题有两种做法我主要讲一下递归的思路,创建两个全局变量&…

blender使用(三)常用建模操作及修改器

1,挤出图形 tab编辑模式,选中一个点/线/面,按键E,可以挤出对应的图形。选中点会挤出一条线,线会挤出一个面,面挤出体 2,倒角 选中一个边后,ctrlB ,拖动鼠标是倒角范围&am…

MINIO集群部署手册

为了满足电子仓库功能相关部署与扩容等操作,因此提供电子仓库部署手册。手册中我们以2个minio节点,每个节点2个盘来进行分布式部署;并且最终扩容成4个节点每个节点2个盘。 操作系统 由于在Windows下运行分布式Minio处于实验阶段,因…

Web前端浅谈ArkTS组件开发

本文由JS老狗原创。 有幸参与本厂APP的鸿蒙化改造,学习了ArkTS以及IDE的相关知识,并有机会在ISSUE上与鸿蒙各路大佬交流,获益颇丰。 本篇文章将从一个Web前端的视角出发,浅谈ArkTS组件开发的基础问题,比如属性传递、插…

定积分与不定积分

定积分与不定积分 引言正文不定积分理解角度1理解角度2 定积分 引言 可能大家看到这个标题会不屑一顾,觉得这个还用你教我吗,高等数学最简单的内容。今天突然想到一个问题,就是为什么不定积分会有一个常数 C C C 出现,这个常数 …

继电器驱动电路的可靠性设计分析

在温度-30℃到85℃、供电电源9V-16V范围条件下,保证外部继电器能正常作动,且不发生负载能力降低的情况。(注:需要详细的外部继电器规格说明) 对于控制多路输出而且要求负载同时打开的模块,必须以50ms(10ms…

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言: 在C中有许多设计模式,单例模式就是其中的一种,该模式主要针对类而设计,确保在一个进程下该类只能实例化出一个对象,因此名为单例。而…

OpenCV 图像旋转和平移 数学和代码原理详解

文章目录 数学原理旋转矩阵平移和旋转合成变换矩阵应用在OpenCV中的实现 代码关键点解读完整代码C代码:Python代码: 在OpenCV中进行图像旋转涉及到一些基本的几何变换和图像处理操作。 数学原理 在图像旋转中,背后的数学原理主要涉及二维欧…

嵌入式硬件-Xilinx FPGA DDR4 接口配置基础(PG150)

1. 简介 1.1 DDR4 SDRAM 控制器主要特点 支持8到80位接口宽度的组件(支持 RDIMM、LRDIMM、UDIMM 和 SODIMM) 最大组件限制为9,此限制仅适用于组件,不适用于 DIMM。密度支持 最高支持 32 GB 的组件密度,64 GB 的 LRDI…

步步精慕尼黑上海电子展完美收官,感恩所有相遇,期待下次再会

2024年7月11日至13日,慕尼黑上海电子展圆满落幕,步步精科技(以下简称步步精)在此次展会上取得了丰硕的成果。作为连接器行业的重要制造商,步步精携带其最新产品和连接器技术方案亮相展会,吸引了大量参观者的…

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …

RK3568笔记四十二:OLED 屏幕驱动(模拟I2C)

若该文为原创文章,转载请注明原文出处。 本篇记录使用GPIO模拟I2C驱动OLED屏幕,显示界面效果如下。 主要流程是,修改设备树,使用普通IO口,驱动模拟I2C方式,应用程直接传输数据控制。 1、修改设备 2、编写…

Go语言 Import导入

本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示,首先创建test文件夹。 加法 在test文件夹中创建add文件夹&#xff…

数据预处理在建模中的重要性与常见方法(三):特征工程篇

数据预处理在建模中的重要性与常见方法(三):特征工程篇 特征工程是数据预处理中至关重要的一步,通过构建、转换和选择最能代表数据特性的特征,以提高模型的性能和准确性。常见的特征工程方法包括特征选择、特征提取和特…

前端-模拟请求数据mook第三方插件 json-server的使用

大纲 第一步下载第二配置mook的数据源第三配置启动命令第四运行模拟服务第五测试接口如果要进行更复杂的操作 第一步下载 npm install json-server -D"devDependencies": {"json-server": "^1.0.0-beta.1"}第二配置mook的数据源 在项目的根目录…

某指挥调度系统功能展示(下)

照片管理 拍照是普通执勤巡检中很常用的信息记录功能。 通过此功能可以看到设备本地拍摄的照片,此平台分成了两部分: 一部分是设备上的,需要设备在线才可以访问;支持上传到平台,并且在设备端有相应的选择&#xff0…