久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1582|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

MAX30102心率模塊程序 改過(guò)的但是顯示還是有點(diǎn)問(wèn)題 求大佬指正問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1089629 發(fā)表于 2023-7-30 09:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "oled.h"
  4. #include "word.h"
  5. #include "delay.h"
  6. #include "max30102.h"
  7. #include "30102_algorithm.h"
  8. #include "IIC.h"

  9. #define MAX_BRIGHTNESS 255

  10. uint32_t aun_ir_buffer[500]; //IR LED sensor data
  11. int32_t n_ir_buffer_length;    //data length
  12. uint32_t aun_red_buffer[500];    //Red LED sensor data
  13. int32_t n_sp02; //SPO2 value
  14. int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid
  15. int32_t n_heart_rate;   //heart rate value
  16. int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid
  17. uint8_t uch_dummy;

  18. int32_t hr_buf[16];
  19. int32_t hrSum;
  20. int32_t hrAvg;
  21. int32_t spo2_buf[16];
  22. int32_t spo2Sum;
  23. int32_t spo2Avg;
  24. int32_t spo2BuffFilled;
  25. int32_t hrBuffFilled;
  26. int32_t hrValidCnt = 0;
  27. int32_t spo2ValidCnt = 0;
  28. int32_t hrThrowOutSamp = 0;
  29. int32_t spo2ThrowOutSamp = 0;
  30. int32_t spo2Timeout = 0;
  31. int32_t hrTimeout = 0;

  32. int main(void)
  33. {
  34. //        char buf[] = {"Red = "};
  35.         //char buf1[] = {"Ir = "};
  36.         char buf2[] = {"HR = "};
  37.         char buf3[] = {"SpO2 = "};
  38.         //char buf[] = {"There is no luck"};
  39.         //char buf1[] = {"There is only"};
  40.         //char buf2[] = {"word."};
  41.         //char author[] = {"Qing"};


  42.         int i;
  43.         float f_temp;
  44.     uint32_t un_min, un_max, un_prev_data;  //variables to calculate the on-board LED brightness that reflects the heartbeats
  45.     int32_t n_brightness;
  46.         delay_init();


  47.         Oled_Init();
  48.         
  49.         //Oled_Display_String(, 0, buf); //顯示字符串
  50.         //Oled_Display_String(2, 0, buf1); //顯示字符串
  51.         Oled_Display_String(0, 0, buf2); //顯示字符串
  52.         Oled_Display_String(4, 0, buf3);
  53.         //Oled_Display_Pic(128,64,0,0,pic);
  54.          
  55.     //uint8_t IIC_Flag=1;//IIC通信狀態(tài),0為成功1為失敗
  56.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級(jí)分組2
  57.         delay_init();                     //延時(shí)函數(shù)初始化         
  58.         uart_init(115200);                 //串口初始化為9600
  59.     IIC_Init();


  60.     if(!maxim_max30102_reset())//復(fù)位 MAX30102
  61.         printf("max30102_reset failed!\r\n");
  62.     if(!maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy))//讀取并清除狀態(tài)寄存器
  63.         printf("read_reg REG_INTR_STATUS_1 failed!\r\n");
  64.     if(!maxim_max30102_init())//初始化MAX30102
  65.         printf("max30102_init failed!\r\n");

  66.     //printf("指示燈亮了嗎?\r\n");

  67.     n_brightness = 0;
  68.     un_min = 0x3FFFF;
  69.     un_max = 0;

  70.     n_ir_buffer_length = 500; //緩沖區(qū)長(zhǎng)度為100存儲(chǔ)以100sps運(yùn)行的5秒樣本

  71.     printf("采集500個(gè)樣本\r\n");
  72.     //讀取前500個(gè)樣本,并確定信號(hào)范圍
  73.     for(i = 0; i < n_ir_buffer_length; i++)
  74.     {
  75.         while(max30102_INTPin == 1);   //等待MAX30102中斷引腳拉低

  76.         maxim_max30102_read_fifo((aun_ir_buffer+i), (aun_red_buffer+i));  //從MAX30102 FIFO讀取

  77.         if(un_min > aun_red_buffer[i])
  78.             un_min = aun_red_buffer[i];    //更新信號(hào)最小值
  79.         if(un_max < aun_red_buffer[i])
  80.             un_max = aun_red_buffer[i];    //更新信號(hào)最大值

  81.         printf("red=");
  82.         printf("%i", aun_red_buffer[i]);
  83.         printf(", ir=");
  84.         printf("%i\r\n", aun_ir_buffer[i]);

  85.     }
  86.     un_prev_data = aun_red_buffer[i];


  87.     //計(jì)算前500個(gè)樣本后的心率和血氧飽和度(樣本的前5秒)
  88.     maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);

  89.     //從MAX30102連續(xù)取樣。每1秒計(jì)算一次心率和血氧飽和度
  90.     while(1)
  91.     {
  92.         i = 0;
  93.         un_min = 0x3FFFF;
  94.         un_max = 0;

  95.         //轉(zhuǎn)儲(chǔ)內(nèi)存中的前100組樣本,并將最后400組樣本移到頂部
  96.         for(i = 100; i < 500; i++)
  97.         {
  98.             aun_red_buffer[i-100] = aun_red_buffer[i];
  99.             aun_ir_buffer[i-100] = aun_ir_buffer[i];

  100.             //update the signal min and max
  101.             if(un_min > aun_red_buffer[i])
  102.             un_min = aun_red_buffer[i];
  103.             if(un_max < aun_red_buffer[i])
  104.             un_max = aun_red_buffer[i];
  105.         }

  106.         //在計(jì)算心率之前采集100組樣本。
  107.         for(i = 400; i < 500; i++)
  108.         {
  109.             un_prev_data = aun_red_buffer[i-1];
  110.             while(max30102_INTPin == 1);   //等待MAX30102中斷引腳拉低

  111.             maxim_max30102_read_fifo((aun_ir_buffer+i), (aun_red_buffer+i));

  112.             if(aun_red_buffer[i] > un_prev_data)//根據(jù)相鄰兩個(gè)AD數(shù)據(jù)的偏差來(lái)確定LED的亮度
  113.             {
  114.                 f_temp = aun_red_buffer[i] - un_prev_data;
  115.                 f_temp /= (un_max-un_min);
  116.                 f_temp *= MAX_BRIGHTNESS;
  117.                 n_brightness -= (int)f_temp;
  118.                 if(n_brightness < 0)
  119.                     n_brightness = 0;
  120.             }
  121.             else
  122.             {
  123.                 f_temp = un_prev_data-aun_red_buffer[i];
  124.                 f_temp /= (un_max-un_min);
  125.                 f_temp *= MAX_BRIGHTNESS;
  126.                 n_brightness += (int)f_temp;
  127.                 if(n_brightness > MAX_BRIGHTNESS)
  128.                     n_brightness = MAX_BRIGHTNESS;
  129.             }


  130.             //通過(guò)UART向終端程序發(fā)送樣本和計(jì)算結(jié)果
  131.             printf("red=");
  132.             printf("%i", aun_red_buffer[i]);
  133.             printf(", ir=");
  134.             printf("%i", aun_ir_buffer[i]);
  135.             printf(", HR=%i, ", n_heart_rate);
  136.             printf("HRvalid=%i, ", ch_hr_valid);
  137.             printf("SpO2=%i, ", n_sp02);
  138.                         
  139.             printf("SPO2Valid=%i\r\n", ch_spo2_valid);
  140.         }
  141.                 //OLED_ShowInt(0, 60, aun_red_buffer[i]); //顯示數(shù)據(jù)
  142.                 //OLED_ShowInt(2, 60, aun_ir_buffer[i]); //顯示數(shù)據(jù)
  143.                 OLED_ShowInt(0, 60, n_heart_rate); //顯示數(shù)據(jù)
  144.                 OLED_ShowInt(4, 60, n_sp02);  //顯示數(shù)據(jù)
  145.         maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
  146.         }

  147. }


















  148. /*
  149. int main(void)
  150. {
  151.         char buf[] = {"There is no luck"};
  152.         char buf1[] = {"There is only"};
  153.         char buf2[] = {"word."};
  154.         char author[] = {"Qing"};
  155.         
  156.         delay_init();
  157.         Oled_Init();

  158.         while(1)
  159.         {
  160.                 Oled_Display_Pic(128,64,0,0,pic);
  161.         }
  162. }


  163. //        Oled_Display_Char(0,0,'A');//顯示單個(gè)字符
  164. //There is no luck.There is only work.幸運(yùn)是不存在的,努力才是硬道理。
  165. //Oled_Display_String(0,0,buf); //顯示字符串
  166. //Oled_Display_String(2,0,buf1); //顯示字符串
  167. //Oled_Display_String(4,0,buf2); //顯示字符串
  168. //Oled_Display_String(6,80,author);
  169. //        Oled_Display_Pic(128,64,0,0,pic);//顯示圖片
  170. //        Oled_Display_Pic(32,32,2,48,chain);//顯示漢字

  171. */


