华为手机如何测心率

华为手机如何测心率,第1张

打开手机的体检表应用进入后,在主界面,点击血压测量的选项。

点击后,下方会d出权限请求d窗,点击始终允许的选项。测心率和血压很多人认为去医院才可以完成。其实,用手机就可以简单测试自己的心率和血压情况。

点击后,页面会出现手机测量的方法及图示,点击开始测量。点击后,在血压测量界面,将手指放在摄像头上,按住屏幕进行测量,点击后,可以看到心率测量的方法,点击开始测量的选项。

等待测量结束后,页面就会显示自己的血压值的情况以及建议。如果需要测量心率,在主界面也可以点击心率测量的选项。

上一篇关于心率的文章获得了很多朋友的支持,总结的东西有人能认可,真是让我十分荣幸。之所以说心率说最重要的数据,其实跟我自己的健康情况也有很大的关系。这次跟大家絮叨一下我这两年多训练中,和心率相关的数据。

先说一下我的具体情况:75年生人,男,身高173cm,体重63kg。如果按照之前的公式计算,我的最大心率应该在180-185左右。各位可以根据自己的情况看看实际的数据。最大心率计算公式:

40岁以下:MHR = 208 - (年龄 X 07);

40岁以上:MHR = 205 - (年龄 X 05);

2009年春节的时候,由于长时间的熬夜加班写程序,导致积劳成疾,发了一次高烧,之后留下了心脏早搏的问题。在中日医院挂号带上了一天的监护仪,每天发生早搏400多次。医生给的建议是不用吃药,少喝咖啡少熬夜就行。于是我换了工作,不做码农,注意休息。但这种情况一直持续了两三年,既没有加重,也没有好转,总是心头一块儿病。

到了2012年10月,突发急性肾结石,疼的我在医院都开始打电话告诉老婆家里所有账号的密码了。经过达止疼针,和一天的碎石后,总算是活过来了。当时我就觉得,刚刚不到40岁,心脏和肾脏都开始出问题,那以后怎么办啊。下定决心开始锻炼身体,开始了长跑。

开始也是自己瞎跑,能跑多少跑多少,直到了2014年10月,完成了北京马拉松半程后,我买了一块专业手表,开始了有计划的科学训练。两年多,跑步1000km,现在这两个健康问题基本都解决了。

来看看我的一些历史数据吧。

上边这张图就是我第一次带手表和心率带后的数据,时间是2015年4月3日。平均心率168bpm,最大心率181bpm。最大心率有时候会有误差,一般关心平均心率就可以了。

第二张图这个就比较危险了。这个是在2015年4月25日,平均心率已经达到了182bpm,最大心率195bpm。这次的训练情况是配速5分49秒,跑了742公里。现在看,以我当时的身体状况,速度太快了,属于训练过度,有些危险了。

我不是一个专业运动员,也不是健身教练,也不是体育专业。絮絮叨叨说了这么多,不是想说自己有多牛,而是想通分享我这样一个菜鸟的长跑训练经历,告诉各位跑友,尤其是刚刚开始跑步,或者计划开始跑步的跑友们:

第一,要相信自己能参与长跑运动,能开始也能坚持;

第二,一定要根据自身情况科学训练,不能冲动蛮干;

只要对自己的健康状况有全面的了解,有科学的训练计划,对长跑运动有一颗敬畏之心,就一切皆有可能。

之后我会跟大家继续分享配速、补给等等其他方面的经验和体会。也欢迎大家留言私信我。

这个是主程序和部分代码由于字数限制所以你还是留个邮箱吧

void main(void)

