【心率传感器试用】有氧运动达标指示器

2016-12-072.5万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用DFRobot心率传感器制作一个有氧运动达标指示器。通过连接心率传感器到Arduino,并结合数码管和RGB LED,可以实时监测并显示心率数值及颜色。文中详细说明了最高心率公式的计算方法,以及不同心率范围对应的颜色显示。该项目适合健身爱好者和运动员,帮助他们在运动过程中更好地掌握心率情况,确保运动强度适中,达到最佳锻炼效果。

【心率传感器试用】有氧运动达标指示器

【心率传感器试用】有氧运动达标指示器图9
【有氧运动~~~?】
强度较低、持续时间较长、节奏较缓。
那些在高强度和短时间内完成的运动,人体吸入的氧气量远不能满足机体的消耗,体内的氧气处于入不敷出的状态。
而在有氧运动过程中,身体所消耗的氧气大致等于吸入的氧气量,这样可使身体的肌肉细胞在运动过程中不致缺氧,从而起到更好的增进健康的作用。

【常见的有氧运动】
【心率传感器试用】有氧运动达标指示器图8
散步、慢跑、做操、骑车、健身舞等慢运动的范畴。

达标要求】
1、每次必须达到一定的时间。如:每周3次,每次30min;每周4次,每次20min;每周5次,每次20min。
                         2、各年龄段的运动者心脏每分钟的搏动要达到一定的次数(心率)。安静心率为15秒的脉搏数乘以4。按年龄Y计算自己的最高心率公式为:男为205-Y/2;女为220-Y/2最高心率的60 %~80%为适合的有效的有氧运动的心率范围。例:一位40岁男性,计算为:205-40/2=
185(最高心率)。他的有氧运动的适合心率为:185*(60 %~80%)即111~148。该男性的运动心率为135~145最佳。
                         3、运动之前准备活动5~10min,运动之后3~5min 放松,锻炼一下腰腹部等运动中未得到充分锻炼的部位。

DIY【有氧运动达标指示器】
健身过程中随时自测一下心率,做到眼前出彩、心中有数。
【心率传感器试用】有氧运动达标指示器图1
全图

【心率传感器试用】有氧运动达标指示器图11

【心率传感器试用】有氧运动达标指示器图2
数码管

【心率传感器试用】有氧运动达标指示器图3
RGB~LED

【心率传感器试用】有氧运动达标指示器图10
DF~UNO与传感器接线图(心率传感器拔到D)

Arduino 代  码】
[mw_shl_code=cpp,true]//2016/11/23
//利用DF的心率传感器模块测出数字信号-->DF_UNO处理-->数码管显示数值同时RGB_LED灯显示数值相应范围的颜色
/*******************************************************************************/
#include <TimerOne.h>
#include "TM1637.h"
#include "DFRobot_Heartrate.h"
#define ON 1
#define OFF 0

#define CLK 3 //pins definitions for TM1637 and can be changed to other ports   
#define DIO 2

#define LED_R 8
#define LED_G 9
#define LED_B 10

#define heartratePin A1
DFRobot_Heartrate heartrate(DIGITAL_MODE); ///< ANALOG_MODE or DIGITAL_MODE
TM1637 tm1637(CLK,DIO);
int heartRate =0;
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 0;
//////////////////////////////////////////////////////
void setup()
{
  pinMode(LED_R,OUTPUT);
  pinMode(LED_G,OUTPUT);
  pinMode(LED_B,OUTPUT);
  
  Serial.begin(115200);
  tm1637.set();
  tm1637.init();
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR  
}
//////////////////////////////////////////////////
void loop()
{
  if(Update == ON)
  {
    uint8_t rateValue;
    heartrate.getValue(heartratePin); ///< A1 foot sampled values
    rateValue = heartrate.getRate(); ///< Get heart rate value
    if(rateValue)  {
       Serial.println(rateValue);
       heartRate = rateValue;
       LED_RGB(heartRate);
       heartRateUpdate();
    }
    tm1637.display(TimeDisp);
  }
  delay(20);
}
////////////////////////////////////////////////
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2){
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24)hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;  
  }
