Per visą šį laiką parodėme daugybę Elektroniniai komponentai suderinama su tokios plokštės kaip Arduino arba suderinamos, taip pat daugeliui kitų gamintojų ar „pasidaryk pats“ darbų. Dabar supažindinsime jus su moduliu MAX30102, kuriame yra jutiklis pulsui ir kraujo deguoniui matuoti.
Tokiu būdu taip pat galite sukurti nešiojamų daiktų, pvz., pačių pasigamintų veiklos apyrankių ar aparatinę įrangą stebėti sveikatos būklę asmens, teikiančio minėto asmens biometrinius ar telemetrijos duomenis, nes šiame įrenginyje yra integruotas širdies ritmo monitorius ir oksimetras...
Kas yra širdies ritmo monitorius? Kaip tai veikia?
Un pulso jutiklis arba širdies ritmo monitorius Tai elektroninis prietaisas, naudojamas žmogaus širdies ritmui matuoti realiu laiku. Jis daugiausia naudojamas sporto srityje, norint stebėti našumą ir pastangas treniruočių metu arba kasdien. Širdies ritmo monitoriai yra populiarūs tarp sportininkų, tačiau jie taip pat yra pagrindinis prietaisas medicinos centruose, norint sužinoti širdies susitraukimų dažnį, ty širdies susitraukimų dažnį arba dūžius per minutę:
- PR Bpm: rodo širdies susitraukimų dažnį, ty dūžių skaičių per minutę.
Visais atvejais, Jutikliai fiksuoja kraujo tūrio pokyčius su kiekvienu širdies plakimu. Šis pokytis paverčiamas elektriniu signalu, kuris apdorojamas širdies ritmui gauti. Kai kurie širdies ritmo monitoriai taip pat turi stiprinimo ir triukšmo slopinimo grandines, kad pagerintų rodmenų tikslumą.
Kas yra oksimetras? Kaip tai veikia?
Un oksimetras yra medicinos ar sporto prietaisas kuris naudojamas kraujo prisotinimui deguonimi matuoti. Šis prietaisas pateikia kraujo prisotinimo deguonimi duomenis, kurių reikšmės yra nuo 0 iki 100%. Įprasta, kad tame pačiame įrenginyje yra ir širdies ritmo parinktis, nurodanti visą stebėjimo ar įrašymo informaciją.
Los datos eilė matuoja oksimetrą yra:
- %SpO2: nurodo deguonies prisotinimo kraujyje procentą.
Oksimetras dedamas kaip spaustukas taip, kad būtų pritaikytas mūsų piršto morfologijai arba galėtų būti dedamas ir kitose kūno vietose, kaip yra širdies ritmo monitoriaus atveju, pavyzdžiui, ant riešo, pvz. galima pamatyti daugelyje veiklos apyrankių.
Kalbant apie jų veikimą, oksimetrai skleidžia skirtingus šviesos bangos ilgiai kurie praeina per odą. Šią šviesą veikia hemoglobinas – kraujo molekulė, atsakinga už deguonies pernešimą, sugerianti skirtingą šviesos kiekį, priklausomai nuo pernešamo deguonies lygio. Išsamus procesas yra toks:
- šviesos emisija- Oksimetras skleidžia dviejų bangų ilgių šviesą, vieną raudoną ir vieną infraraudonųjų spindulių, kurios praeina per pirštą, uždėtą ant prietaiso.
- Šviesos absorbcija: Hemoglobinas, raudonųjų kraujo kūnelių molekulė, pernešanti deguonį, sugeria skirtingą šių šviesų kiekį. Deguonies pripildytas hemoglobinas (oksihemoglobinas) ir hemoglobinas be deguonies (deoksihemoglobinas) turi skirtingas šviesos sugerties savybes.
- Šviesos aptikimas: Detektorius, esantis priešingoje šviesos skleidėjo pusėje, surenka šviesą, pratekusią per pirštą.
- Deguonies prisotinimo skaičiavimas- Prietaisas apskaičiuoja oksihemoglobino santykį su visu esamu hemoglobino kiekiu, tiek oksihemoglobinu, tiek deoksihemoglobinu. Ši proporcija pateikiama kaip kraujo prisotinimo deguonimi procentinė dalis (%SpO2). Tai atliekama naudojant procesorių, galintį interpretuoti šiuos elektrinius signalus ir paversti juos skaitine verte.
Kas yra MAX30102 modulis?
Jutiklis MAX30102, gamintojas Maxim Integrated, yra integruotas prietaisas, apjungiantis širdies ritmo monitoriaus ir oksimetro funkcijas. Šis jutiklis gali būti lengvai naudojamas su mikrovaldikliu, pvz., Arduino. MAX30102 priklauso šios firmos MAX3010x optinių jutiklių serijai.
Jo veikimas pagrįstas šviesos sugerties kraujyje svyravimais, priklausomai nuo jo deguonies prisotinimo lygis ir pulsas kaip minėjau dviejuose ankstesniuose skyriuose. Šis jutiklis turi du šviesos diodus, vieną raudoną ir vieną infraraudonųjų spindulių. Jis dedamas ant odos, pavyzdžiui, ant piršto ar riešo, ir aptinka atspindėtą šviesą, kad nustatytų deguonies prisotinimo laipsnį.
Vykdomas ryšys su MAX30102 per I2C magistralę, todėl lengva prisijungti prie mikrovaldiklio, pvz., Arduino. MAX30102 reikia dvigubo maitinimo šaltinio: 1.8 V logikai ir 3.3 V šviesos diodams. Paprastai randama 5 V moduliuose, kuriuose jau yra būtinas lygio suderinimas.
La optinė pulso oksimetrija Tai neinvazinis metodas, leidžiantis nustatyti deguonies prisotinimo procentą kraujyje. Kaip jau minėjau anksčiau, jis pagrįstas hemoglobino (Hb) ir oksihemoglobino (HbO2) šviesos sugerties koeficientų skirtumu skirtingiems bangos ilgiams. Kraujas, kuriame gausu deguonies, sugeria daugiau infraraudonųjų spindulių, o mažai deguonies turintis kraujas sugeria daugiau raudonos šviesos. Kūno vietose, kur oda pakankamai plona ir po ja yra kraujagyslės, pagal šį skirtumą galima nustatyti deguonies prisotinimo laipsnį.
Modulio MAX30102 su pulso ir kraujo deguonies jutikliu savybės
MAX30102 apima:
- 2x šviesos diodai, vienas raudonas (660 nm) ir vienas infraraudonasis (880 nm)
- 2x fotodiodai atspindėtai šviesai matuoti
- 18 bitų ADC keitiklis, kurio diskretizavimo dažnis yra nuo 50 iki 3200 mėginių per sekundę.
- Be to, jame yra reikalinga elektronika signalo stiprinimui ir filtravimui, aplinkos šviesos panaikinimui, 50-60Hz dažnių (dirbtinės šviesos) atmetimui ir temperatūros kompensavimui.
Modulio suvartojimas gali siekti iki 50mA matavimo metu, nors intensyvumą galima reguliuoti programiškai, naudojant mažos galios režimą 0.7 µA matavimų metu.
Kaina ir kur nusipirkti
MAX30102 jutikliai pulsui ir kraujo deguoniui matuoti jie yra gana pigūs. Šie moduliai gali būti jūsų vos už kelis eurus tokiose svetainėse kaip „eBay“, „Aliexpress“ ar „Amazon“. Pamatysite, kad yra keletas tipų, todėl rekomenduojame:
Ryšiai ir pavyzdys su Arduino
Norint išbandyti MAX30102 su Arduino, pirmas dalykas yra prijungti šį modulį prie Arduino plokštės. Tai ryšys yra labai paprastas, tereikia prijungti šiuos dalykus:
- Modulio Vcc turi būti prijungtas prie Arduino plokštės 5V išvesties.
- Modulio GND turi būti prijungtas prie Arduino plokštės GND lizdo.
- Modulio SCL turi būti prijungtas prie vieno iš analoginių Arduino plokštės įėjimų, pvz., A5.
- Modulio SDA turi būti prijungtas prie kitų Arduino plokštės analoginių įėjimų, tokių kaip A4.
Kai bus sukurti atitinkami ryšiai tarp MAX30102 plokštės ir Arduino plokštės, kitas dalykas bus parašyti šaltinio kodą arba eskizą, kad jis veiktų, ir pradėti gauti biometrinius duomenis iš atitinkamo asmens. Tai taip paprasta, kaip įrašyti šį kodą „Arduino IDE“ ir užprogramuokite lentą:
#include <Wire.h> #include "MAX30105.h" #include "spo2_algorithm.h" MAX30102 pulsioximetro; #define MAX_BRIGHTNESS 255 #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) //Arduino Uno no tiene suficiente SRAM para almacenar 100 muestreos, por lo que hay que truncar las muestras en 16-bit MSB. uint16_t pulsoBuffer[100]; //infrared LED sensor data uint16_t oxiBuffer[100]; //red LED sensor data #else uint32_t pulsoBuffer[100]; //Sensores uint32_t oxiBuffer[100]; #endif int32_t BufferLongitud; //Longitud de datos int32_t spo2; //Valor de SPO2 int8_t SPO2valido; //Indicador de validez del valor SPO2 int32_t rangopulsacion; //PR BPM o pulsaciones int8_t validrangopulsacion; //Indicador de validez del valor PR BPM byte pulsoLED = 11; //Pin PWM byte lecturaLED = 13; //Titila con cada lectura void setup() { Serial.begin(115200); // Inicia la comunicación con el microcontrolador a 115200 bits/segundo pinMode(pulsoLED, OUTPUT); pinMode(lecturaLED, OUTPUT); // Inicializar sensores if (!pulsioximetro.begin(Wire, I2C_SPEED_FAST)) //Usar el bus I2C a 400kHz { Serial.println(F("MAX30102 no encontrado. Por favor, comprueba la conexión y alimentación del módulo.")); while (1); } Serial.println(F("Pon el sensor en contacto con tu dedo y presiona cualquier tecla para iniciar la conversión.")); while (Serial.available() == 0) ; //Esperar hasta que se pulsa una tecla Serial.read(); byte brilloLED = 60; //Opciones: 0=Apagado hasta 255=50mA byte mediaMuestreo = 4; //Opciones: 1, 2, 4, 8, 16, 32 byte ModoLED = 2; //Opciones: 1 = Rojo solo, 2 = Rojo + IR, 3 = Rojo + IR + Verde byte rangoMuestreo = 100; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200 int anchoPulso = 411; //Opciones: 69, 118, 215, 411 int rangoADC = 4096; //Opciones: 2048, 4096, 8192, 16384 pulsioximetro.setup(brilloLED, mediaMuestreo, ModoLED, rangoMuestreo, anchoPulso, rangoADC); //Configuración del módulo } void loop() { BufferLongitud = 100; //10 almacenamientos en el buffer con 4 segundos corriendo a 25sps //Leer las primeras 100 muestras for (byte i = 0 ; i < BufferLongitud ; i++) { while (pulsioximetro.available() == false) //Comprobar nuevos datos pulsioximetro.check(); oxiBuffer[i] = pulsioximetro.getRed(); pulsoBuffer[i] = pulsioximetro.getIR(); pulsioximetro.siguienteMuestreo(); //Muestreo terminado, ir al siguiente muestreo Serial.print(F("red=")); Serial.print(oxiBuffer[i], DEC); Serial.print(F(", ir=")); Serial.println(pulsoBuffer[i], DEC); } //Calcular el valor del pulso PM y SpO2 tras los primeros 100 samples maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion); //Calcular muestreos continuos while (1) { //Volcar los 25 primeros valores en memoria y desplazar los últimos 75 arriba for (byte i = 25; i < 100; i++) { oxiBuffer[i - 25] = oxiBuffer[i]; pulsoBuffer[i - 25] = pulsoBuffer[i]; } for (byte i = 75; i < 100; i++) { while (pulsioximetro.available() == false) //Comprobar si existen nuevos datos pulsioximetro.check(); digitalWrite(lecturaLED, !digitalRead(lecturaLED)); //Parpadea el LED on-board con cada dato oxiBuffer[i] = pulsioximetro.getRed(); pulsoBuffer[i] = pulsioximetro.getIR(); pulsioximetro.siguienteMuestreo(); //Al finalizar, moverse al siguiente muestreo Serial.print(F("Oxígeno=")); Serial.print(oxiBuffer[i], DEC); Serial.print(F(", Pulso=")); Serial.print(pulsoBuffer[i], DEC); Serial.print(F(", HR=")); Serial.print(rangopulsacion, DEC); Serial.print(F(", HRvalid=")); Serial.print(validrangopulsacion, DEC); Serial.print(F(", SPO2=")); Serial.print(spo2, DEC); Serial.print(F(", SPO2 válido=")); Serial.println(SPO2valido, DEC); } //Recalcular tras los primeros muestreos maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion); } }
Žinoma, kodą galite modifikuoti pagal savo poreikius, tai tik pavyzdys...