查看: 4448|回复: 2

基于麒麟座mini开发板的心率检测器

[复制链接]
  • TA的每日心情
    奋斗
    2023-5-10 20:09
  • 签到天数: 1742 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-9-18 10:06:47 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 jinglixixi 于 2017-9-18 10:23 编辑

    心率是一项重要的生理指标,通过心率传感器的使用我们能够较好地获取心率信息。PulseSensor 就是一款光电反射式的脉搏心率传感器,其输出信号为模拟信号。使用时,可将其佩戴于手指、耳垂等处。借助麒麟座mini开发板内部的模数转换器,可将采集到的心率模拟信号由模拟转换为数值量,以便于计算出相应的心率参数。此外,还可将脉搏数据通过串口上传到电脑,并通过专用程序显示出波形,其主要构成如图1所示。
    图片1.png

    图1  心率检测整体构成

    该设计供提供3种使用方式:
    方式一:使用TFT屏显示心率波形
    图片2.png

    方式二:使用通讯串口1向PC发送心率数据
    图片3.png


    方式三:使用通讯串口2向蓝牙发送心率数据,进而供手机或PC接收。
    图片4.png

    心率传感器的外观如图2所示,它共有 3 个引脚,其中标有 S 的为模拟信号输出线(最左边);标有+的为电源输入线(中间);标有-的为地线(最右边)。
    在使用时,是将S端连接到开发板的PA0引脚。电源输入可连接5V 或 3 .3V。
    图片6.png 图片5.png
    图2  心率传感器外观

    在使用TFT屏绘制心率波形前,可以下载器将串口1所发送的心率数据传送到PC,并以串行助手进行查看,其执行效果如图3所示。
    串口所输出的心率数据均为 ASCII 码格式,因数据量较大,故所用的通讯波特率为 115200。
    在传送的数据中,供含3种数据,其中以“S”为前缀的,是表示脉搏的数据(脉象图的数
    值化表示);以“B”为前缀的,是表示 BPM 数值(心率值);以“Q”为前缀的,是表示 IBI 数值(相邻两个心跳之间的时间)。这3种数据若发给上位机 Processing 软件,就会在窗口中显示出来。 数据S 的发送频率为20ms 一次,数据量较大;数据B 和 Q 只在检测到有效脉搏后,才在每一次心跳后发送一次,数据量较小。其效果如图4和图5所示。

    图片7.png
    图3  串口接收心率数据

    图片8.png
    图4  心率检测初始时段效果

    图片9.png
    图5  长时段心率检测效果

    在接入TFT显示屏的情况下,其心率波形显示效果如图6所示。界面所显示的汉字由字模提取软件PCtoLCD2002来制备,所设置的字模生成格式如图7和图8所示。
    图片10.png
    图6  心率波形显示效果

    图片11.png
    图7生成格式设置

    图片12.png
    8专用字模提取

    绘制波形所用的画线函数其内容如下:
    1. void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
    2. {
    3.         unsigned int t;
    4.         int xerr=0,yerr=0,delta_x,delta_y,distance;
    5.         int incx,incy,uRow,uCol;

    6.         delta_x=x2-x1;  
    7.         delta_y=y2-y1;
    8.         uRow=x1;
    9.         uCol=y1;
    10.         if(delta_x>0)incx=1;  
    11.         else if(delta_x==0)incx=0;
    12.         else {incx=-1;delta_x=-delta_x;}
    13.         if(delta_y>0)incy=1;
    14.         else if(delta_y==0)incy=0;
    15.         else{incy=-1;delta_y=-delta_y;}
    16.         if( delta_x>delta_y)distance=delta_x;
    17.         else distance=delta_y;
    18.         for(t=0;t<=distance+1;t++ )
    19.         {  
    20.                 LCD_DrawPoint(uRow,uCol);
    21.                 xerr+=delta_x ;
    22.                 yerr+=delta_y ;
    23.                 if(xerr>distance)
    24.                 {
    25.                         xerr-=distance;
    26.                         uRow+=incx;
    27.                 }
    28.                 if(yerr>distance)
    29.                 {
    30.                         yerr-=distance;
    31.                         uCol+=incy;
    32.                 }
    33.         }  
    34. }
    复制代码
    主函数的程序如下:
    1. int main(void)
    2. {
    3.   int16_t sj,sp,j;
    4.   HAL_Init();
    5.   SystemClock_Config();
    6.   SPI_CONFIG();        
    7.   Lcd_Init();
    8.   LCD_Clear(RED);
    9.   BACK_COLOR=RED;
    10.   POINT_COLOR=WHITE;  
    11.   showhanzi16h(40,120,5,0);
    12.   showhanzi16h(40,140,4,0);
    13.   showhanzi16h(40,160,3,0);
    14.   showhanzi16h(40,180,2,0);
    15.   showhanzi16h(40,200,1,0);
    16.   showhanzi16h(40,220,0,0);
    17.         
    18.   showhanzi16h(200,120,9,0);
    19.   showhanzi16h(200,140,8,0);
    20.   showhanzi16h(200,160,7,0);
    21.   showhanzi16h(200,180,9,0);
    22.                         
    23.   showhanzi16h(200,260,6,0);        
    24.   showhanzi16h(200,280,1,0);
    25.   showhanzi16h(200,300,0,0);
    26.   POINT_COLOR=WHITE;  
    27.   LCD_DrawLine(10, 300, 190, 300);
    28.   LCD_DrawLine(190, 10, 190, 300);
    29.   sp=0;
    30.   MX_GPIO_Init();
    31.   MX_ADC1_Init();
    32.   MX_TIM3_Init();
    33.   MX_USART2_UART_Init();
    34.   HAL_TIM_Base_Start_IT(&htim3);
    35.   j=0;
    36.   while (1)
    37.   {
    38.                 sendDataToProcessing('S', Signal);     
    39.                 j++;
    40.                 POINT_COLOR=YELLOW;
    41.                 sj=Signal/5;
    42.                 LCD_DrawLine(190-sp, 300-3*(j-1), 190-sj, 300-3*(j));  
    43.                 sp=sj;
    44.                 if(j>86 )
    45.                 {
    46.                 LCD_ClearQ(RED);        
    47.                 j=0;
    48.                 POINT_COLOR=WHITE;  
    49.                 showhanzi16h(40,120,5,0);
    50.                 showhanzi16h(40,140,4,0);
    51.                 showhanzi16h(40,160,3,0);
    52.                 showhanzi16h(40,180,2,0);
    53.                 showhanzi16h(40,200,1,0);
    54.                 showhanzi16h(40,220,0,0);
    55.                         
    56.                 showhanzi16h(200,120,9,0);
    57.                 showhanzi16h(200,140,8,0);
    58.                 showhanzi16h(200,160,7,0);
    59.                 showhanzi16h(200,180,9,0);
    60.                         
    61.                 showhanzi16h(200,260,6,0);        
    62.                 showhanzi16h(200,280,1,0);
    63.                 showhanzi16h(200,300,0,0);
    64.                
    65.                 POINT_COLOR=WHITE;  
    66.                 LCD_DrawLine(10, 300, 190, 300);
    67.                 LCD_DrawLine(190, 10, 190, 300);
    68.                 }        
    69.                 if (QS == true)
    70.                 {
    71.                 sendDataToProcessing('B',BPM);   
    72.                 sendDataToProcessing('Q',IBI);  
    73.                 LCD_ShowCharh(200,100,':',0);
    74.                 LCD_ShowCharh(200 ,240,':',0);
    75.                 LCD_ShowCharh(200,230,BPM/100+0x30,0);
    76.                 LCD_ShowCharh(200,220,BPM%100/10+0x30,0);
    77.                 LCD_ShowCharh(200,210,BPM%10+0x30,0);
    78.                 LCD_ShowCharh(200,90,IBI/1000+0x30,0);
    79.                 LCD_ShowCharh(200,80,IBI%1000/100+0x30,0);
    80.                 LCD_ShowCharh(200,70,IBI%100/10+0x30,0);
    81.                 LCD_ShowCharh(200,60,IBI%10+0x30,0);
    82.                 QS = false;                     
    83.                 }
    84.                
    85.                 HAL_Delay(20);
    86.   }

    87. }
    复制代码
    小结:
    至此,已完成了申请时所设置的计划和项目,学习并掌握了麒麟座mini开发板的使用方法,证明该开发板还是十分便于开发和使用的,能直接用于小型设计项目。后面争取学习一些APP的编程设计,以便能让手机和该开发板构成一个应用系统。
    学习历程的相关连接如下:
    初识麒麟座mini开发板   https://www.cirmall.com/bbs/thread-96943-1-1.html
    麒麟座开发板的开发环境构建及验证   https://www.cirmall.com/bbs/thread-97074-1-1.html
    麒麟座开发板的OLED屏显示   https://www.cirmall.com/bbs/thread-97103-1-1.html
    以麒麟座开发板实现温湿度控制   https://www.cirmall.com/bbs/thread-97137-1-1.html
    以麒麟座开发板实现温湿度曲线显示    https://www.cirmall.com/bbs/thread-97190-1-1.html

    回复

    使用道具 举报

  • TA的每日心情

    2023-3-9 16:16
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-9-20 09:23:49 | 显示全部楼层
    给你点赞
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-5-10 20:09
  • 签到天数: 1742 天

    连续签到: 1 天

    [LV.Master]伴坛终老

     楼主| 发表于 2017-9-20 09:43:56 | 显示全部楼层
    loveeeboard 发表于 2017-9-20 09:23
    给你点赞

    多谢,多谢!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 15:35 , Processed in 0.139586 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.