Модуль оптического датчика сердечного ритма (пульса) MAX30100 – интегральный датчик пульса и насыщения крови кислородом. В данном датчике собраны: два светодиода красный и инфракрасный, фотодетектор, высокоточный аналоговый усилитель и преобразователь, цифровой обработчик и интерфейсный модуль. Для подключения датчика к контроллеру используется последовательный интерфейс I2C.
Распиновка
- VIN — вход питания.
- SCL — тактовый контакт, используемый для связи по протоколу I2C.
- SDA — контакт для передачи данных по протоколу I2C.
- INT — вывод прерывания.
- IRD — катод ИК-светодиода (обычно не подключается).
- RD — катод красного светодиода (обычно не подключается).
- GND — общий (земля).
Пример
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include <MAX30100.h> #include <MAX30100_BeatDetector.h> #include <MAX30100_Filters.h> #include <MAX30100_PulseOximeter.h> #include <MAX30100_Registers.h> #include <MAX30100_SpO2Calculator.h> #include <Wire.h> #define REPORTING_PERIOD_MS 500 PulseOximeter pox; const int numReadings=10; float filterweight=0.5; uint32_t tsLastReport = 0; uint32_t last_beat=0; int readIndex=0; int average_beat=0; int average_SpO2=0; bool calculation_complete=false; bool calculating=false; bool initialized=false; byte beat=0; void onBeatDetected() //Calls back when pulse is detected { viewBeat(); last_beat=millis(); } void viewBeat() { if (beat==0) { Serial.print("_"); beat=1; } else { Serial.print("^"); beat=0; } } void initial_display() { if (not initialized) { viewBeat(); Serial.print(" MAX30100 Pulse Oximeter Test"); Serial.println("******************************************"); Serial.println("Place place your finger on the sensor"); Serial.println("********************************************"); initialized=true; } } void display_calculating(int j){ viewBeat(); Serial.println("Measuring"); for (int i=0;i<=j;i++) { Serial.print(". "); } } void display_values() { Serial.print(average_beat); Serial.print("| Bpm "); Serial.print("| SpO2 "); Serial.print(average_SpO2); Serial.print("%"); } void calculate_average(int beat, int SpO2) { if (readIndex==numReadings) { calculation_complete=true; calculating=false; initialized=false; readIndex=0; display_values(); } if (not calculation_complete and beat>30 and beat<220 and SpO2>50) { average_beat = filterweight * (beat) + (1 - filterweight ) * average_beat; average_SpO2 = filterweight * (SpO2) + (1 - filterweight ) * average_SpO2; readIndex++; display_calculating(readIndex); } } void setup() { Serial.begin(115200); pox.begin(); pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { pox.update(); if ((millis() - tsLastReport > REPORTING_PERIOD_MS) and (not calculation_complete)) { calculate_average(pox.getHeartRate(),pox.getSpO2()); tsLastReport = millis(); } if ((millis()-last_beat>10000)) { calculation_complete=false; average_beat=0; average_SpO2=0; initial_display(); } } |







