找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1040|回复: 1
收起左侧

MAX30102心率模块程序 改过的但是显示还是有点问题 求大佬指正问题

[复制链接]
ID:1089629 发表于 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通信状态,0为成功1为失败
  56.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  57.         delay_init();                     //延时函数初始化         
  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))//读取并清除状态寄存器
  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; //缓冲区长度为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连续取样。每1秒计算一次心率和血氧饱和度
  90.     while(1)
  91.     {
  92.         i = 0;
  93.         un_min = 0x3FFFF;
  94.         un_max = 0;

  95.         //转储内存中的前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)//根据相邻两个AD数据的偏差来确定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向终端程序发送样本和计算结果
  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]); //显示数据
  142.                 //OLED_ShowInt(2, 60, aun_ir_buffer[i]); //显示数据
  143.                 OLED_ShowInt(0, 60, n_heart_rate); //显示数据
  144.                 OLED_ShowInt(4, 60, n_sp02);  //显示数据
  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, 下载次数: 3

回复

使用道具 举报

ID:1087948 发表于 2023-7-31 12:50 | 显示全部楼层
根据提供的代码,确实存在一个问题。在代码中,变量i在循环结束后将等于n_ir_buffer_length,而在下一行代码中,使用了i作为索引来访问aun_red_buffer数组。由于数组的索引从0开始,因此最后一个元素的索引应为n_ir_buffer_length - 1。

因此,修复该问题的方法是将un_prev_data = aun_red_buffer[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];
}
通过这种修改,代码应该能够正确地访问数组元素并赋值给un_prev_data变量。然而,您提到存在一个不完整的代码行:"un_prev_data = aun_red_buffer[i];"。根据代码的上下文,这可能是为了保存上一个红光LED传感器数据的值,以便进行后续的处理。但是,在代码中并没有给出该变量的定义和初始化,因此可能需要在代码的其他位置添加相关的声明和赋值语句。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表