- Sensore MAX30100
- Componenti richiesti
- Interfacciamento dell'ossimetro MAX30100 con ESP32
- Adafruit IO con ESP32 per il monitoraggio della frequenza cardiaca
- Spiegazione del codice
- Dimostrazione del pulsossimetro basato su IoT
La pulsossimetria è uno strumento di misurazione medico ampiamente utilizzato ed è un test non invasivo e indolore che misura il livello di saturazione dell'ossigeno nel nostro sangue che può facilmente rilevare piccoli cambiamenti nell'ossigeno. Nell'attuale situazione del Covid-19, è diventato importante monitorare il livello di ossigeno di più pazienti contemporaneamente a distanza senza entrare in contatto con il paziente.
Quindi, in questo progetto, costruiamo un pulsossimetro utilizzando il pulsossimetro MAX30100 e l'ESP32 che monitoreranno il livello di ossigeno nel sangue e invieranno i dati tramite Internet collegandosi a una rete Wi-Fi. In questo modo, possiamo monitorare più pazienti da remoto mantenendo la distanza sociale con i pazienti. I dati ottenuti verranno mostrati come un grafico che facilita il monitoraggio e l'analisi delle condizioni del paziente. In precedenza, abbiamo anche costruito altri cardiofrequenzimetri utilizzando sensori di pulsazioni. E se sei interessato ad altri progetti relativi a Covid-19, puoi controllare il termometro del corpo umano, il termometro IR intelligente per il monitoraggio della febbre e lo scanner della temperatura a parete che abbiamo costruito in precedenza.
Oltre all'applicazione Covid-19, questo progetto può essere ampiamente utilizzato anche nella broncopneumopatia cronica ostruttiva (BPCO), nell'asma, nella polmonite, nel cancro ai polmoni, nell'anemia, nell'infarto o nell'insufficienza cardiaca o nei difetti cardiaci congeniti.
Si noti che il sensore utilizzato in questo progetto non è classificato dal punto di vista medico e il progetto non è testato per applicazioni a prova di guasto. Utilizzare sempre un pulsossimetro classificato dal punto di vista medico per determinare il polso e il livello di ossigeno del paziente e discuterne con un medico. Il progetto qui discusso è solo per scopi educativi.
Sensore MAX30100
Il sensore MAX30100 è un modulo per pulsossimetria e cardiofrequenzimetro integrato. Comunica con la linea dati I2C e fornisce le informazioni su SpO2 e Pulse all'unità microcontrollore host. Utilizza fotorilevatori, elementi ottici in cui il LED IR rosso e verde modula gli impulsi del LED. La corrente del LED è configurabile da 0 a 50mA. L'immagine sotto mostra il sensore MAX30100.
Il modulo sensore di cui sopra funziona con 1,8 V nella gamma 5,5 V. Le resistenze pull-up per i pin I2C sono incluse nel modulo.
Componenti richiesti
- Una connessione WiFi
- ESP32
- Sensore MAX30100
- ID utente Adafruit IO e un dashboard creato su misura (lo farà ulteriormente)
- Alimentatore adeguato da 5V con corrente nominale di almeno 1A
- Cavo USB da Micro USB a USBA
- Un PC con IDE Arduino con ambiente di programmazione ESP32.
Interfacciamento dell'ossimetro MAX30100 con ESP32
Di seguito è riportato lo schema elettrico completo per MAX30100 con ESP32.
Questo è uno schema molto semplice. I pin 21 e 22 del devkit C ESP32 sono collegati al sensore del pulsossimetro MAX30100 con i pin SDA e SCL. L'Ossimetro è anche alimentato dal pin 5V sulla scheda di sviluppo ESP32. Ho effettuato la connessione utilizzando una breadboard e cavi di collegamento e la mia configurazione di test è simile a questa:
Adafruit IO con ESP32 per il monitoraggio della frequenza cardiaca
Abbiamo già realizzato molti progetti IO Adafruit per diverse applicazioni IoT. Adafruit IO è un'ottima piattaforma in cui è possibile creare una dashboard personalizzata. Per creare il dashboard personalizzato per il sensore pulsossimetro basato su IoT, utilizzare i passaggi seguenti:
Passaggio 1: prima iscriviti a adafruit IO dopo aver fornito il nome di Fist, il cognome, l'indirizzo e-mail, il nome utente e la password.
Passaggio 2: la finestra del dashboard vuota si aprirà al termine del processo di accesso. In questo segmento, dovremo creare una dashboard per mostrare i dati in vari modi. Pertanto, è il momento di creare il nuovo dashboard e fornire il nome del dashboard e la descrizione.
Passaggio 3: dopo aver compilato il modulo sopra, è il momento di creare il grafico e la sezione di controllo per il sensore.
Seleziona il blocco interruttori. Sarà necessario per accendere o spegnere il sensore del pulsossimetro.
Passaggio 4: annota il nome del blocco. Come possiamo vedere nell'immagine sopra, la funzione di commutazione fornirà due stati, ON e OFF. Nello stesso processo, seleziona il blocco grafico.
Questa sezione del grafico deve essere selezionata due volte poiché verranno visualizzati due grafici, Heart bit e SpO2. Vengono create entrambe le sezioni. Come possiamo vedere, abbiamo selezionato tutte le funzionalità di input e output.
Passaggio 5: il passaggio successivo e finale è avere la chiave adafruit. Come possiamo vedere, otteniamo la chiave adafruit e questa deve essere aggiunta nel codice.
L'Adafruit IO è ora configurato. È ora di preparare l'hardware e creare il firmware per questo progetto.
Spiegazione del codice
Questo codice utilizza molte librerie e tutte sono importanti. Le librerie sono la libreria del sensore pulsossimetro MAX30100 , Wire.h per I2C, WiFi.h per il supporto relativo al WiFi in ESP32, Adafruit MQTT e libreria client MQTT . Il programma completo si trova in fondo a questa pagina.
Le librerie sopra menzionate sono incluse all'inizio del codice.
#includere
Le due definizioni successive sono l'SSID WLAN e la password WLAN. Questo deve essere esatto e verrà utilizzato dall'ESP32 per connettersi alla rete WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Successivamente, abbiamo definito le definizioni io di Adafruit.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
La velocità di aggiornamento aggiornerà i dati ogni 5 secondi, il server sarà io.adafruit.com con una porta del server del 1883. Il nome utente e la password saranno il nome utente e la password generati dal dashboard IO di adafruit. Sarà diverso per tutti e dovrà essere generato come descritto nella sezione di configurazione di adafruit.
Le porte I2C vengono definite successivamente come mostrato nello schema.
#define I2C_SDA 21 #define I2C_SCL 22
Successivamente, tre variabili vengono utilizzate per memorizzare l'ultimo rapporto e il valore bpm e spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
L'MQTT funziona con un modello pub-sub (pubblica e iscriviti). In questo modello di lavoro, il dispositivo che invia i dati al server Adafruit rimane in modalità di pubblicazione in cui il server Adafruit IO sottoscrive gli stessi punti dati. In tal senso, ogni volta che il dispositivo pubblica un nuovo dato, il server, in quanto iscritto allo stesso, riceve i dati e fornisce l'azione necessaria.
La stessa cosa accade quando il server pubblica i dati e il dispositivo si iscrive ad essi. Nella nostra applicazione, il dispositivo invia i dati di SPO2 e BPM al server, quindi pubblica gli stessi e riceve lo stato ON-OFF dal server, iscrivendosi così a questo. Questa cosa è configurata nello snippet di codice descritto di seguito-
Client WiFiClient; Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Notare che i percorsi MQTT per AIO seguono il modulo:
Nella funzione di configurazione , stiamo avviando l'I2C, collegando il WiFi con l'SSID e la password predefiniti e avviando il processo di abbonamento MQTT per lo stato di commutazione (il pulsante di commutazione creato nel dashboard IO di Adafruit).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {ritardo (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi connesso"); Serial.println ("indirizzo IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inizializzazione del pulsossimetro in corso.."); // Inizializza l'istanza PulseOximeter // I guasti sono generalmente dovuti a un cablaggio I2C improprio, alimentazione mancante // o chip di destinazione errato se (! Pox.begin ()) {Serial.println ("FAILED"); per(;;); } altro {Serial.println ("SUCCESS"); } // La corrente predefinita per il LED IR è 50 mA e potrebbe essere modificata // rimuovendo il commento dalla riga seguente. Controlla MAX30100_Registers.h per tutte le // opzioni disponibili. vaiolo.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registra una richiamata per il rilevamento dei battiti pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Dopo tutto questo, il max30100 viene avviato con un'impostazione della corrente del led. Diverse impostazioni correnti sono disponibili anche nei file di intestazione MAX30100 per diverse configurazioni. Viene inoltre avviata una funzione di richiamata per il rilevamento del battito cardiaco. Dopo tutte queste impostazioni, il sensore del saturimetro viene arrestato.
Nella funzione loop , la connessione MQTT viene avviata e il modello di abbonamento viene verificato ogni 5000 millisecondi. In questa situazione, se l'interruttore è acceso, inizia a leggere il sensore del saturimetro e pubblica i dati del battito cardiaco e il valore di SPO2. Se l'interruttore è spento, sospende tutte le attività relative al sensore del pulsossimetro.
void loop () {MQTT_connect (); Abbonamento Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Starting POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funzione che implementa l'attività. * / "pox_read", / * Nome testo per l'attività. * / 1024 * 3, / * Dimensione dello stack in parole, non byte. * / NULL, / * Parametro passato all'attività. * / 2, / * Priorità alla quale l'attività viene creata. * / & poxReadTaskHld); / * Utilizzato per distribuire l'handle dell'attività creata. * /} ritardo (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funzione che implementa l'attività. * / "mqttPub", / * Nome testo per l'attività. * / 1024 * 3, / * Dimensione dello stack in parole, non in byte. * / NULL, / * Parametro passato all'attività. * / 2, / * Priorità in cui viene creata l'attività. * / & mqttPubTaskHld); / * Utilizzato per distribuire l'handle dell'attività creata. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina l'attività MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Utilizzato per distribuire l'handle dell'attività creata. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina l'attività MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Utilizzato per distribuire l'handle dell'attività creata. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina l'attività MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Dimostrazione del pulsossimetro basato su IoT
Il circuito è collegato correttamente in una breadboard e il programma fornito di seguito viene caricato su ESP32. Assicurati di modificare di conseguenza le credenziali Wi-Fi e Adafruit nel codice per farlo funzionare per te.
Dopo la connessione con il WiFi e il server IO Adafruit, ha iniziato a funzionare come previsto.
Come possiamo vedere, il livello di SPO2 mostra il 96% e il battito cardiaco mostra da 78 a 81 bit al minuto. Fornisce anche l'ora in cui i dati vengono acquisiti.
Come possiamo vedere nell'immagine sopra, l'interruttore è spento e il dato è 0. Il video completo di lavoro del progetto si trova anche in fondo a questa pagina.
Spero che l'articolo ti sia piaciuto e abbia imparato qualcosa di utile, se hai domande, lasciale nella sezione commenti qui sotto o pubblicale sui nostri forum.