- MAX30100 sensor
- Vereiste componenten
- Koppeling MAX30100 Oximeter met ESP32
- Adafruit IO met ESP32 voor hartslagmeting
- Code Uitleg
- Demonstratie van op IoT gebaseerde pulsoxymeters
Pulsoximetrie is een veelgebruikt medisch meetinstrument en het is een niet-invasieve en pijnloze test die het zuurstofverzadigingsniveau in ons bloed meet en gemakkelijk kleine veranderingen in zuurstof kan detecteren. In de huidige Covid-19 situatie is het belangrijk geworden om het zuurstofniveau van meerdere patiënten tegelijk op afstand te volgen zonder in contact te komen met de patiënt.
In dit project bouwen we dus een pulsoximeter met MAX30100 pulsoximeter en ESP32 die het bloedzuurstofniveau volgt en de gegevens via internet verzendt door verbinding te maken met een wifi-netwerk. Op deze manier kunnen we meerdere patiënten op afstand monitoren door sociale afstand met de patiënten te bewaren. De verkregen gegevens worden weergegeven als een grafiek, waardoor het gemakkelijker wordt om de toestand van de patiënt te volgen en te analyseren. Eerder hebben we ook andere hartslagmeters gebouwd met polssensoren. En als u geïnteresseerd bent in andere Covid-19-gerelateerde projecten, kunt u de Menselijke lichaamsthermometer, de slimme IR-thermometer voor koortsmonitoring en de wandgemonteerde temperatuurscanner bekijken die we eerder hebben gebouwd.
Behalve bij de toepassing Covid-19, kan dit project ook breed ingezet worden bij chronische obstructieve longziekte (COPD), astma, longontsteking, longkanker, bloedarmoede, hartaanval of hartfalen, of bij aangeboren hartafwijkingen.
Houd er rekening mee dat de sensor die in dit project wordt gebruikt, niet medisch is beoordeeld en dat het project niet is getest op faalvaste toepassingen. Gebruik altijd een medisch beoordeelde pulsoxymeter om de polsslag en het zuurstofniveau van de patiënt te bepalen en bespreek dit met een arts. Het hier besproken project is alleen voor educatieve doeleinden.
MAX30100 sensor
MAX30100-sensor is een geïntegreerde pulsoxymetrie- en hartslagmetermodule. Het communiceert met de I2C-datalijn en levert de SpO2- en pulsinformatie aan de host-microcontrollereenheid. Het maakt gebruik van fotodetectoren, optische elementen waar rode, groene IR-LED de LED-pulsen moduleert. De LED-stroom is configureerbaar van 0 tot 50mA. De onderstaande afbeelding toont de MAX30100-sensor.
De bovenstaande sensormodule werkt met 1,8V tot het 5,5V-bereik. De pull-up weerstanden voor de I2C pinnen zijn in de module inbegrepen.
Vereiste componenten
- Een wifi-verbinding
- ESP32
- MAX30100 sensor
- Adafruit IO-gebruikers-ID en een op maat gemaakt dashboard (maakt het verder)
- 5V geschikte voedingseenheid met een nominale stroom van minimaal 1A
- USB-kabel Micro-USB naar USBA
- Een pc met Arduino IDE met ESP32-programmeeromgeving.
Koppeling MAX30100 Oximeter met ESP32
Het volledige schakelschema voor MAX30100 met ESP32 wordt hieronder gegeven.
Dit is een heel eenvoudig schema. De pin 21 en 22 van de ESP32 devkit C is verbonden met pulsoxymetersensor MAX30100 met de SDA- en SCL-pinnen. De oximeter wordt ook gevoed door de 5V-pin op het ESP32-ontwikkelbord. Ik heb mijn verbinding gemaakt met behulp van een breadboard en verbindingsdraden en mijn testopstelling ziet er als volgt uit:
Adafruit IO met ESP32 voor hartslagmeting
We hebben eerder veel Adafruit IO-projecten gebouwd voor verschillende IoT-toepassingen. Adafruit IO is een uitstekend platform waar een dashboard op maat gemaakt kan worden. Gebruik de onderstaande stappen om het aangepaste dashboard voor de op IoT gebaseerde pulsoxymetersensor te maken:
Stap 1: Meld u eerst aan in de adafruit IO nadat u de vuistnaam, achternaam, e-mailadres, gebruikersnaam en het wachtwoord hebt opgegeven.
Stap 2: Het lege dashboardvenster wordt geopend nadat het aanmeldingsproces is voltooid. In dit segment moeten we een dashboard maken om de gegevens op verschillende manieren weer te geven. Het is dus tijd om het nieuwe dashboard te maken en de naam van het dashboard en de beschrijving op te geven.
Stap 3: Na het invullen van het bovenstaande formulier is het tijd om de grafiek en het bedieningsgedeelte voor de sensor te maken.
Selecteer het schakelblok. Het is nodig om de pulsoxymetersensor AAN of UIT te zetten.
Stap 4: Schrijf de bloknaam op. Zoals we in de bovenstaande afbeelding kunnen zien, biedt de schakelfunctie twee toestanden, AAN en UIT. Selecteer in hetzelfde proces het grafiekblok.
Dit grafiekgedeelte moet twee keer worden geselecteerd omdat er twee grafieken worden weergegeven: Heart bit en SpO2. Beide secties zijn gemaakt. Zoals we kunnen zien, hebben we alle invoer- en uitvoerfunctionaliteit geselecteerd.
Stap 5: De volgende en laatste stap is om de adafruit-sleutel te hebben. Zoals we kunnen zien, krijgen we de adafruit-sleutel en deze moet in de code worden toegevoegd.
De Adafruit IO is nu geconfigureerd. Het is tijd om de hardware voor te bereiden en de firmware voor dit project te maken.
Code Uitleg
Deze code gebruikt veel bibliotheken en ze zijn allemaal belangrijk. De bibliotheken zijn MAX30100 pulsoxymetersensorbibliotheek, Wire.h voor de I2C, WiFi.h voor de WiFi-gerelateerde ondersteuning in ESP32, Adafruit MQTT en MQTT Client- bibliotheek. Het volledige programma vindt u onderaan deze pagina.
De hierboven genoemde bibliotheken staan aan het begin van de code.
# omvatten
De volgende twee definities zijn de WLAN SSID en het WLAN-wachtwoord. Dit moet exact zijn en het zal door de ESP32 worden gebruikt om verbinding te maken met het WiFi-netwerk.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Vervolgens hebben we de Adafruit io-definities gedefinieerd.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
De update-snelheid zal de gegevens elke 5 seconden bijwerken, de server zal io.adafruit.com zijn met een serverpoort van 1883. De gebruikersnaam en het wachtwoord zijn de gegenereerde gebruikersnaam en het wachtwoord van het adafruit IO-dashboard. Het zal voor iedereen anders zijn en moet worden gegenereerd zoals beschreven in de sectie Adafruit-instellingen.
De I2C-poorten worden daarna gedefinieerd zoals weergegeven in het schema.
#define I2C_SDA 21 #define I2C_SCL 22
Vervolgens worden drie variabelen gebruikt om het laatste rapport en de bpm- en spo2-waarde op te slaan.
uint32_t tsLastReport = 0; zweven bpm_dt = 0; zweven spo2_dt = 0;
De MQTT werkt met een pub-sub-model (publiceren en abonneren). In dit werkmodel blijft het apparaat dat de gegevens naar de Adafruit-server verzendt in de publicatiemodus waar de Adafruit IO-server zich abonneert op dezelfde datapunten. In een dergelijk effect, wanneer het apparaat nieuwe gegevens publiceert, ontvangt de server, aangezien deze daarop is geabonneerd, de gegevens en voert de nodige actie uit.
Hetzelfde gebeurt wanneer de server de gegevens publiceert en het apparaat zich erop abonneert. In onze applicatie stuurt het apparaat de gegevens van SPO2 en BPM naar de server, dus publiceert het hetzelfde en ontvangt het de AAN-UIT-status van de server, waardoor het zich op deze abonneert. Dit ding is geconfigureerd in het codefragment dat hieronder wordt beschreven-
WiFiClient-client; 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"); // Merk op dat MQTT-paden voor AIO het formulier volgen:
In de setup- functie starten we de I2C, verbinden we de wifi met de vooraf gedefinieerde SSID en het wachtwoord en starten we het MQTT-abonnementsproces voor de schakelstatus (de schakelknop gemaakt in het Adafruit IO-dashboard).
leegte setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {vertraging (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi verbonden"); Serial.println ("IP-adres:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Initializing pulse oximeter.."); // Initialiseer de PulseOximeter-instantie // Storingen zijn over het algemeen te wijten aan een onjuiste I2C-bedrading, ontbrekende voeding // of verkeerde doelchip if (! Pox.begin ()) {Serial.println ("FAILED"); voor(;;); } else {Serial.println ("SUCCES"); } // De standaardstroom voor de IR-led is 50mA en kan worden gewijzigd // door de volgende regel te verwijderen. Kijk op MAX30100_Registers.h voor alle // beschikbare opties. pokken.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registreer een callback voor de beatdetectie pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Na dit alles wordt de max30100 gestart met een led-stroominstelling. Verschillende huidige instellingen zijn ook beschikbaar in de MAX30100-headerbestanden voor verschillende configuraties. Er wordt ook een terugroepfunctie voor hartslagdetectie gestart. Na al deze instellingen wordt de oxymetersensor gestopt.
In de loop- functie wordt de MQTT-verbinding gestart en wordt het abonnementsmodel elke 5000 milliseconden gecontroleerd. Als de schakelaar in deze situatie is ingeschakeld, begint hij de oxymetersensor te lezen en de gegevens van de hartslag en de SPO2-waarde te publiceren. Als de schakelaar is uitgeschakeld, worden alle taken met betrekking tot de pulsoxymetersensor onderbroken.
leegte lus () {MQTT_connect (); Adafruit_MQTT_Subscribe * abonnement; while ((abonnement = mqtt.readSubscription (5000))) {if (abonnement == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Start POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Functie die de taak implementeert. * / "pox_read", / * Tekstnaam voor de taak. * / 1024 * 3, / * Stapelgrootte in woorden, niet bytes. * / NULL, / * Parameter doorgegeven aan de taak. * / 2, / * Prioriteit waarmee de taak is gemaakt. * / & poxReadTaskHld); / * Wordt gebruikt om het handvat van de gemaakte taak uit te geven. * /} vertraging (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Functie die de taak implementeert. * / "mqttPub", / * Tekstnaam voor de taak. * / 1024 * 3, / * Stapelgrootte in woorden, niet in bytes. * / NULL, / * Parameter doorgegeven aan de taak. * / 2, / * Prioriteit waarmee de taak is gemaakt. * / & mqttPubTaskHld); / * Wordt gebruikt om het handvat van de gemaakte taak uit te geven. * /}} anders {Serial.print (("Stoping POX…")); // Detele POX leestaak if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Verwijder de MQTT Pub-taak als (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Wordt gebruikt om het handvat van de gemaakte taak uit te geven. * /}} anders {Serial.print (("Stoping POX…")); // Detele POX leestaak if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Verwijder de MQTT Pub-taak als (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Wordt gebruikt om het handvat van de gemaakte taak uit te geven. * /}} anders {Serial.print (("Stoping POX…")); // Detele POX leestaak if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Verwijder de MQTT Pub-taak als (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstratie van op IoT gebaseerde pulsoxymeters
Het circuit is correct aangesloten op een breadboard en het onderstaande programma wordt geüpload naar ESP32. Zorg ervoor dat u de inloggegevens voor Wi-Fi en Adafruit dienovereenkomstig in uw code wijzigt, zodat deze voor u werkt.
Na de verbinding met de WiFi en Adafruit IO-server begon het te werken zoals verwacht.
Zoals we kunnen zien, is het SPO2-niveau 96% en de hartslag 78 tot 81 bits per minuut. Het geeft ook de tijd aan waarop de gegevens worden vastgelegd.
Zoals we in de bovenstaande afbeelding kunnen zien, staat de schakelaar uit en zijn de gegevens 0. De volledige werkvideo van het project is ook te vinden onderaan deze pagina.
Ik hoop dat je het artikel leuk vond en iets nuttigs hebt geleerd, als je vragen hebt, laat ze dan achter in het commentaargedeelte hieronder of plaats ze op onze forums.