HarmonyOS 基于LYEVK-3861开发心率和血氧检测 原创 精华

深开鸿
发布于 2021-8-20 08:50
浏览
13收藏

前言

      由于本人爱好爬山,去过很多高海拔的地方,每次出行都会携带心率和血氧检测仪。其实很多人对高反不是很了解。高反,是人体在缺氧情况下,对环境的不适应。人体在一定氧气的情况下可以很舒服的呼吸,但是高原因为海拔高,气压低,空气干燥,供给的氧气稀薄,使得人体的机能无法正常工作,就会出现呕吐、头晕头疼、流鼻血、浮肿的各种情况。

海拔高度一般达到2700米,就会有高原反应。

海拔高度(米) 为0海拔含氧量的%

海拔 空气含氧量
0 100
100 99.2
1000 92.4
2000 84.7
3000 77.1
4000 69.5
5000 61.8
6000 54

那我们如何去判断自己是否有高反呢?
 
可以通过血氧饱和度来判定,当我们血氧饱和度低于80%的时候就会有高原反应了。
 
血氧:是指血液中的氧气,人体正常血氧饱和度为95%以上。血液中含氧量越高,人的新陈代谢就越好。当然血氧含量高并不是一个好的现象,人体内的血氧都是有一定的饱和度,过低会造成机体供氧不足,过高会导致体内细胞老化
 
本次内容讲解基于LYEVK-3861开发板完成一个简单的心率和血氧检测,来检查身体的状态。主要测量HR-心率 、SaO2-血氧。

效果演示

HarmonyOS 基于LYEVK-3861开发心率和血氧检测-鸿蒙开发者社区

环境准备

1、开发环境、编译环境搭建,参考官方文档,此处不在赘述。参考链接如下:

Window开发环境
Ubuntu编译环境

2、OpenHarmony 2.0 Canary源码 源码获取,参考:

源码获取说明
镜像全量下载

3、LYEVK-3861 IoT物联网开发板套件:

LYEVK-3861开发板

开发调试

1、基础介绍

      血氧检测传感器选用的是MAX30102,其大致的工作原理将RED/IR 光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号,再经过AD转换成数字信号。简化过程:光–> 电 --> 数字信号,然后将数字信号通过I2C与主控交互。
 
      本次实验使用的是GPIO模拟I2C通信,I2C协议规定在总线上出现起始信号start后,若SCL在高电平期间SDA保持电平不变,则SDA的状态表示有效数据(data valid)。在传输数据时SDA的改变必须只能发生在SCL为低电平期间,每一bit数据有1个时钟脉冲时长,I2C串行总线上的数据传输时序如下图所示
HarmonyOS 基于LYEVK-3861开发心率和血氧检测-鸿蒙开发者社区

      I2C协议规定每个被寻址设备在接收1字节数据后都必须向发送字节的设备发送应答(ACK)信号,确认的器件必须在应答时钟脉冲期间下拉SDA线,使得SDA线在应答相关时钟脉冲SCL为高电平期间稳定为低电平。
 
      I2C协议规定与ACK信号相反的信号为非应答(not ACK)信号。在主器件从从器件中读取数据时,主器件必须在读取的最后1字节数据后在SDA总线上产生not ACK信号以示意从器件停止发送数据。not ACK信号是在SCL为高电平期间保持SDA也为高电平。
 
根据时序图,用GPIO模拟IIC通信,

2、开始调试

先用GPIO模拟初始化IIC

void IIC_Init(void){	
    GpioInit(); 
    IoSetFunc(PIN_SCL, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);// SCL
	GpioSetDir(PIN_SCL, WIFI_IOT_GPIO_DIR_OUT);

	IoSetFunc(PIN_SDA, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);// SDA
	GpioSetDir(PIN_SDA, WIFI_IOT_GPIO_DIR_OUT);
	IIC_SCL(1);
	IIC_SDA(1);
	
	IoSetFunc(PIN_INT, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);// INT
	GpioSetDir(PIN_INT, WIFI_IOT_GPIO_DIR_IN);
}

用GPIO模拟IIC起始信号

void IIC_Start(void){
	SDA_OUT();     //sda线输出
	IIC_SDA(1);	  	  
	IIC_SCL(1);
	delay_us(4);
 	IIC_SDA(0);//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
}	

用GPIO模拟IIC停止信号

void IIC_Stop(void){
	SDA_OUT();//sda线输出
	IIC_SCL(0);
	IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL(1); 
	IIC_SDA(1);//发送I2C总线结束信号
	delay_us(4);							   	
}

用GPIO模拟产生ACK应答信号

