- MAX30100 Sensor
- Erforderliche Komponenten
- MAX30100 Oximeter mit ESP32 verbinden
- Adafruit IO mit ESP32 zur Herzfrequenzüberwachung
- Code Erklärung
- IoT-basierte Pulsoximeter-Demonstration
Die Pulsoximetrie ist ein weit verbreitetes medizinisches Messinstrument und ein nicht-invasiver und schmerzloser Test, der den Sauerstoffsättigungsgrad in unserem Blut misst und kleine Änderungen des Sauerstoffs leicht erkennen kann. In der aktuellen Situation mit Covid-19 ist es wichtig geworden, den Sauerstoffgehalt mehrerer Patienten gleichzeitig aus der Ferne zu verfolgen, ohne mit dem Patienten in Kontakt zu kommen.
In diesem Projekt bauen wir ein Pulsoximeter mit dem Pulsoximeter MAX30100 und ESP32, das den Blutsauerstoffgehalt verfolgt und die Daten über das Internet sendet, indem eine Verbindung zu einem Wi-Fi-Netzwerk hergestellt wird. Auf diese Weise können wir mehrere Patienten aus der Ferne überwachen, indem wir die soziale Distanz zu den Patienten aufrechterhalten. Die erhaltenen Daten werden als Diagramm angezeigt, das die Verfolgung und Analyse des Zustands des Patienten erleichtert. Zuvor haben wir auch andere Herzfrequenzmesser mit Pulssensoren gebaut. Wenn Sie an anderen Covid-19-Projekten interessiert sind, können Sie sich das Thermometer für den menschlichen Körper, das Smart IR-Thermometer zur Fieberüberwachung und den Wandmontage-Temperaturscanner ansehen, die wir zuvor gebaut haben.
Neben der Covid-19-Anwendung kann dieses Projekt auch bei chronisch obstruktiven Lungenerkrankungen (COPD), Asthma, Lungenentzündung, Lungenkrebs, Anämie, Herzinfarkt oder Herzinsuffizienz oder bei angeborenen Herzfehlern eingesetzt werden.
Beachten Sie, dass der in diesem Projekt verwendete Sensor nicht medizinisch bewertet ist und das Projekt nicht auf ausfallsichere Anwendungen getestet wurde. Verwenden Sie immer ein medizinisch bewertetes Pulsoximeter, um den Puls und den Sauerstoffgehalt des Patienten zu bestimmen und mit einem Arzt zu besprechen. Das hier diskutierte Projekt dient nur zu Bildungszwecken.
MAX30100 Sensor
Der Sensor MAX30100 ist ein integriertes Modul für Pulsoximetrie und Herzfrequenzüberwachung. Es kommuniziert mit der I2C-Datenleitung und liefert die SpO2- und Impulsinformationen an die Host-Mikrocontroller-Einheit. Es verwendet Fotodetektoren, optische Elemente, bei denen rote und grüne IR-LED die LED-Impulse modulieren. Der LED-Strom ist von 0 bis 50 mA konfigurierbar. Das folgende Bild zeigt den MAX30100-Sensor.
Das obige Sensormodul arbeitet mit 1,8 V bis 5,5 V. Die Pull-up-Widerstände für die I2C-Pins sind im Modul enthalten.
Erforderliche Komponenten
- Eine WiFi-Verbindung
- ESP32
- MAX30100 Sensor
- Adafruit IO-Benutzer-ID und ein benutzerdefiniertes Dashboard (wird es weiter machen)
- 5V ausreichend Netzteil mit einem Nennstrom von mindestens 1A
- USB-Kabel Micro USB zu USBA
- Ein PC mit Arduino IDE mit ESP32-Programmierumgebung.
MAX30100 Oximeter mit ESP32 verbinden
Das vollständige Schaltbild für MAX30100 mit ESP32 ist unten angegeben.
Dies ist ein sehr einfacher Schaltplan. Die Pins 21 und 22 des ESP32-Devkits C sind mit dem Pulsoximetersensor MAX30100 mit den SDA- und SCL-Pins verbunden. Das Oximeter wird auch über den 5-V-Pin auf der ESP32-Entwicklungsplatine mit Strom versorgt. Ich habe meine Verbindung mit einem Steckbrett und Verbindungskabeln hergestellt und mein Testaufbau sieht folgendermaßen aus:
Adafruit IO mit ESP32 zur Herzfrequenzüberwachung
Wir haben bereits viele Adafruit IO-Projekte für verschiedene IoT-Anwendungen erstellt. Adafruit IO ist eine hervorragende Plattform, auf der ein benutzerdefiniertes Dashboard erstellt werden kann. Führen Sie die folgenden Schritte aus, um das benutzerdefinierte Dashboard für den IoT-basierten Pulsoximeter-Sensor zu erstellen:
Schritt 1: Melden Sie sich zuerst bei adafruit IO an, nachdem Sie den Faustnamen, den Nachnamen, die E-Mail-Adresse, den Benutzernamen und das Passwort angegeben haben.
Schritt 2: Das leere Dashboard-Fenster wird geöffnet, nachdem der Anmeldevorgang abgeschlossen ist. In diesem Segment müssen wir ein Dashboard erstellen, um die Daten auf verschiedene Arten anzuzeigen. Daher ist es an der Zeit, das neue Dashboard zu erstellen und den Namen des Dashboards und die Beschreibung anzugeben.
Schritt 3: Nach dem Ausfüllen des obigen Formulars ist es Zeit, das Diagramm und den Steuerabschnitt für den Sensor zu erstellen.
Wählen Sie den Schalterblock. Es wird zum Ein- oder Ausschalten des Pulsoximetersensors benötigt.
Schritt 4: Notieren Sie den Blocknamen. Wie wir im obigen Bild sehen können, liefert die Umschaltfunktion zwei Zustände, EIN und AUS. Wählen Sie im gleichen Vorgang den Diagrammblock aus.
Dieser Diagrammabschnitt muss zweimal ausgewählt werden, da zwei Diagramme angezeigt werden, Herzbit und SpO2. Beide Abschnitte werden erstellt. Wie wir sehen können, haben wir alle Eingabe- und Ausgabefunktionen ausgewählt.
Schritt 5: Der nächste und letzte Schritt besteht darin, den Adafruit-Schlüssel zu haben. Wie wir sehen können, erhalten wir den Adafruit-Schlüssel, der im Code hinzugefügt werden muss.
Das Adafruit-E / A ist jetzt konfiguriert. Es ist Zeit, die Hardware vorzubereiten und die Firmware für dieses Projekt zu erstellen.
Code Erklärung
Dieser Code verwendet viele Bibliotheken und alle sind wichtig. Die Bibliotheken sind MAX30100 Pulsoximeter-Sensorbibliothek, Wire.h für das I2C, WiFi.h für die WiFi-bezogene Unterstützung in der ESP32-, Adafruit MQTT- und MQTT-Client- Bibliothek. Das vollständige Programm finden Sie unten auf dieser Seite.
Die oben genannten Bibliotheken sind am Anfang des Codes enthalten.
#einschließen
Die nächsten beiden Definitionen sind die WLAN-SSID und das WLAN-Passwort. Dies muss genau sein und wird vom ESP32 verwendet, um eine Verbindung mit dem WiFi-Netzwerk herzustellen.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Als nächstes haben wir die Adafruit io-Definitionen definiert.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Die Aktualisierungsrate aktualisiert die Daten alle 5 Sekunden. Der Server ist io.adafruit.com mit einem Server-Port von 1883. Der Benutzername und das Kennwort sind der generierte Benutzername und das Kennwort aus dem adafruit IO-Dashboard. Es ist für alle unterschiedlich und muss wie im Abschnitt zur Einrichtung von Adafruit beschrieben generiert werden.
Die I2C-Ports werden anschließend wie im Schaltplan gezeigt definiert.
#define I2C_SDA 21 #define I2C_SCL 22
Als nächstes werden drei Variablen verwendet, um den letzten Bericht sowie den Wert für bpm und spo2 zu speichern.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
Das MQTT arbeitet mit einem Pub-Sub-Modell (Publish and Subscribe). In diesem Arbeitsmodell bleibt das Gerät, das die Daten an den Adafruit-Server sendet, im Veröffentlichungsmodus, in dem der Adafruit-E / A-Server dieselben Datenpunkte abonniert. In diesem Fall empfängt der Server, wenn er neue Daten veröffentlicht, die Daten und stellt die erforderlichen Maßnahmen bereit, wenn das Gerät neue Daten veröffentlicht.
Das gleiche passiert, wenn der Server die Daten veröffentlicht und das Gerät sie abonniert. In unserer Anwendung sendet das Gerät die Daten von SPO2 und BPM an den Server, veröffentlicht diese also und empfängt den EIN-AUS-Status vom Server, wodurch dieser abonniert wird. Dieses Ding ist in dem unten beschriebenen Code-Snippet konfiguriert.
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"); // Beachten Sie, dass MQTT-Pfade für AIO der folgenden Form folgen:
In der Setup- Funktion starten wir den I2C, verbinden das WLAN mit der vordefinierten SSID und dem vordefinierten Kennwort und starten den MQTT-Abonnementprozess für den Switch-Status (die im Adafruit IO-Dashboard erstellte Switch-Schaltfläche).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi verbunden"); Serial.println ("IP-Adresse:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Pulsoximeter initialisieren.."); // Initialisiere die PulseOximeter-Instanz // Fehler sind im Allgemeinen auf eine falsche I2C-Verkabelung, fehlende Stromversorgung // oder einen falschen Zielchip zurückzuführen if (! Pox.begin ()) {Serial.println ("FAILED"); zum(;;); } else {Serial.println ("SUCCESS"); } // Der Standardstrom für die IR-LED beträgt 50 mA und kann // durch Kommentieren der folgenden Zeile geändert werden. Überprüfen Sie MAX30100_Registers.h auf alle // verfügbaren Optionen. Pocken.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Einen Rückruf für die Beat-Erkennung registrieren pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }}
Nach alledem wird der max30100 mit einer LED-Stromeinstellung gestartet. In den MAX30100-Headerdateien sind für verschiedene Konfigurationen auch unterschiedliche aktuelle Einstellungen verfügbar. Ein Herzschlag Erkennung Rückruffunktion wird ebenfalls gestartet. Nach all diesen Einstellungen wird der Oximetersensor gestoppt.
In der Schleifenfunktion wird die MQTT-Verbindung gestartet und das Abonnementmodell alle 5000 Millisekunden überprüft. Wenn der Schalter eingeschaltet ist, beginnt er in dieser Situation, den Oximetersensor zu lesen und die Daten des Herzschlags und des SPO2-Werts zu veröffentlichen. Wenn der Schalter ausgeschaltet ist, werden alle Aufgaben im Zusammenhang mit dem Pulsoximetersensor ausgesetzt.
void loop () {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 (("POX starten…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funktion, die die Aufgabe implementiert. * / "pox_read", / * Textname für die Aufgabe. * / 1024 * 3, / * Stapelgröße in Worten, nicht Bytes. * / NULL, / * Parameter, der an die Task übergeben wurde. * / 2, / * Priorität, mit der die Task erstellt wird. * / & poxReadTaskHld); / * Wird verwendet, um das Handle der erstellten Aufgabe zu verteilen. * /} Verzögerung (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funktion, die die Aufgabe implementiert. * / "mqttPub", / * Textname für die Aufgabe. * / 1024 * 3, / * Stapelgröße in Worten, nicht in Bytes. * / NULL, / * Parameter, der an die Aufgabe übergeben wurde. * / 2, / * Priorität, mit der die Aufgabe erstellt wird. * / & mqttPubTaskHld); / * Wird verwendet, um das Handle der erstellten Aufgabe zu verteilen. * /}} else {Serial.print (("POX stoppen…")); // POX-Leseaufgabe ermitteln if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Lösche die MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Wird verwendet, um das Handle der erstellten Aufgabe zu verteilen. * /}} else {Serial.print (("POX stoppen…")); // POX-Leseaufgabe ermitteln if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Lösche die MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Wird verwendet, um das Handle der erstellten Aufgabe zu verteilen. * /}} else {Serial.print (("POX stoppen…")); // POX-Leseaufgabe ermitteln if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Lösche die MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT-basierte Pulsoximeter-Demonstration
Die Schaltung ist ordnungsgemäß in einem Steckbrett angeschlossen und das unten angegebene Programm wird auf ESP32 hochgeladen. Stellen Sie sicher, dass Sie die Anmeldeinformationen für WLAN und Adafruit in Ihrem Code entsprechend ändern, damit sie für Sie funktionieren.
Nach der Verbindung mit dem WLAN- und Adafruit-E / A-Server begann es wie erwartet zu funktionieren.
Wie wir sehen können, zeigt der SPO2-Pegel 96% und der Herzschlag 78 bis 81 Bit pro Minute. Es gibt auch die Zeit an, zu der die Daten erfasst werden.
Wie wir im obigen Bild sehen können, ist der Schalter ausgeschaltet und die Daten sind 0. Das vollständige Arbeitsvideo des Projekts finden Sie auch unten auf dieser Seite.
Ich hoffe, Ihnen hat der Artikel gefallen und Sie haben etwas Nützliches gelernt. Wenn Sie Fragen haben, lassen Sie diese bitte im Kommentarbereich unten oder posten Sie sie in unseren Foren.