// Serial.println(second);
  ClockPoint = (~ClockPoint) & 0x01;
}
/////////////////////////////////////////////////////
void heartRateUpdate(void)  //    处理心率数值准备在数码管上显示出来
{
  TimeDisp[0] = 0;
  TimeDisp[1] = heartRate  / 100;
  TimeDisp[2] = heartRate /10 % 10;
  TimeDisp[3] = heartRate % 10;

  Update = OFF;
}
//////////////////////////////////////////////////
void LED_RGB( int value)  // 根据不同范围【把年龄代入公式计算确定】的心率数值决定LED灯的颜色
{
  if  (value < 55)                  // 心率数值过低时,LED灯不亮
  {
      digitalWrite(LED_R,HIGH);
      digitalWrite(LED_G,HIGH);
      digitalWrite(LED_B,HIGH);         
    }
    else if(value>= 55  && value < 72 ) // 一般情况下,显蓝色
    {
      digitalWrite(LED_R,HIGH);
      digitalWrite(LED_G,HIGH);
      digitalWrite(LED_B,LOW);     
      }
      else if(value >= 72 && value <= 110)// 中度时显白色
      {
      digitalWrite(LED_R,LOW);
      digitalWrite(LED_G,LOW);
      digitalWrite(LED_B,LOW);        
        }
      else if(value >=111 && value <=147)// 达标时显绿色
      {
      digitalWrite(LED_R,HIGH);
      digitalWrite(LED_G,LOW);   
      digitalWrite(LED_B,HIGH);               
        }
      else if (value > 147) // 过度时,显红色以警示
      {
      digitalWrite(LED_R,LOW);  
      digitalWrite(LED_G,HIGH);
      digitalWrite(LED_B,HIGH);  
      }
      delay(20);      
}[/mw_shl_code]

手指头容易且方便测,稳定不动,通常十秒过后数字就会出现并实时改变~
【心率传感器试用】有氧运动达标指示器图4
一般情况下显蓝色(不运动)

【心率传感器试用】有氧运动达标指示器图5
开始运动后逐渐增高过程显白色



【心率传感器试用】有氧运动达标指示器图6
达标(优)显绿色

【心率传感器试用】有氧运动达标指示器图7
超标(过度)显红色

【附:每日四个三分钟】
(祖国医学健身的精髓哟)
1.腹式呼吸(睡前平躺进行,目的是推动内脏运动)
2.头低位运动(站立->头向下接近膝部,重复。目的增强脑血管抗压力)
3.晨冷水浴(全身皮肤微循环血管操)
4.搓手(五指相对应的反射区就是人体五脏,搓手心手背相当于在按摩刺激内脏)
【心率传感器试用】有氧运动达标指示器图12


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(12)
Seclipse1
Seclipse1
这个用Edison板照着做可以做出来吗?
许培享
许培享
作者
回复Seclipse1
多看看资料多试试,我粗看了下EDISON资料,EDISON也可在ARDUINO IDE环境下工作的,所以可以应该是兼容吧
BruceW
BruceW
照着做了一个,没测的时候就不停地跳数据,而且大的离谱,测手指的时候,也偶尔大的离谱。
许培享
许培享
作者
回复BruceW
我想这需要数据处理:修改程序,过滤掉突然异常的数据,总是取最近时间段的平均值.....
许培享
许培享
作者
TIMEONE库文件
面包板
面包板
焕然一新的页面
许培享
许培享
作者
回复面包板
哈哈,每周进一步一点点~
凌风清羽
凌风清羽
大家做的帖子真是越来越有逼格了~~~~
砖头墙
砖头墙
叼 牛 膜拜大神
孤龙破晓
孤龙破晓
好简陋呀………………不过能做出来,也是人才呀
许培享
许培享
作者
回复孤龙破晓
是的哟:L,备个3D打印机,一切就好办了
许培享
许培享
作者
:time:有人问我:“四年来感冒过几次?”答:“三次吧,每次仅仅几元的感冒药立马解决了。“
其实我最坚持的是”四个三分钟“中的1和3和每周3次以上慢跑。每当21:00左右,我一个人在校园主干道上来回30分钟左右,最后用手指按脉搏15秒再乘以4得出心率,记录在QQ空间说说里。
冬季里一定要进行冷水浴,每周3次以上,每次3-5分钟淋最冷的水(除头发外),第一分钟冰凉,接着就舒服多多了,体温加热冰水致热气腾腾的爽爽啊,净电荷也消失得干干净净的,哈哈
luna
luna回复阿斗
护驾!!有人要谋害朕!!
阿斗
阿斗回复luna
那你可以试试开水浴
共5条回复,已加载2条,点击查看更多共5条回复,已加载全部
dsweiliang
dsweiliang
感谢分享
许培享
许培享
作者
回复dsweiliang
感谢DF平台,乐趣源头
luna
luna
健康是1,其他都是0!
许培享
许培享
作者
回复luna
健康了才能快快乐乐~
hnyzcj
hnyzcj
8错
许培享
许培享
作者
回复hnyzcj
感谢把试用机会留给他人
许培享
许培享
作者
我抛出了一块砖头
- 没有更多了 -