HarmonyOS基于LYEVK-3861開發(fā)心率和血氧檢測(cè)
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
由于本人愛好爬山,去過很多高海拔的地方,每次出行都會(huì)攜帶心率和血氧檢測(cè)儀。其實(shí)很多人對(duì)高反不是很了解。高反,是人體在缺氧情況下,對(duì)環(huán)境的不適應(yīng)。人體在一定氧氣的情況下可以很舒服的呼吸,但是高原因?yàn)楹0胃?,氣壓低,空氣干燥,供給的氧氣稀薄,使得人體的機(jī)能無法正常工作,就會(huì)出現(xiàn)嘔吐、頭暈頭疼、流鼻血、浮腫的各種情況。
海拔高度一般達(dá)到2700米,就會(huì)有高原反應(yīng)。
海拔高度(米) 為0海拔含氧量的%
那我們?nèi)绾稳ヅ袛嘧约菏欠裼懈叻茨?
可以通過血氧飽和度來判定,當(dāng)我們血氧飽和度低于80%的時(shí)候就會(huì)有高原反應(yīng)了。
血氧:是指血液中的氧氣,人體正常血氧飽和度為95%以上。血液中含氧量越高,人的新陳代謝就越好。當(dāng)然血氧含量高并不是一個(gè)好的現(xiàn)象,人體內(nèi)的血氧都是有一定的飽和度,過低會(huì)造成機(jī)體供氧不足,過高會(huì)導(dǎo)致體內(nèi)細(xì)胞老化。
本次內(nèi)容講解基于LYEVK-3861開發(fā)板完成一個(gè)簡(jiǎn)單的心率和血氧檢測(cè),來檢查身體的狀態(tài)。主要測(cè)量HR-心率 、SaO2-血氧。
效果演示
環(huán)境準(zhǔn)備
1、開發(fā)環(huán)境、編譯環(huán)境搭建,參考官方文檔,此處不在贅述。參考鏈接如下:
2、OpenHarmony 2.0 Canary源碼 源碼獲取,參考:
3、LYEVK-3861 IoT物聯(lián)網(wǎng)開發(fā)板套件:
開發(fā)調(diào)試
1、基礎(chǔ)介紹
血氧檢測(cè)傳感器選用的是MAX30102,其大致的工作原理將RED/IR 光射向皮膚,透過皮膚組織反射回的光被光敏傳感器接受并轉(zhuǎn)換成電信號(hào),再經(jīng)過AD轉(zhuǎn)換成數(shù)字信號(hào)。簡(jiǎn)化過程:光–> 電 --> 數(shù)字信號(hào),然后將數(shù)字信號(hào)通過I2C與主控交互。
本次實(shí)驗(yàn)使用的是GPIO模擬I2C通信,I2C協(xié)議規(guī)定在總線上出現(xiàn)起始信號(hào)start后,若SCL在高電平期間SDA保持電平不變,則SDA的狀態(tài)表示有效數(shù)據(jù)(data valid)。在傳輸數(shù)據(jù)時(shí)SDA的改變必須只能發(fā)生在SCL為低電平期間,每一bit數(shù)據(jù)有1個(gè)時(shí)鐘脈沖時(shí)長(zhǎng),I2C串行總線上的數(shù)據(jù)傳輸時(shí)序如下圖所示:

I2C協(xié)議規(guī)定每個(gè)被尋址設(shè)備在接收1字節(jié)數(shù)據(jù)后都必須向發(fā)送字節(jié)的設(shè)備發(fā)送應(yīng)答(ACK)信號(hào),確認(rèn)的器件必須在應(yīng)答時(shí)鐘脈沖期間下拉SDA線,使得SDA線在應(yīng)答相關(guān)時(shí)鐘脈沖SCL為高電平期間穩(wěn)定為低電平。
I2C協(xié)議規(guī)定與ACK信號(hào)相反的信號(hào)為非應(yīng)答(not ACK)信號(hào)。在主器件從從器件中讀取數(shù)據(jù)時(shí),主器件必須在讀取的最后1字節(jié)數(shù)據(jù)后在SDA總線上產(chǎn)生not ACK信號(hào)以示意從器件停止發(fā)送數(shù)據(jù)。not ACK信號(hào)是在SCL為高電平期間保持SDA也為高電平。
根據(jù)時(shí)序圖,用GPIO模擬IIC通信,
2、開始調(diào)試
先用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起始信號(hào)
- 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總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- }
用GPIO模擬IIC停止信號(hào)
- 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);//發(fā)送I2C總線結(jié)束信號(hào)
- delay_us(4);
- }
用GPIO模擬產(chǎn)生ACK應(yīng)答信號(hào)
- 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模擬產(chǎn)生not ACK應(yīng)答
- 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模擬等待應(yīng)答信號(hào),如果返回值是1,則接受應(yīng)答失敗,如果返回值是0,則接受應(yīng)答成功
- u8 IIC_Wait_Ack(void){
- u8 ucErrTime=0;
- SDA_IN(); //SDA設(shè)置為輸入
- 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);//時(shí)鐘輸出0
- return 0;
- }
發(fā)送數(shù)據(jù)的實(shí)現(xiàn)
- void IIC_Send_Byte(u8 txd){
- u8 t;
- SDA_OUT();
- IIC_SCL(0);//拉低時(shí)鐘開始數(shù)據(jù)傳輸
- for(t=0;t<8;t++){
- IIC_SDA((txd&0x80)>>7);
- txd<<=1;
- delay_us(2); //對(duì)TEA5767這三個(gè)延時(shí)都是必須的
- IIC_SCL(1);
- delay_us(2);
- IIC_SCL(0);
- delay_us(2);
- }
- }
IIC發(fā)送一個(gè)字節(jié),返回從機(jī)有無應(yīng)答,返回值是1時(shí)有應(yīng)答,返回值是0時(shí)無應(yīng)答
- u8 IIC_Read_Byte(unsigned char ack){
- unsigned char i,receive=0;
- SDA_IN();//SDA設(shè)置為輸入
- 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();//發(fā)送nACK
- else
- IIC_Ack(); //發(fā)送ACK
- return receive;
- }
讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0時(shí),發(fā)送nACK
在主函數(shù)里初始化IIC,再初始化芯片里的相關(guān)寄存器

在max30102.c里按照芯片規(guī)格書,通過模擬的IIC對(duì)寄存器進(jìn)行讀取,再調(diào)用下芯片原廠提供的算法,將采集到的值輸出在顯示屏上

3、結(jié)語
以上都完成之后,就可以編譯、燒錄,就可以測(cè)試最后的完成效果。
對(duì)于想去高海拔的小伙伴們,可以帶一個(gè)便攜式血氧檢測(cè)儀,隨時(shí)監(jiān)控自己的身體狀況哦~
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)