HarmonyOS基于LYEVK-3861开发心率血氧检测在很多高海拔地区,每次出行都会携带心率血氧检测仪。其实,很多人对高凡并不是很了解。高反应是人体在缺氧的情况下无法适应环境。人体只要有一定的氧气就可以舒服地呼吸,但高海拔的原因是海拔高、气压低、空气干燥、供氧稀薄,使人体机能无法正常工作,并出现呕吐、头晕、头痛、流鼻血、水肿等。的各种情况。海拔一般达到2700米,就会出现高原反应。海拔高度(米)是海拔含氧量的0%,那我们怎么判断自己是否有高反应呢?可以通过血氧饱和度来判断。当我们的血氧饱和度低于80%时,就会出现平台反应。血氧:指血液中的氧气,人体正常血氧饱和度在95%以上。血液中含氧量越高,人的新陈代谢就会越好。当然,血氧含量高并不是什么好现象。人体内的血氧具有一定的饱和度。太低会造成身体供氧不足,太高则会造成身体细胞老化。本内容讲解了一个简单的基于LYEVK-3861开发板的心率血氧检测来检测身体状态。主要测量HR-心率,SaO2-血氧。效果演示环境准备1.开发环境、编译环境搭建,参考官方文档,这里不再赘述。参考链接如下:Window开发环境Ubuntu编译环境2、OpenHarmony2.0Canary源码源码获取,参考:源码获取说明镜像完整下载3、LYEVK-3861物联网开发板套件:LYEVK-3861开发板开发与调试1.基本介绍血氧检测传感器是MAX30102。它的一般工作原理是将RED/IR光射到皮肤上,通过皮肤组织反射回来的光被光敏传感器接受并转换成电信号,再通过AD转换成数字信号。简化流程:光->电->数字信号,然后通过I2C将数字信号与主控进行交互。本实验使用GPIO模拟I2C通信。I2C协议规定,总线上出现启动信号start后,如果在SCL高电平期间SDA保持相同电平,则SDA的状态表示数据有效(datavalid)。传输数据时,SDA的变化必须只在SCL为低电平时发生,并且每一位数据都有一个时钟脉冲持续时间。I2C串行总线上的数据传输时序如下图所示:I2C协议规定,每接收到1个字节的数据后,寻址设备必须向发送该字节的设备发送一个确认(ACK)信号。被确认的设备必须在响应时钟脉冲期间拉低SDA线,使SDA线在响应时钟脉冲SCL的高电平期间稳定在低电平。I2C协议规定与ACK信号相反的信号是非确认(notACK)信号。当主设备从从设备读取数据时,主设备必须在读取完最后1个字节的数据后在SDA总线上产生一个notACK信号,以通知从设备停止发送数据。notACK信号在SCL为高电平时保持SDA为高电平。根据时序图,使用GPIO模拟IIC通信,2.开始调试,使用GPIO模拟初始化IIC1GPIO_UNC(PIN_SDA,WIFI_IOT);//SDAGpioSetDir(PIN_SDA,WIFI_IOT_GPIO_DIR_OUT);IIC_SCL(1);IIC_SDA(1);IoSetFunc(PIN_INT,WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//INTGpioSetDir(PIN_INT,WIFI_IOT_GPIO_DIR_IN);(I_IOT_GPIO_OUT_DIR_IN)模拟;//sda线输出IIC_SDA(1);IIC_SCL(1);delay_us(4);IIC_SDA(0);//START:whenCLKishhigh,DATAchangeformhightolowdelay_us(4);IIC_SCL(0);//钳位I2C总线,准备就绪发送或接收数据}使用GPIO模拟IIC停止信号voidIIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL(0);IIC_SDA(0);//STOP:whenCLKishhighDATAchangeformlowtohighdelay_us(4);IIC_SCL(1);IIC_SDA(1);//发送I2C总线结束信号delay_us(4);}利用GPIO模拟产生ACK响应信号voidIIC_Ack(void){IIC_SCL(0);SDA_OUT();IIC_SDA(0);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);}使用GPIO模拟产生非ACK响应voidIIC_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,则响应被成功接受。u8IIC_Wait_Ack(void){u8ucErrTime=0;SDA_IN();//SDA设置为输入IIC_SDA(1);delay_us(1);IIC_SCL(1);delay_us(1);#if1while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();//printf("IIC_Wait_Ackerro\r\n");return1;}}#elseucErrTime++;delay_us(3);#endifIIC_SCL(0);//时钟输出0return0;}发送数据的实现voidIIC_Send_Byte(u8txd){u8t;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发送一个字节,返回slave是否有响应,有响应时返回值为1,返回值为No为0时响应u8IIC_Read_Byte(unsignedcharack){unsignedchari,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();//发送nACKelseIIC_Ack();//发送ACKreturnreceive;}读取1个字节,当ack=1,发送ACK;当ack=0时,发送nACK。在main函数中初始化IIC,然后初始化芯片中的相关寄存器。在max30102.c中,根据芯片规格通过模拟IIC读取寄存器,然后调用原芯片厂提供的算法,将采集到的值输出到显示屏上。3.结论以上都是完成后就可以编译烧录了,可以测试一下最终的完成效果。想去高海拔的小伙伴们,可以带上便携式血氧检测仪,随时监测自己的身体状况哦~点击下方文章相关附件链接原文下载心率血氧检测demo.rar更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com
