- MAX30100-sensor
- Nödvändiga komponenter
- Gränssnitt MAX30100 Oximeter med ESP32
- Adafruit IO med ESP32 för pulsmätning
- Kodförklaring
- IoT-baserad demonstration av pulsoximeter
Pulsoximetri är ett allmänt använt medicinskt mätinstrument och det är ett icke-invasivt och smärtfritt test som mäter syremättnadsnivån i vårt blod som lätt kan upptäcka små förändringar i syre. I den nuvarande Covid-19-situationen har det blivit viktigt att spåra syrehalten hos flera patienter samtidigt på distans utan att komma i kontakt med patienten.
Så i det här projektet bygger vi en pulsoximeter med MAX30100 Pulsoximeter och ESP32 som spårar syrehalten i blodet och skickar data via internet genom att ansluta till ett Wi-Fi-nätverk. På så sätt kan vi fjärrövervaka flera patienter genom att bibehålla det sociala avståndet med patienterna. De erhållna uppgifterna visas som ett diagram som gör det lättare att spåra och analysera patientens tillstånd. Tidigare har vi också byggt andra pulsmätare med pulssensorer. Och om du är intresserad av andra Covid-19-relaterade projekt kan du kolla in människokroppstermometern, Smart IR-termometern för feberövervakning och den väggmonterade temperaturskannern som vi byggde tidigare.
Förutom Covid-19-applikationen kan detta projekt också användas i stor utsträckning vid kronisk obstruktiv lungsjukdom (KOL), astma, lunginflammation, lungcancer, anemi, hjärtinfarkt eller hjärtsvikt eller vid medfödda hjärtfel.
Observera att sensorn som används i detta projekt inte är medicinskt rankad och att projektet inte testas för felsäkra applikationer. Använd alltid en medicinskt klassad pulsoximeter för att bestämma patientens puls- och syrenivå och diskutera den med en läkare. Projektet som diskuteras här är endast för utbildningsändamål.
MAX30100-sensor
MAX30100-sensorn är integrerad pulsoximetri och pulsmätarmodul. Den kommunicerar med I2C- datalinjen och tillhandahåller SpO2- och pulsinformation till värdmikrostyrenheten. Den använder fotodetektorer, optiska element där röd, grön IR-LED modulerar LED-pulserna. LED-strömmen kan konfigureras från 0 till 50mA. Bilden nedan visar MAX30100-sensorn.
Ovanstående sensormodul fungerar med 1,8 V till 5,5 V. Upptagsmotstånden för I2C-stiften ingår i modulen.
Nödvändiga komponenter
- En WiFi-anslutning
- ESP32
- MAX30100-sensor
- Adafruit IO-användar-id och en anpassad instrumentpanel (kommer att göra det längre)
- 5V adekvat strömförsörjningsenhet med märkströmmen minst 1A
- USB-kabel Micro USB till USBA
- En dator med Arduino IDE med ESP32-programmeringsmiljö.
Gränssnitt MAX30100 Oximeter med ESP32
Det fullständiga kretsschemat för MAX30100 med ESP32 ges nedan.
Detta är ett mycket enkelt schema. Stift 21 och 22 på ESP32 devkit C är ansluten med pulsoximetersensor MAX30100 med SDA- och SCL-stiften. Oximetern drivs också av 5V-stiftet på ESP32-utvecklingskortet. Jag upprättade min anslutning med en bräda och anslutande ledningar och min testinställning ser ut så här-
Adafruit IO med ESP32 för pulsmätning
Vi har tidigare byggt många Adafruit IO-projekt för olika IoT-applikationer. Adafruit IO är en utmärkt plattform där en anpassad instrumentpanel kan skapas. För att skapa den anpassade instrumentpanelen för IoT-baserad pulsoximetersensor, använd nedanstående steg -
Steg 1: Registrera dig först i adafruit IO efter att du har angett Fist-namnet, efternamnet, e-postadressen, användarnamnet och lösenordet.
Steg 2: Det tomma instrumentpanelfönstret öppnas när inloggningsprocessen är klar. I detta segment måste vi skapa en instrumentpanel för att visa data på olika sätt. Således är det dags att skapa den nya instrumentpanelen och ange instrumentpanelens namn och beskrivningen.
Steg 3: Efter att ha fyllt i formuläret ovan är det dags att skapa diagram och kontrollavsnitt för sensorn.
Välj omkopplare. Det krävs för att slå på eller stänga av pulsoximetersensorn.
Steg 4: Skriv ner blocknamnet. Som vi kan se i bilden ovan kommer växlingsfunktionen att ge två tillstånd, PÅ och AV. I samma process väljer du grafblocket.
Det här grafavsnittet måste väljas två gånger eftersom två grafer visas, Heart bit och SpO2. Båda sektionerna skapas. Som vi kan se har vi valt alla in- och utgångsfunktioner.
Steg 5: Nästa och sista steg är att ha adafruit-nyckeln. Som vi kan se får vi adafruit-nyckeln och detta måste läggas till i koden.
Adafruit IO är nu konfigurerad. Det är dags att förbereda hårdvaran och skapa firmware för detta projekt.
Kodförklaring
Den här koden använder många bibliotek och alla är viktiga. Biblioteken är MAX30100 pulsoximetersensorbibliotek, Wire.h för I2C, WiFi.h för WiFi-relaterat stöd i ESP32, Adafruit MQTT och MQTT Client- biblioteket. Hela programmet hittar du längst ner på denna sida.
De bibliotek som nämns ovan ingår i början av koden.
#omfatta
Nästa två definitioner är WLAN SSID och WLAN Password. Detta måste vara exakt och det kommer att användas av ESP32 för att ansluta till WiFi-nätverket.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Därefter definierade vi Adafruit io-definitionerna.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Uppdateringshastigheten kommer att uppdatera data på var 5: e sekund, servern kommer att io.adafruit.com med en serverport på 1883. Användarnamnet och lösenordet kommer att genereras användarnamn och lösenord från adafruit IO instrumentpanelen. Det kommer att vara annorlunda för alla och måste genereras som beskrivs i avsnittet om installation av adafruit.
I2C-portarna definieras efteråt som visas i schemat.
#define I2C_SDA 21 #define I2C_SCL 22
Därefter används tre variabler för att lagra den senaste rapporten och bpm- och spo2-värdet.
uint32_t tsLastReport = 0; flyta bpm_dt = 0; float spo2_dt = 0;
MQTT fungerar med en pub-sub-modell (publicera och prenumerera). I den här arbetsmodellen förblir enheten som skickar data till Adafruit-servern i publiceringsläge där Adafruit IO-servern prenumererar på samma datapunkter. I en sådan effekt, när enheten publicerar någon ny data, tar servern emot den och den ger nödvändiga åtgärder när den prenumererar på densamma.
Samma sak händer när servern publicerar data och enheten prenumererar på den. I vår applikation skickar enheten data från SPO2 och BPM till servern, så den publicerar densamma och den får ON-OFF-tillståndet från servern och prenumererar därmed på den här. Den här saken är konfigurerad i kodavsnittet som beskrivs nedan-
WiFiClient-klient; Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Observera MQTT-banor för AIO följ formuläret:
I installationsfunktionen startar vi I2C, ansluter WiFi med det fördefinierade SSID och lösenord och startar MQTT-prenumerationsprocessen för växlingstillståndet (omkopplarknappen skapad i Adafruit IO-instrumentpanelen).
ogiltig installation () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); medan (WiFi.status ()! = WL_CONNECTED) {fördröjning (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi-ansluten"); Serial.println ("IP-adress:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Initierar pulsoximeter.."); // Initiera PulseOximeter-instansen // Fel beror vanligtvis på felaktig I2C-ledning, saknad strömförsörjning // eller fel målchip om (! Pox.begin ()) {Serial.println ("FAILED"); för(;;); } annat {Serial.println ("SUCCESS"); } // Standardströmmen för IR-lysdioden är 50 mA och den kan ändras // genom att avmarkera följande rad. Kontrollera MAX30100_Registers.h för alla // tillgängliga alternativ. koppar.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registrera en återuppringning för beatdetektering pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Efter allt detta startas max30100 med en ledd ströminställning. Olika aktuella inställningar finns också i MAX30100-huvudfilerna för olika konfigurationer. Ett hjärtslag upptäckt call back-funktionen är också igång. Efter alla dessa inställningar stoppas oximetersensorn.
I loop- funktionen startas MQTT-anslutningen och prenumerationsmodellen kontrolleras var 5000: e millisekund. I den här situationen, om strömbrytaren är påslagen, börjar den läsa oximetersensorn och publicera data för hjärtslag och SPO2-värdet. Om strömbrytaren är avstängd stänger den av alla uppgifter som rör pulsoximetersensorn.
ogiltig slinga () {MQTT_connect (); Adafruit_MQTT_Prenumerera * prenumeration; medan ((prenumeration = mqtt.readSubscription (5000))) {if (prenumeration == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); om (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Startar POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funktion som genomför uppgiften. * / "pox_read", / * Textnamn för uppgiften. * / 1024 * 3, / * Stackstorlek i ord, inte byte. * / NULL, / * Parameter skickas till uppgiften. * / 2, / * Prioritet som uppgiften skapas. * / & poxReadTaskHld); / * Används för att passera den skapade uppgiftshandtaget. * /} fördröjning (100); om (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funktion som genomför uppgiften. * / "mqttPub", / * Textnamn för uppgiften. * / 1024 * 3, / * Stackstorlek i ord, inte byte. * / NULL, / * Parameter överförd till uppgiften. * / 2, / * Prioritet vid vilken uppgiften skapas. * / & mqttPubTaskHld); / * Används för att passera den skapade uppgiften. * /}} annat {Serial.print (("Stoppar POX…")); // Detele POX läsuppgift om (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ta bort MQTT Pub-uppgiften om (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Används för att passera den skapade uppgiften. * /}} annat {Serial.print (("Stoppar POX…")); // Detele POX läsuppgift om (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ta bort MQTT Pub-uppgiften om (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Används för att passera den skapade uppgiften. * /}} annat {Serial.print (("Stoppar POX…")); // Detele POX läsuppgift om (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ta bort MQTT Pub-uppgiften om (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT-baserad demonstration av pulsoximeter
Kretsen är ordentligt ansluten i ett brödbräda och programmet nedan laddas upp till ESP32. Se till att du ändrar inloggningsuppgifterna för Wi-Fi och Adafruit i din kod för att få det att fungera för dig.
Efter anslutningen till WiFi- och Adafruit IO-servern började den fungera som förväntat.
Som vi kan se att SPO2-nivån visar 96% och hjärtslag visar 78 till 81 bitar per minut. Det ger också tiden när data fångas.
Som vi kan se i bilden ovan är strömbrytaren avstängd och data är 0. Den fullständiga arbetsvideoen av projektet finns också längst ner på denna sida.
Hoppas att du gillade artikeln och lärde dig något användbart, om du har några frågor, vänligen lämna dem i kommentarsektionen nedan eller lägg upp dem på våra forum.