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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

MAX30102心率模塊程序 改過的但是顯示還是有點問題 求大佬指正問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1089629 發(fā)表于 2023-7-30 09:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  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)先級分組2
  57.         delay_init();                     //延時函數(shù)初始化         
  58.         uart_init(115200);                 //串口初始化為9600
  59.     IIC_Init();


  60.     if(!maxim_max30102_reset())//復位 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ū)長度為100存儲以100sps運行的5秒樣本

  71.     printf("采集500個樣本\r\n");
  72.     //讀取前500個樣本,并確定信號范圍
  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];    //更新信號最小值
  79.         if(un_max < aun_red_buffer[i])
  80.             un_max = aun_red_buffer[i];    //更新信號最大值

  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.     //計算前500個樣本后的心率和血氧飽和度(樣本的前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秒計算一次心率和血氧飽和度
  90.     while(1)
  91.     {
  92.         i = 0;
  93.         un_min = 0x3FFFF;
  94.         un_max = 0;

  95.         //轉(zhuǎn)儲內(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.         //在計算心率之前采集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ù)相鄰兩個AD數(shù)據(jù)的偏差來確定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.             //通過UART向終端程序發(fā)送樣本和計算結(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');//顯示單個字符
  164. //There is no luck.There is only work.幸運是不存在的,努力才是硬道理。
  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. */


復制代碼

程序.7z

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

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

使用道具 舉報

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

因此,修復該問題的方法是將un_prev_data = aun_red_buffer[i];這行代碼移動到循環(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];    //更新信號最小值
    if(un_max < aun_red_buffer[i])
        un_max = aun_red_buffer[i];    //更新信號最大值

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线日韩福利 | 日韩中文字幕在线视频 | 国产一区二区三区高清 | 久久久久国产视频 | 日本精品视频在线 | 日本精品久久久久久久 | 国产高清一区二区三区 | 欧美黄色免费网站 | 日韩精品一区二区三区在线观看 | 国产91亚洲精品 | 久久中文字幕av | 欧美一区二区三区在线观看视频 | 麻豆av一区二区三区久久 | 西西裸体做爰视频 | 欧美日本在线 | 精品欧美一区二区精品久久久 | 国产做a爱免费视频 | 久久成人国产精品 | 91九色在线观看 | 午夜三级网站 | 久久成人一区 | 麻豆精品久久久 | 久久69精品久久久久久久电影好 | 久久99精品国产 | 一区二区三区视频在线观看 | 欧美日韩一区二区在线观看 | 国产精品看片 | 久久久不卡网国产精品一区 | 亚洲在线一区 | 欧美日日| 久久久久久久久久久福利观看 | 伦理片97| 超碰在线97国产 | 欧美日韩一区二区在线 | 水蜜桃亚洲一二三四在线 | 欧美精品中文字幕久久二区 | 一区二区国产在线观看 | 高清一区二区三区 | 欧美日韩精品一区二区三区四区 | 午夜电影在线播放 | 欧美在线一区二区三区 |