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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14545|回復: 18
打印 上一主題 下一主題
收起左側

stm32c8t6+max30102心率傳感器+0.96 oled顯示源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:338948 發表于 2018-10-30 21:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
max30102心率傳感制作。
功能實現:采用STM32F103C8T6小板(bluepill板),驅動血氧心率傳感器HXDZ-30102或HXDZ-30102-ACC(MAX30102),實現PPG信號采集,并將計算的心率和血氧值顯示在0.96寸OLED和串口上。
軟件實現:ST標準庫3.5
硬件連接:
HXDZ-30102:
    VCC<->3.3V
    GND<->GND
    SCL<->PB7
    SDA<->PB8
    IM<->PB9
0.96inch OLED :
    VCC<->3.3V
    GND<->GND
    SCL<->PA5
    SDA<->PA6
    RST<->PA3
    DC<->PA4
    CS<->PA2
USB-TTL:
    5V<->5V
    GND<->GND
    RXD<->PA9
    TXD<->PA10

單片機源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "max30102.h"
  6. #include "myiic.h"
  7. #include "algorithm.h"
  8. #include "oled.h"

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

  17. #define MAX_BRIGHTNESS 255

  18. void dis_DrawCurve(u32* data,u8 x);

  19. int main(void)
  20. {
  21.         //variables to calculate the on-board LED brightness that reflects the heartbeats
  22.         uint32_t un_min, un_max, un_prev_data;  
  23.         int i;
  24.         int32_t n_brightness;
  25.         float f_temp;
  26.         u8 temp_num=0;
  27.         u8 temp[6];
  28.         u8 str[100];
  29.         u8 dis_hr=0,dis_spo2=0;

  30.         NVIC_Configuration();
  31.         delay_init();                     //延時函數初始化          
  32.         uart_init(115200);                 //串口初始化為115200
  33.         LED_Init();
  34.        
  35.         //OLED
  36.         OLED_Init();
  37.         OLED_ShowString(0,0,"  initializing  ",16);
  38.         OLED_Refresh_Gram();//更新顯示到OLED         

  39.         max30102_init();

  40.         printf("\r\n MAX30102  init  \r\n");

  41.         un_min=0x3FFFF;
  42.         un_max=0;
  43.        
  44.         n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps
  45.         //read the first 500 samples, and determine the signal range
  46.     for(i=0;i<n_ir_buffer_length;i++)
  47.     {
  48.         while(MAX30102_INT==1);   //wait until the interrupt pin asserts
  49.         
  50.                 max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
  51.                 aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number
  52.                 aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number
  53.             
  54.         if(un_min>aun_red_buffer[i])
  55.             un_min=aun_red_buffer[i];    //update signal min
  56.         if(un_max<aun_red_buffer[i])
  57.             un_max=aun_red_buffer[i];    //update signal max
  58.     }
  59.         un_prev_data=aun_red_buffer[i];
  60.         //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)
  61.     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);
  62.        
  63.         while(1)
  64.         {
  65.                 i=0;
  66.         un_min=0x3FFFF;
  67.         un_max=0;
  68.                
  69.                 //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top
  70.         for(i=100;i<500;i++)
  71.         {
  72.             aun_red_buffer[i-100]=aun_red_buffer[i];
  73.             aun_ir_buffer[i-100]=aun_ir_buffer[i];
  74.             
  75.             //update the signal min and max
  76.             if(un_min>aun_red_buffer[i])
  77.             un_min=aun_red_buffer[i];
  78.             if(un_max<aun_red_buffer[i])
  79.             un_max=aun_red_buffer[i];
  80.         }
  81.                 //take 100 sets of samples before calculating the heart rate.
  82.         for(i=400;i<500;i++)
  83.         {
  84.             un_prev_data=aun_red_buffer[i-1];
  85.             while(MAX30102_INT==1);
  86.             max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);
  87.                         aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number
  88.                         aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number
  89.         
  90.             if(aun_red_buffer[i]>un_prev_data)
  91.             {
  92.                 f_temp=aun_red_buffer[i]-un_prev_data;
  93.                 f_temp/=(un_max-un_min);
  94.                 f_temp*=MAX_BRIGHTNESS;
  95.                 n_brightness-=(int)f_temp;
  96.                 if(n_brightness<0)
  97.                     n_brightness=0;
  98.             }
  99.             else
  100.             {
  101.                 f_temp=un_prev_data-aun_red_buffer[i];
  102.                 f_temp/=(un_max-un_min);
  103.                 f_temp*=MAX_BRIGHTNESS;
  104.                 n_brightness+=(int)f_temp;
  105.                 if(n_brightness>MAX_BRIGHTNESS)
  106.                     n_brightness=MAX_BRIGHTNESS;
  107.             }
  108.                         //send samples and calculation result to terminal program through UART
  109.                         if(ch_hr_valid == 1 && ch_spo2_valid ==1 && n_heart_rate<120 && n_sp02<101)
  110.                         {
  111.                                 dis_hr = n_heart_rate;
  112.                                 dis_spo2 = n_sp02;
  113.                         }
  114.                         else
  115.                         {
  116.                                 dis_hr = 0;
  117.                                 dis_spo2 = 0;
  118.                         }
  119.                                 printf("HR=%i, ", n_heart_rate);
  120.                                 printf("HRvalid=%i, ", ch_hr_valid);
  121.                                 printf("SpO2=%i, ", n_sp02);
  122.                                 printf("SPO2Valid=%i\r\n", ch_spo2_valid);
  123.                 }
  124.         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);
  125.                
  126.                 //顯示刷新
  127.                 LED0=0;
  128.                 if(dis_hr == 0 && dis_spo2 == 0)
  129.                 {
  130.                         sprintf((char *)str,"HR:--- SpO2:--- ");
  131.                 }
  132.                 else{
  133.                         sprintf((char *)str,"HR:%3d SpO2:%3d ",dis_hr,dis_spo2);
  134.                 }
  135.                 OLED_ShowString(0,0,str,16);
  136.                 OLED_Fill(0,23,127,63,0);
  137.                 //紅光在上,紅外在下
  138.                 dis_DrawCurve(aun_red_buffer,20);
  139.                 dis_DrawCurve(aun_ir_buffer,0);
  140.                 OLED_Refresh_Gram();//更新顯示到OLED         
  141.         }
  142. }

  143. void dis_DrawCurve(u32* data,u8 x)
  144. {
  145.         u16 i;
  146.         u32 max=0,min=262144;
  147.         u32 temp;
  148.         u32 compress;
  149.        
  150.         for(i=0;i<128*2;i++)
  151.         {
  152.                 if(data[i]>max)
  153.                 {
  154.                         max = data[i];
  155.                 }
  156.                 if(data[i]<min)
  157.                 {
  158.                         min = data[i];
  159.                 }
  160.         }
  161.        
  162.         compress = (max-min)/20;
  163.        
  164.         for(i=0;i<128;i++)
  165.         {
  166.                 temp = data[i*2] + data[i*2+1];
  167.                 temp/=2;
  168.                 temp -= min;
  169.                 temp/=compress;
  170.                 if(temp>20)temp=20;
  171.                 OLED_DrawPoint(i,63-x-temp,1);
  172.         }
  173. }