復(fù)制代碼

程序.7z

312.96 KB, 下載次數(shù): 3

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1087948 發(fā)表于 2023-7-31 12:50 | 只看該作者
根據(jù)提供的代碼,確實(shí)存在一個(gè)問(wèn)題。在代碼中,變量i在循環(huán)結(jié)束后將等于n_ir_buffer_length,而在下一行代碼中,使用了i作為索引來(lái)訪問(wèn)aun_red_buffer數(shù)組。由于數(shù)組的索引從0開(kāi)始,因此最后一個(gè)元素的索引應(yīng)為n_ir_buffer_length - 1。

因此,修復(fù)該問(wèn)題的方法是將un_prev_data = aun_red_buffer[i];這行代碼移動(dòng)到循環(huán)內(nèi)部,并將索引更改為i - 1,如下所示:

c
for(i = 0; i < n_ir_buffer_length; i++)
{
    while(max30102_INTPin == 1);   //等待MAX30102中斷引腳拉低

    maxim_max30102_read_fifo((aun_ir_buffer+i), (aun_red_buffer+i));  //從MAX30102 FIFO讀取

    if(un_min > aun_red_buffer[i])
        un_min = aun_red_buffer[i];    //更新信號(hào)最小值
    if(un_max < aun_red_buffer[i])
        un_max = aun_red_buffer[i];    //更新信號(hào)最大值

    printf("red=");
    printf("%i", aun_red_buffer[i]);
    printf(", ir=");
    printf("%i\r\n", aun_ir_buffer[i]);

    un_prev_data = aun_red_buffer[i - 1];
}
通過(guò)這種修改,代碼應(yīng)該能夠正確地訪問(wèn)數(shù)組元素并賦值給un_prev_data變量。然而,您提到存在一個(gè)不完整的代碼行:"un_prev_data = aun_red_buffer[i];"。根據(jù)代碼的上下文,這可能是為了保存上一個(gè)紅光LED傳感器數(shù)據(jù)的值,以便進(jìn)行后續(xù)的處理。但是,在代碼中并沒(méi)有給出該變量的定義和初始化,因此可能需要在代碼的其他位置添加相關(guān)的聲明和賦值語(yǔ)句。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃在线播放 | 亚洲资源在线 | 亚洲国产网站 | 久久99精品久久 | av色站| 欧美一区二区 | 日韩电影中文字幕 | 韩日av在线 | 久久精品屋 | 国产欧美一级二级三级在线视频 | 国产精品久久久一区二区三区 | 操久久 | 人人亚洲 | 亚洲精品美女在线观看 | 久久精品视频一区二区三区 | 精品91久久| 日日干日日操 | 国产91色在线 | 亚洲 | 欧美一级在线免费观看 | 国产 日韩 欧美 制服 另类 | 日韩高清一区 | 欧美成人影院 | 亚洲精品久久久9婷婷中文字幕 | 天天澡天天操 | 美女视频.| 精品一区二区三区视频在线观看 | 中文字幕在线一区二区三区 | 日韩av手机在线观看 | 国产三级在线观看播放 | 久久久www成人免费精品 | 成人亚洲 | 久久综合一区二区 | 国产欧美一区二区三区在线看 | 鸡毛片| 丁香综合 | 国产成人精品一区二区三区 | 成人三级影院 | 日韩在线高清 | 国内精品一区二区三区 | 欧美精品一区二区三区在线播放 | 国产精品国产精品国产专区不卡 |