Il sensore MAX30100 è una soluzione integrata per sensore di pulsossimetria e cardiofrequenzimetro. Combina due LED, un foto rilevatore, un’ottica ottimizzata e un elaboratore del segnale analogico a basso rumore. Il MAX30100 funziona con alimentazioni da 1,8 V e 3,3 V e può essere spento tramite software con corrente di standby trascurabile, consentendo in tal modo alla rete di rimanere sempre connessa.
Il MAX30100 dispone di un sensore di temperatura integrato nel chip che può essere utilizzato per compensare l’errore SpO2 (ovvero saturazione in ossigeno dell’emoglobina presente nel sangue arterioso) con variazioni di temperatura ambiente.
Nel nostro caso sulla scheda è comunque montato su un piccolo PCB dalle dimensioni di 19 x 14 mm con 7 pin in linea
Indice
Dove trovare il sensore
Il sensore potrà essere acquistato presso la ICStation.com. Il costo è di circa 6$ il suo codice è 8777
Schema elettrico del modulo
Lo schema del sensore MAX30100 per pulsossimetria e cardiofrequenzimetro è semplice in quanto è composto dall’ IC MAX30100 (datasheet) che funziona con tensioni di 1,8 V e 3,3 V, in particolare i 3,3V utilizzati per alimentare i due Led e la tensione di 1,8V per alimentare la circuiteria interna.
Per poterlo alimentare a con una tensione compresa tra i 1.8 e i 5,5V sul modulo sono presenti due regolatori per ottenere questa tensioni U2 (RCWL-9183) che fornisce in uscita la tensione di 3,3V e U3 che fornisce la 1.8V
Piedinatura de sensore
Schema a blocchi
Pin di collegamento del modulo sensore
Numero | Pin | Definizione dei pin |
---|---|---|
1 | VIN | Alimentazione 1.8-5.5V |
2 | SCL | I2C-SCL |
3 | SDA | I2C -SDA |
4 | INT | MAX 30100 INT - Interrupt attivo-basso (Open-Drain) |
5 | IRD | MAX 30100 IR_DRV - Catodo LED IR e LED Driver |
6 | RD | MAX 30100 R_DRV - Catodo LED rosso e LED Driver |
7 | GND | Alimentazione GND |
Libreria di gestione per Arduino
Per facilitare la gestione del sensore MAX30100 sono disponibili alcune libreria che potranno essere scaricate facilmente facendo uso della funzione Gestione librerie dell”IDE
A questo punto basterà inserire nel campo ricerca “max30100“, in questo modo appariranno due librerie, quella che è stata utilizzata è stata creata da OXullo, occorre premere il tasto Installa, Al termine dell’installazione apparirà la dicitura “INSTALLED“
Ora andando sotto la sezione Esempi, potrete trovare sotto la cartella “Esempi da librerie personalizzate” gli esempi inerenti la libreria Max30100
Test del modulo
Il cablaggio questo sensore è molto semplice. Per il test è stato utilizzato un Arduino Nano, come abbiamo visto il modulo può essere alimentato tramite la tensione fornita da Arduino, occorre poi collegare il modulo LCD su cui dovrà essere montato il modulo Bus I2C per poterlo pilotare.
Sia il modulo MAX30100 che il display 16×2, utilizzano il protocollo I2C ma operando con diversi indirizzi possono coesistere sullo stesso Bus.
I valori dei battiti cardiaci sono leggibili anche tramite il monitor seriale che dovrà essere impostato alla velocità di 115200 baud
Sotto sono riportati i relativi cablaggi.
Arduino Nano | Display LCD 16×2 con Modulo Expander bus I2C |
Per il test la scheda Arduino Nano, è stata montata sullo shield denominato Arduino Nano IO Shield prodotto dalla DFROBOT permette oltre che di istallare il modulo Arduino Nano di avere dei pin per il collegamento dei pin di Input e Output oltre che i pin di alimentazione. La scheda dispone inoltre di appositi pin per il collegamento di sensori e schede dotate di connessione I2C
Codice utilizzato
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 |
#include <Wire.h> #include "MAX30100_PulseOximeter.h" #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); #define REPORTING_PERIOD_MS 1000 // PulseOximeter is the higher level interface to the sensor // it offers: // * beat detection reporting // * heart rate calculation // * SpO2 (oxidation level) calculation PulseOximeter pox; uint32_t tsLastReport = 0; // Callback (registered below) fired when a pulse is detected void onBeatDetected() { Serial.println("Beat!"); } void setup() { Serial.begin(115200); lcd.begin(); //Init with pin default ESP8266 or ARDUINO lcd.backlight(); Serial.print("Initializing pulse oximeter.."); lcd.setCursor(0, 0); lcd.print("Batt: "); lcd.print (" "); lcd.print(" bpm"); lcd.setCursor(0, 1); lcd.print("Oss.: "); lcd.print (" "); lcd.print(" %"); // Initialize the PulseOximeter instance // Failures are generally due to an improper I2C wiring, missing power supply // or wrong target chip if (!pox.begin()) { Serial.println("FAILED"); for (;;); } else { Serial.println("SUCCESS"); } // The default current for the IR LED is 50mA and it could be changed // by uncommenting the following line. Check MAX30100_Registers.h for all the // available options. // pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA); // Register a callback for the beat detection pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { // Make sure to call update as fast as possible pox.update(); // Asynchronously dump heart rate and oxidation levels to the serial // For both, a value of 0 means "invalid" if (millis() - tsLastReport > REPORTING_PERIOD_MS) { Serial.print("Heart rate:"); Serial.print(pox.getHeartRate()); Serial.print("bpm / SpO2:"); Serial.print(pox.getSpO2()); Serial.println("%"); lcd.setCursor(6, 0); lcd.print (" "); lcd.setCursor(6, 0); lcd.print(pox.getHeartRate()); lcd.setCursor(6, 1); lcd.print (" "); lcd.setCursor(6, 1); lcd.print(pox.getSpO2()); tsLastReport = millis(); } } |