{

unsigned char i;

sys_init();

beep = 1;

LCD12864_DisplayOneLine(0x80,ucStr1); //显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2); //显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3); //显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4); //显示信息4

while(1)

{

sendDataToProcessing('S', Signal); // 发送并处理原始脉搏传感器数据

if (QS == true){ // 确定发现一个心跳

fadeRate = 255; // Set 'fadeRate' Variable to 255 to fade LED with pulse

sendDataToProcessing('B',BPM); // 发送一个'B'和心率

sendDataToProcessing('Q',IBI); // send time between beats with a 'Q' prefix

QS = false; // reset the Quantified Self flag for next time

LCD_disp_list_char(2,4,DisBuff);//在LCD12864上显示BPM

}

delay(138); // 延时 196ms

LCD_disp_list_char(4,4,DisBuff2);

//ledFadeToBeat();

if(Pressure<100){

for(i=0;i<8;i++){

delay(1000);}

if (Pressure<100){

beep = 0;}}

if(BPM<60|BPM>100){

for(i=0;i<9;i++){

delay(1000);}

if(BPM<60|BPM>100){

beep = 0;}

for(i = 0;i<16;i++) //依次执行写入 *** 作

{

putchar(ucStr1[i]);

}

for(i = 0;i<16;i++) //依次执行写入 *** 作

{

putchar(ucStr2[i]);

}

for(i=0;i<3;i++)

{

putchar(DisBuff[i]);}

for(i = 0;i<16;i++) //依次执行写入 *** 作

{

putchar(ucStr3[i]);

}

for(i = 0;i<16;i++) //依次执行写入 *** 作

{

putchar(ucStr4[i]);

}

for(i=0;i<4;i++)

{

putchar(DisBuff2[i]);}

}

}

//void ledFadeToBeat(){

// fadeRate -= 15; // set LED fade value

// fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!

// analogWrite(fadePin,fadeRate); // fade LED

// }

/

函数名称:GetADCResult

函数功能:获取AD转换结果函数

入口参数:BYTE ch(通道选择)

返回值:result(A/D转换结果)

备注:无

/

unsigned int GetADCResult(BYTE ch)

{ unsigned int result; //AD转换结果result

ADC_CONTR&=0xf8; //清除ADC控制寄存器ADC CONTR的CHS2、CHS1、CHS0(清除通道选择)

_nop_(); //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_();

_nop_();

_nop_();

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; //开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_(); //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_();

_nop_();

_nop_();

while (!(ADC_CONTR & ADC_FLAG));//等待AD转换结束

ADC_CONTR &= ~ADC_FLAG; //关闭ADC

result=ADC_RES; //将AD转换结果的高两位赋给result

result=result<<8; //将result循环左移8位

result+=ADC_RESL; //将AD转换结果的底8位加高两位共10位给result

return result; //返回10位AD转换结果

}

void sendDataToProcessing(char symbol, int dat ){

putchar(symbol); // symbol prefix tells Processing what type of data is coming

printf("%d\r\n",dat); // the data to send culminating in a carriage return

}

void UART_init(void)

{

TMOD = 0x20; //定时器工作在定时器1的方式2

PCON = 0x00; //不倍频

SCON = 0x50; //串口工作在方式1,并且启动串行接收

TH1 = 0xFd; //设置波特率 9600

TL1 = 0xFd;

TR1 = 1; //启动定时器1

}

char putchar(unsigned char dat)

{

TI=0;

SBUF=dat;

while(!TI);

TI=0;

return SBUF;

}

void _nop_ (void)

{}

void T0_init(void){

// Initializes Timer0 to throw an interrupt every 2mS

TMOD |= 0x01; //16bit TIMER

TL0=T0MS;

TH0=T0MS>>8;

TR0=1; //start Timer 0

ET0=1; //enable Timer Interrupt

EA=1; // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void T1_init(void){

// Initializes Timer0 to throw an interrupt every 2mS

TMOD |= 0x01; //16bit TIMER

TL1=T0MS2;

TH1=T0MS2>>8;

TR1=1; //start Timer 0

ET1=1; //enable Timer Interrupt

EA=1; // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void ADC_init(unsigned char channel)

{

P1ASF=ADC_MASK<<channel; //选择P1 channel作为A/D输入来用

ADC_RES=0; //清除ADC结果寄存器RES

ADC_RESL=0; //清除ADC结果寄存器RESL

AUXR1 |= 0x04; //调整ADC格式的结果

}

void Timer1_rountine(void) interrupt 1

{}

unsigned int analogRead(unsigned char channel)

{

unsigned int result;

while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag

ADC_CONTR &=!ADC_FLAG; //clear ADC FLAG

result=ADC_RES;

result=result<<8;

result+=ADC_RESL;

// ADC_CONTR|=channel|ADC_POWER|ADC_SPEEDLL|ADC_START;

return result;

}

// Timer 0中断子程序,每2MS中断一次,读取AD值,计算心率值

void Timer0_rountine(void) interrupt 1

{

int N;

unsigned char i;

// keep a running total of the last 10 IBI values

unsigned int runningTotal = 0; // clear the runningTotal variable

EA=0; // 关定时器中断

TL0=T0MS;

TH0=T0MS>>8; //重装16位定时器初值

Pressure = (GetADCResult(PressurePin)); //

DisBuff2[3] = Pressure%10+48;//取个位数

DisBuff2[2] = Pressure%100/10+48; //取十位数

DisBuff2[1] = Pressure%1000/100+48; //百位数

DisBuff2[0] = Pressure/1000+48;//取千位数

Signal = GetADCResult(PulsePin); // 读脉搏传感器

sampleCounter += 2; // 使用这个值跟踪记录脉搏时间间隔在ms级

N = sampleCounter - lastBeatTime; // 减上个节拍的时间来避免噪声

// 找到脉搏波的波峰和波谷

if(Signal < thresh && N > (IBI/5)3){ // 如果脉搏传感器输出小于电源电压一半 并且 消除噪声时间小于 3/5个脉搏时间间隔

if (Signal < Trough){ // 如果脉搏传感器输出小于波谷

Trough = Signal; // 跟踪脉搏波的最低点

}

}

if(Signal > thresh && Signal > Peak){ // 如果输出大于电源电压一半并且大于波峰

Peak = Signal; // 将新值设为波峰

} // 跟踪脉搏波的波峰

if (N > 250){ // 避免高频噪声

if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)3) ){

Pulse = true; // 当检测到一个脉搏时将脉搏标志设为真

blinkPin=0; // 点亮脉搏灯

IBI = sampleCounter - lastBeatTime; // 测量两个脉搏的时间in mS

lastBeatTime = sampleCounter; // 跟踪脉搏时间

if(secondBeat){ // 如果这是第二个脉搏

secondBeat = false; // 清除标识

for(i=0; i<=9; i++){ // 全部的数据作为真实脉搏BMP

rate[i] = IBI;

}

}

if(firstBeat){ // 如果是第一个脉搏

firstBeat = false; // 清除标志

secondBeat = true; // 设置第二脉搏标志

EA=1; //开中断

return; // IBI 值是不可靠的所以抛弃

}

for(i=0; i<=8; i++){ // 移动数据在rate数组中

rate[i] = rate[i+1]; // 顶替旧值

runningTotal += rate[i]; // 加上第九个新值

}

rate[9] = IBI; // 加最后的IBI到rate数组中

runningTotal += rate[9]; // 加上一个IBI到runningTotal

runningTotal /= 10; // 取平均值

BPM = 60000/runningTotal; // 一分钟可以检测到多少个心跳及 BPM!

if(BPM>200)BPM=200; //限制BPM最高显示值

if(BPM<30)BPM=30; //限制BPM最低显示值

DisBuff[2] = BPM%10+48;//取个位数

DisBuff[1] = BPM%100/10+48; //取十位数

DisBuff[0] = BPM/100+48; //百位数

if(DisBuff[0]==48)

DisBuff[0]=32;

QS = true; // 设置QS标志

// QS FLAG IS NOT CLEARED INSIDE THIS ISR

}

}