復制代碼

所有資料51hei提供下載:
MAX30102.rar (320.96 KB, 下載次數: 674)


評分

參與人數 2黑幣 +80 收起 理由
ruyuer + 30 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:392947 發表于 2018-10-31 09:17 | 只看該作者
學習一下
回復

使用道具 舉報

板凳
ID:263750 發表于 2018-11-1 14:51 | 只看該作者
有實物圖嗎?
回復

使用道具 舉報

地板
ID:349706 發表于 2018-11-2 17:51 | 只看該作者
找到的30102官方測試程序,共享一下

max30102測試程序.rar

5.48 MB, 下載次數: 200, 下載積分: 黑幣 -5

回復

使用道具 舉報

5#
ID:247041 發表于 2018-12-20 20:53 | 只看該作者
這個的采樣率是多少
回復

使用道具 舉報

6#
ID:491006 發表于 2019-3-15 10:44 | 只看該作者
學習一下
回復

使用道具 舉報

7#
ID:139621 發表于 2019-5-27 22:12 | 只看該作者
謝謝分享,學習一下!
回復

使用道具 舉報

8#
ID:543151 發表于 2019-6-10 19:27 | 只看該作者
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);
69行的這個函數在哪里
回復

使用道具 舉報

9#
ID:399735 發表于 2020-2-21 14:24 | 只看該作者
有圖片就好了。。。
回復

