ScreenShow.ino 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. Description: This example shows how the HEART Unit obtains the original value of the heart rate detection and displays the line graph on the screen. Before the program runs, put the finger to the sensor detection position.
  3. Please install library before compiling:
  4. Arduino-MAX30100: https://github.com/oxullo/Arduino-MAX30100
  5. */
  6. #include <M5Stack.h>
  7. #include "MAX30100.h"
  8. #include <math.h>
  9. #define SAMPLING_RATE MAX30100_SAMPRATE_50HZ
  10. // The LEDs currents must be set to a level that avoids clipping and maximises the
  11. // dynamic range
  12. #define IR_LED_CURRENT MAX30100_LED_CURR_11MA
  13. #define RED_LED_CURRENT MAX30100_LED_CURR_11MA
  14. // The pulse width of the LEDs driving determines the resolution of
  15. // the ADC (which is a Sigma-Delta).
  16. // set HIGHRES_MODE to true only when setting PULSE_WIDTH to MAX30100_SPC_PW_1600US_16BITS
  17. #define PULSE_WIDTH MAX30100_SPC_PW_400US_14BITS
  18. #define HIGHRES_MODE true
  19. TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd);
  20. MAX30100 sensor;
  21. uint64_t realTime[4], time_count = 0;
  22. bool k_ready = false;
  23. void setup() {
  24. // put your setup code here, to run once:
  25. M5.begin();
  26. M5.Power.begin();
  27. M5.Lcd.setSwapBytes(false);
  28. Disbuff.createSprite(160, 160);
  29. Disbuff.setSwapBytes(true);
  30. Disbuff.createSprite(160, 160);
  31. if (!sensor.begin())
  32. {
  33. Serial.println("FAILED");
  34. for(;;);
  35. }
  36. else
  37. {
  38. Serial.println("SUCCESS");
  39. }
  40. sensor.setMode(MAX30100_MODE_SPO2_HR);
  41. sensor.setLedsCurrent(IR_LED_CURRENT, RED_LED_CURRENT);
  42. sensor.setLedsPulseWidth(PULSE_WIDTH);
  43. sensor.setSamplingRate(SAMPLING_RATE);
  44. sensor.setHighresModeEnabled(HIGHRES_MODE);
  45. sensor.resetFifo();
  46. }
  47. uint16_t line[2][320] = {0};
  48. int16_t k_number[320]={0};
  49. int16_t raw_data[512];
  50. int16_t k_min;
  51. int16_t k_threshold;
  52. uint32_t k_pos_buff[32];
  53. double k_pos_time[32];
  54. double k_standard_deviation, k_sumdata;
  55. uint32_t k_pos, k_pos_count = 0;
  56. uint32_t led_pos = 0, ir_Pos = 0;
  57. uint16_t ir_max = 0, led_max = 0, ir_min = 0, led_min = 0, ir_last = 0, led_last = 0;
  58. int16_t k_number_min = 0, k_number_max = 0, k_last = 0;
  59. uint16_t ir_last_raw = 0, led_last_raw = 0, k_last_raw = 0;
  60. uint16_t ir_disdata, led_disdata, k_disdata;
  61. uint16_t Alpha = 0.3 * 256;
  62. uint16_t count_min = 0, count_max = 0;
  63. void loop() {
  64. // put your main code here, to run repeatedly:
  65. uint16_t ir, red;
  66. //Serial.printf("raed fifo Length :%d\n", read_length);
  67. while(sensor.getRawValues(&ir, &red) == false)
  68. {
  69. delay(10);
  70. sensor.update();
  71. }
  72. while (1)
  73. {
  74. line[0][( led_pos + 160 )%320] = ( led_last_raw * ( 256 - Alpha ) + red * Alpha )/ 256;
  75. line[1][( ir_Pos + 160 )%320] = ( ir_last_raw * ( 256 - Alpha ) + ir * Alpha )/ 256;
  76. k_number[( led_pos + 160 )%320] = line[0][( led_pos + 160 )%320] - led_last_raw;
  77. led_last_raw = line[0][( led_pos + 160 )%320];
  78. ir_last_raw = line[1][( led_pos + 160 )%320];
  79. led_pos ++;
  80. ir_Pos ++;
  81. if(sensor.getRawValues(&ir, &red) == false)
  82. {
  83. break;
  84. }
  85. }
  86. sensor.resetFifo();
  87. for (int i = 0; i < 160; i++)
  88. {
  89. if( i == 0 )
  90. {
  91. led_max = led_min = line[0][( led_pos + i ) %320];
  92. ir_max = ir_min = line[1][( ir_Pos + i ) %320];
  93. k_number_min = k_number_max = k_number[( ir_Pos + i ) %320];
  94. }
  95. else
  96. {
  97. led_max = ( line[0][( led_pos + i ) %320] > led_max ) ? line[0][( led_pos + i ) %320] : led_max;
  98. led_min = ( line[0][( led_pos + i ) %320] < led_min ) ? line[0][( led_pos + i ) %320] : led_min;
  99. ir_max = ( line[1][( ir_Pos + i ) %320] > ir_max ) ? line[1][( ir_Pos + i ) %320] : ir_max;
  100. ir_min = ( line[1][( ir_Pos + i ) %320] < ir_min ) ? line[1][( ir_Pos + i ) %320] : ir_min;
  101. k_number_max = ( k_number[( ir_Pos + i ) %320] > k_number_max ) ? k_number[( ir_Pos + i ) %320] : k_number_max;
  102. k_number_min = ( k_number[( ir_Pos + i ) %320] < k_number_min ) ? k_number[( ir_Pos + i ) %320] : k_number_min;
  103. }
  104. }
  105. Disbuff.fillRect(0,0,160,160,BLACK);
  106. for (int i = 0; i < 160; i++ )
  107. {
  108. led_disdata = map( line[0][( led_pos + i ) %320] , led_max, led_min, 0, 160);
  109. ir_disdata = map( line[1][( ir_Pos + i ) %320] , ir_max, ir_min, 0, 160);
  110. k_disdata = map( k_number[( ir_Pos + i ) %320] , k_number_max, k_number_min, 0, 160);
  111. {
  112. Disbuff.drawLine( i, led_last, i + 1, led_disdata, WHITE);
  113. Disbuff.drawLine( i, ir_last, i + 1, ir_disdata, RED);
  114. Disbuff.drawLine( i, k_last, i + 1, k_disdata, GREEN);
  115. }
  116. ir_last = ir_disdata;
  117. led_last = led_disdata;
  118. k_last = k_disdata;
  119. }
  120. Disbuff.setTextSize(1);
  121. Disbuff.setTextColor(WHITE);
  122. Disbuff.setCursor(5,5);
  123. Disbuff.printf("led:%d,%d,%d",led_max, led_min, led_max - led_min );
  124. Disbuff.setCursor(5,15);
  125. Disbuff.printf("ir:%d,%d,%d",ir_max, ir_min, ir_max - ir_min );
  126. Disbuff.pushSprite(0,0);
  127. delay(10);
  128. }