if (Signal < thresh && Pulse == true){ // 当电压归零节拍结束

blinkPin=1; // 熄灭脉搏灯

Pulse = false; // 重置脉搏标识我们可以重新测

amp = Peak - Trough; // 得到脉搏波的峰峰值

thresh = amp/2 + Trough; // 设置thresh位脉搏峰峰值的一半

Peak = thresh; // 为下一次测试重置波峰

Trough = thresh;

}

if (N > 2500){ //如果超过25秒没有检测到一个脉搏

thresh = 512; // 重新设置波谷

Peak = 512; // 重新设置波峰

Trough = 512; // 重新设置间隔

lastBeatTime = sampleCounter; // 把最后的节拍时间更新

firstBeat = true; // 重新设置标志避免噪声

secondBeat = false; // 当我们得到心跳的时候

}

EA=1; // 开中断

}// end isr

您好,小米手环的屏幕只有手机和手环的显示,这是因为小米手环是一款智能手环,其主要功能是通过与手机的连接,实现运动监测、睡眠监测、心率监测等功能。因此,小米手环的屏幕设计为简洁、实用,只需显示最基本的信息即可满足用户需求。

小米手环的屏幕可以通过手机App进行设置,用户可以自定义显示内容和顺序,例如时间、日期、步数、心率等。此外,小米手环还支持来电、短信、微信等消息提醒,用户可以在手环屏幕上直接查看消息内容,无需取出手机。

总之,小米手环的屏幕虽然简单,但功能齐全,满足用户的基本需求,同时也保证了手环的轻便、低功耗等特点。

打开华为运动健康APP,在设备界面点击绑定的华为watch3。

在d出来的界面中,在手表功能页面点击健康监测功能。

在d出来的界面中,进入健康监测后,点击连续测量心率,将其开关关闭即可。

以上就是关于华为手机如何测心率全部的内容,包括:华为手机如何测心率、看看我的心率数据,你也能跑马拉松、谁有pulsesensor心率传感器 的c语言程序,带注释的。在线等挺急的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10134692.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存