使用道具 舉報

10#
ID:703842 發表于 2020-3-15 18:53 | 只看該作者
可以改用52嗎
回復

使用道具 舉報

11#
ID:723793 發表于 2020-4-10 08:08 | 只看該作者
請教大神,max30100和stm32f103c8t6怎么接線
回復

使用道具 舉報

12#
ID:432991 發表于 2020-5-13 15:31 | 只看該作者
這個n_brightness變量一通算,最后還是沒用上啊,這個應該是要用于反饋調整led亮度的。
回復

使用道具 舉報

13#
ID:390410 發表于 2021-4-28 22:28 | 只看該作者
有實物圖嗎?
回復

使用道具 舉報

14#
ID:736539 發表于 2021-8-6 09:52 | 只看該作者
樓主用的是什么MAX30102芯片?我下載了只有心率值,血氧為-999是怎么回事
回復

使用道具 舉報

15#
ID:584195 發表于 2021-8-6 19:18 | 只看該作者
樓主這個做成成品了嗎?低功耗做得怎么樣?
回復

使用道具 舉報

16#
ID:44626 發表于 2023-10-18 13:39 | 只看該作者
感謝提供思路  非常感謝
回復

使用道具 舉報

17#
ID:1097879 發表于 2023-11-16 21:54 | 只看該作者
能做出實物嗎
回復

使用道具 舉報

18#
ID:1103971 發表于 2023-12-12 19:56 | 只看該作者
我覺得挺不錯的,有注釋,不會太費勁
回復

使用道具 舉報

19#
ID:1110053 發表于 2024-1-24 18:11 | 只看該作者
Ivy_Lee 發表于 2018-11-2 17:51
找到的30102官方測試程序,共享一下

謝謝分享 參與一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产三级网站 | 日本免费黄色 | 日韩靠逼| 精品视频一区二区三区在线观看 | 精精国产xxxx视频在线播放 | 九九热精品在线 | 成人久久久久久久久 | av毛片在线播放 | 久久久久久国产精品久久 | 日韩精品免费一区 | 久久99久久98精品免观看软件 | 2019精品手机国产品在线 | 一区二区三区免费 | 久久成人精品 | 国产精品久久久久一区二区三区 | 在线国产欧美 | 欧美日韩免费 | caoporn国产 | 一级做a爰片性色毛片16 | av永久 | 一级日批片| 九九热在线精品视频 | 国产精品a免费一区久久电影 | 久久久久久国产免费视网址 | 国产精品免费观看 | 天堂中文av| 亚洲国产精品成人无久久精品 | 欧美精品一区二区三区蜜桃视频 | 国产福利91精品一区二区三区 | 亚洲人成网站777色婷婷 | 黄色福利 | 国产精品视频一二三区 | 久久久久久999 | 亚洲情综合五月天 | 欧美日韩一区精品 | 综合久久av | 午夜视频在线免费观看 | 国产精品69毛片高清亚洲 | 免费人成在线观看网站 | 久久丝袜 | 久久久久亚洲 |