void IIC_Ack(void){
	IIC_SCL(0);
	SDA_OUT();
	IIC_SDA(0);
	delay_us(2);
	IIC_SCL(1);
	delay_us(2);
	IIC_SCL(0);
}

用GPIO模拟产生not ACK应答

void IIC_NAck(void){
	IIC_SCL(0);
	SDA_OUT();
	IIC_SDA(1);
	delay_us(2);
	IIC_SCL(1);
	delay_us(2);
	IIC_SCL(0);
}	

用GPIO模拟等待应答信号,如果返回值是1,则接受应答失败,如果返回值是0,则接受应答成功

u8 IIC_Wait_Ack(void){
	u8 ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	IIC_SDA(1);delay_us(1);	   
	IIC_SCL(1);delay_us(1);	 
	
	#if 1
	while(READ_SDA){
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			//printf("IIC_Wait_Ack erro\r\n");
			return 1;
		}
	}
	#else
	ucErrTime++;
	delay_us(3);
	
	#endif
	IIC_SCL(0);//时钟输出0 	   
	return 0;  
} 

发送数据的实现

void IIC_Send_Byte(u8 txd){                        
    u8 t;   
    SDA_OUT(); 	    
    IIC_SCL(0);//拉低时钟开始数据传输
    
    for(t=0;t<8;t++){              
        IIC_SDA((txd&0x80)>>7);
        txd<<=1; 	  
    	delay_us(2);   //对TEA5767这三个延时都是必须的
    	IIC_SCL(1);
    	delay_us(2); 
    	IIC_SCL(0);	
    	delay_us(2);
    }	 
} 

IIC发送一个字节,返回从机有无应答,返回值是1时有应答,返回值是0时无应答

u8 IIC_Read_Byte(unsigned char ack){
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
	for(i=0;i<8;i++ ){
	    IIC_SCL(0); 
	    delay_us(2);
		IIC_SCL(1);
	    receive<<=1;
	    if(READ_SDA)receive++;   
		delay_us(1); 
	}	
    
	if (!ack)
	    IIC_NAck();//发送nACK
	else
	    IIC_Ack(); //发送ACK   
	return receive;
}

读1个字节,ack=1时,发送ACK,ack=0时,发送nACK
在主函数里初始化IIC,再初始化芯片里的相关寄存器
HarmonyOS 基于LYEVK-3861开发心率和血氧检测-鸿蒙开发者社区
在max30102.c里按照芯片规格书,通过模拟的IIC对寄存器进行读取,再调用下芯片原厂提供的算法,将采集到的值输出在显示屏上
HarmonyOS 基于LYEVK-3861开发心率和血氧检测-鸿蒙开发者社区

3、结语

以上都完成之后,就可以编译、烧录,就可以测试最后的完成效果。
对于想去高海拔的小伙伴们,可以带一个便携式血氧检测仪,随时监控自己的身体状况哦~
 
作者:周科
 

更多原创内容请关注:开鸿 HarmonyOS 学院

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
心率和血氧检测demo.rar 27.75K 226次下载
已于2021-9-10 14:59:09修改
24
收藏 13
回复
举报
9条回复
按时间正序
/
按时间倒序
爱吃土豆丝的打工人
爱吃土豆丝的打工人

先去跑跑试试。。

回复
2021-8-20 09:09:11
深开鸿
深开鸿 回复了 爱吃土豆丝的打工人
先去跑跑试试。。

哈哈哈,这个主意不错

回复
2021-8-20 09:18:45
bit32
bit32

真心不错原创,值得学习,点赞哈

回复
2021-8-20 10:00:19
深开鸿
深开鸿 回复了 bit32
真心不错原创,值得学习,点赞哈

哈哈哈,专栏还有很多文章

回复
2021-8-23 14:31:52
深开鸿
深开鸿

这个开发板真的很棒哦

回复
2021-9-1 19:32:02
wx6181229301447
wx6181229301447

这个有问题,我没有跑出来,呜呜呜,有没有好心人有最新版的或者帮忙指导一下,有偿,谢谢啦

QQ:2738241311

回复
2021-11-30 17:27:52
wx61defb7d71cf9
wx61defb7d71cf9

能做一个安卓心率app吗?现在找到的app界面太难看了,我是用设备是polar的心率带。我需要一个界面只显示心率的app,横屏竖屏都可以,全屏显示,如果有曲线图就更好了

回复
2022-1-14 10:47:11
感谢地心引力
感谢地心引力

学到了

回复
2022-5-11 21:35:51
黑大蒜啊
黑大蒜啊

受益匪浅 感谢!

回复
2023-6-28 19:37:28
回复
    相关推荐