Saturimetro fai da te, Arduino e MAX30102

Ciao!

in questi giorni si ha carenza di vari dispositivi,
tra cui i pulsiossimetri (o saturimetri), strumenti grazie ai quali si può stimare la quantità di ossigeno nel sangue (wikipedia).

grazie ad un altro maker, che mi ha fatto notare la carenza di questi dispositivi e mi ha dato l'idea di questo progetto, sto facendo alcuni test basati sul modulo MAX30102 (di cui avevo parlato qui)

immagine ideegreen.it


Per il codice sono partito dall'esempio "Example8_SPO2" della libreria SparkFun_MAX3010x_Sensor_Library, ho modificato il codice solo per aggiungere la possibilità di visualizzare i valori sul display (ricordo che per poter caricare il codice di questo progetto dovete prima aver installato la libreria linkata sopra)

Ho messo tutto su GitHub a questo indirizzo in modo che chi vuole aiutarmi a migliorare il progetto (e c'è molto da migliorare) possa farlo.

Quindi è sufficiente fare il collegamento tra Arduino (va bene un Arduino qualsiasi, ma consiglio un Wemos perchè lo sketch è al limite della quantità di memoria dell'Atmega328 e potrebbe dare problemi con Arduino Uno, Nano etc), un display lcd i2c 16x2 ed il modulo MAX30102, in questo modo:




Per il collegamento con il Wemos, collegare:

SCL             - D1
SDA             - D2
VCC/VIN    - 5V
GND            - G

I componenti sono reperibili su eBay, altri ecommerce o vari shop specializzati


Ho creato anche un pezzo stampato in 3D per tenere fermo il dito davanti al sensore, questa cosa è fondamentale (almeno con il sensore che ho io) perchè un minimo movimento può sfalsare la misura.
In alternativa ho provato ad utilizzare elastici, mollette, mollette per appendini ma senza ottenere un risultato utilizzabile.

Il modello 3D lo trovate al link GitHub che ho messo sopra, è disegnato per il sensore che vedete qui sotto, che misura 14x14mm, ma se avete un altro sensore posso modificarvi il file da stampare (ho utilizzato Tinkercad)

Per la stampa ho usato il PLA, layer 0.3, ruotate il pezzo di 270° sull'asse Y in modo da avere la parte dove infilate il dito in alto. Questo per sfruttare l'elasticità dei layer vicino al piano.


Qui un video dove provo il dispositivo:



Purtroppo è ancora instabile ma sto cercando di migliorarlo, se volete contribuire andate sul link GitHub, pubblicherò periodicamente gli sviluppi.

Attenzione! i valori ottenuti da questo prototipo sono molto instabili e non sono da tenere in considerazione in ambito medico, questo vuole solo essere un esempio e sto cercando aiuto per riuscire ad ottenere dati attendibili.

23 commenti:

  1. Ottima iniziativa Daniele, utilissima in situazioni di emergenza come l'attuale.

    RispondiElimina
  2. Ho montato il saturimetro con basetta MH-ET LIVE con MAX30102 usato la libreria che hai usato tu, ma noto anche io una forte instabilità dei valori sopratutto dei battiti cardiaci, sarà un problema di sensore difettoso di codice non ottimizzato oppure il sensore ha caratteristiche troppo instabili.

    RispondiElimina
    Risposte
    1. Ciao Marco, anche io per i battiti ho notato una forte instabilità, mentre per la saturazione ho ottenuto un buon risultato con la molletta che ho stampato.
      Mi sembra che un fattore importante sia la luce solare che raggiunge il sensore più ancora del movimento.
      Prova al buio tenendo il dito sul sensore fermo per almeno 30 secondi.

      Fammi sapere

      Elimina
  3. Ciao Daniele, non ho un MAX30102, ma ho un sensore per il battito KY0039. E' sostanzialmente un led infrarosso e un fotodiodo. Sono riuscito a leggere i battiti e ho deciso di modificare il sensore aggiungendo anche un led rosso. Alterno la lettura di led rosso e led infrarosso perché confrontando le due letture si può ricavare il valore della saturazione. Col sensore che stai usando tu ottieni già il valore della saturazione o devi confrontare le letture dei due led? Ciao!

    RispondiElimina
    Risposte
    1. Ciao ginoplusio, lo sketch che ho usato è fondamentalmente un esempio della libreria del sensore, c'è una funzione della libreria che viene usata per calcolare la saturazione.
      Complimenti per il tuo progetto, se vuoi condividerlo posso provarlo e poi postarlo qui sul blog

      Elimina
    2. Ciao Daniele, sono andato un po' avanti. Ho messo tutto sul mio sito: https://www.barattalo.it/in-italiano/come-costruire-un-saturimetro/
      Resta un problema di stabilità della lettura della saturazione, che credo dipenda dalla mancanza di amplificazione del segnale in uscita dal fotodiodo, ma a questo punto temo di non essere in grado di proseguire! Se ti va di provare a farlo ne sarò stra-felice!

      Elimina
    3. Caspita complimenti per il progetto e per lo sviluppo, davvero molto interessante, cercherò di fare qualche prova, grazie!

      Elimina
  4. I valori sono instabili perchè quel sensore non è originale maxim! Prendetene uno originale (costo>15€) e poi vedrete che funziona benissimo!
    https://www.mouser.it/ProductDetail/Maxim-Integrated/MAXREFDES117?qs=L5CenAjuTY7RgAB22JU8Sw%3D%3D
    Già guardando l'interno del chip si vede che i 2 sono molto diversi...serve altro?

    RispondiElimina
    Risposte
    1. Grazie mille per la segnalazione, proverò. Buona giornata

      Elimina
  5. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  6. Ciao Daniele, potresti inviarmi il codice arduino che sia in grado di leggere sia i battiti che l'ossigenazione sanguigna come nel video che hai inserito? Provando ad usare il codice che hai inserito sul tuo sito mi viene solamente misurata la SpO2

    RispondiElimina
  7. Ciao Daniele, aiuto! ho acquistato due sensori come il primo che mostri nella pagina (quello dove mostri il cablaggio) li ho provati con "UNO", "NANO" e "MEGA 2560" il programma va in loop nella fase di inizializzazione, sai darmi qualche indicazione? Grazie

    RispondiElimina
  8. Sono riuscito a farli funzionare solo con ESP8266 ma i valori SPO2 rilevati sono fuorida ogni logica.

    RispondiElimina
    Risposte
    1. Ciao Paolo, confermo che con il Wemos (ESP8266) "funziona", da quello che ho notato io la cosa molto critica è realizzare bene il supporto. Non deve filtrare assolutamente luce esterna

      Elimina
    2. Questo commento è stato eliminato dall'autore.

      Elimina
    3. Ho scoperto l'arcano, a questo link c'è la spiegazione. https://reedpaper.wordpress.com/2018/08/22/pulse-oximeter-max30100-max30102-how-to-fix-wrong-board/

      Elimina
    4. Grazie mille per il feedback Paolo

      Elimina
    5. Questo commento è stato eliminato dall'autore.

      Elimina
    6. Questo commento è stato eliminato dall'autore.

      Elimina
    7. Ho acquistato questo, sembra che abbiano risolto il problema della tensione di pullup I2C consentendo la commutazione 1,8/3,3 Volt mediante saldatura. Visto che costa solo 7€ e sembra abbia il sensore originale MAX30102 ve lo indico. Arriva domani.
      https://www.amazon.it/gp/product/B07RDJLSHY/ref=ox_sc_act_image_2?smid=A3BI8G9NTBZUKM&psc=1

      Elimina
    8. Grazie mille per la segnalazione, facci sapere!

      Elimina
  9. Comunque ora funziona, ma la funzione SPO2 è assolutamente inaffidabile, fa delle variazioni da 0% a 100%, è un po' più stabile con arduino UNO e NANO (variazioni di un 10%, ancora troppo per un valore che è normale tra 90% e 100%, inoltre con ATMEGA328 la memoria è al limite e non è possibile implementare un display.

    RispondiElimina
  10. Ciao, sto provando ad usare il tuo Sketch ma mi da questo errore "I2C_SPEED_FAST' was not declared in this scope"
    Sai dirmi come risolvere?

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post