- Czujnik MAX30100
- Wymagane komponenty
- Połączenie oksymetru MAX30100 z ESP32
- Adafruit IO z ESP32 do monitorowania tętna
- Objaśnienie kodu
- Demonstracja pulsoksymetru opartego na IoT
Pulsoksymetria jest szeroko stosowanym medycznym instrumentem pomiarowym i jest nieinwazyjnym i bezbolesnym testem, który mierzy poziom nasycenia tlenem w naszej krwi, który może z łatwością wykryć niewielkie zmiany tlenu. W obecnej sytuacji Covid-19, ważne stało się zdalne śledzenie poziomu tlenu u wielu pacjentów w tym samym czasie, bez kontaktu z pacjentem.
Dlatego w tym projekcie zbudowaliśmy pulsoksymetr z wykorzystaniem pulsoksymetru MAX30100 i ESP32, który będzie śledzić poziom tlenu we krwi i przesyłać dane przez Internet, łącząc się z siecią Wi-Fi. W ten sposób możemy zdalnie monitorować wielu pacjentów, zachowując dystans społeczny z pacjentami. Uzyskane dane zostaną przedstawione w postaci wykresu, co ułatwi śledzenie i analizę stanu pacjenta. Wcześniej budowaliśmy także inne pulsometry wykorzystujące czujniki tętna. A jeśli jesteś zainteresowany innymi projektami związanymi z Covid-19, możesz sprawdzić termometr ludzkiego ciała, inteligentny termometr na podczerwień do monitorowania gorączki i skaner temperatury do montażu na ścianie, które zbudowaliśmy wcześniej.
Oprócz aplikacji Covid-19, projekt ten może być również szeroko stosowany w przewlekłej obturacyjnej chorobie płuc (POChP), astmie, zapaleniu płuc, raku płuc, anemii, zawale serca lub niewydolności serca lub we wrodzonych wadach serca.
Należy zauważyć, że czujnik użyty w tym projekcie nie ma oceny medycznej, a projekt nie jest testowany pod kątem niezawodnych zastosowań. Zawsze używaj pulsoksymetru z atestem medycznym do określenia pulsu i poziomu tlenu u pacjenta i omów to z lekarzem. Omawiany projekt ma charakter wyłącznie edukacyjny.
Czujnik MAX30100
Czujnik MAX30100 to zintegrowany moduł pulsoksymetryczny i pulsometr. Komunikuje się z linią danych I2C i dostarcza informacje SpO2 i Pulse do jednostki mikrokontrolera hosta. Wykorzystuje fotodetektory, elementy optyczne, w których czerwona, zielona dioda IR moduluje impulsy diody. Prąd LED można konfigurować w zakresie od 0 do 50 mA. Poniższy obraz przedstawia czujnik MAX30100.
Powyższy moduł czujnika współpracuje z napięciem od 1,8 V do 5,5 V. W module znajdują się rezystory podciągające dla pinów I2C.
Wymagane komponenty
- Połączenie Wi-Fi
- ESP32
- Czujnik MAX30100
- Identyfikator użytkownika Adafruit IO i niestandardowy pulpit nawigacyjny (będzie dalej)
- Odpowiedni zasilacz 5V o prądzie znamionowym co najmniej 1A
- Kabel USB Micro USB na USB A.
- Komputer PC z Arduino IDE ze środowiskiem programistycznym ESP32.
Połączenie oksymetru MAX30100 z ESP32
Pełny schemat obwodu dla MAX30100 z ESP32 przedstawiono poniżej.
To bardzo prosty schemat. Piny 21 i 22 zestawu Devkit C ESP32 są połączone z czujnikiem pulsoksymetrycznym MAX30100 za pomocą pinów SDA i SCL. Pulsoksymetr jest również zasilany przez pin 5 V na płycie rozwojowej ESP32. Zrobiłem połączenie za pomocą płytki stykowej i przewodów połączeniowych, a moja konfiguracja testowa wygląda następująco:
Adafruit IO z ESP32 do monitorowania tętna
Wcześniej zbudowaliśmy wiele projektów Adafruit IO dla różnych aplikacji IoT. Adafruit IO to doskonała platforma, na której można stworzyć niestandardowy pulpit nawigacyjny. Aby utworzyć niestandardowy pulpit nawigacyjny dla czujnika pulsoksymetrycznego opartego na IoT, wykonaj poniższe czynności:
Krok 1: Najpierw zarejestruj się w IO adafruit po podaniu imienia Fist, nazwiska, adresu e-mail, nazwy użytkownika i hasła.
Krok 2: Puste okno pulpitu zostanie otwarte po zakończeniu procesu logowania. W tym segmencie będziemy musieli utworzyć pulpit nawigacyjny, aby wyświetlać dane na różne sposoby. Dlatego nadszedł czas, aby utworzyć nowy pulpit nawigacyjny i podać jego nazwę oraz opis.
Krok 3: Po wypełnieniu powyższego formularza nadszedł czas na utworzenie wykresu i sekcji sterowania dla czujnika.
Wybierz blok przełączników. Będzie to konieczne do włączenia lub wyłączenia czujnika pulsoksymetru.
Krok 4: Zapisz nazwę bloku. Jak widać na powyższym obrazku, funkcja przełączania zapewni dwa stany, WŁ. I WYŁ. W tym samym procesie wybierz blok wykresu.
Tę sekcję wykresu należy wybrać dwukrotnie, ponieważ zostaną wyświetlone dwa wykresy, Bity serca i SpO2. Tworzone są obie sekcje. Jak widzimy, wybraliśmy wszystkie funkcje wejścia i wyjścia.
Krok 5: Kolejnym i ostatnim krokiem jest posiadanie klucza adafruit. Jak widzimy, otrzymujemy klucz adafruit i należy go dodać w kodzie.
IO Adafruit jest teraz skonfigurowane. Czas przygotować sprzęt i stworzyć oprogramowanie układowe dla tego projektu.
Objaśnienie kodu
Ten kod wykorzystuje wiele bibliotek i wszystkie są ważne. Biblioteki to biblioteka czujników pulsoksymetru MAX30100 , Wire.h dla I2C, WiFi.h dla obsługi WiFi w ESP32, Adafruit MQTT i biblioteka MQTT Client . Kompletny program można znaleźć na dole tej strony.
Wspomniane powyżej biblioteki znajdują się na początku kodu.
#zawierać
Kolejne dwie definicje to identyfikator SSID sieci WLAN i hasło sieci WLAN. To musi być dokładne i będzie używane przez ESP32 do łączenia się z siecią Wi-Fi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Następnie zdefiniowaliśmy definicje Adafruit io.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Częstotliwość aktualizacji będzie aktualizować dane co 5 sekund, serwerem będzie io.adafruit.com z portem serwera 1883. Nazwa użytkownika i hasło będą wygenerowaną nazwą użytkownika i hasłem z panelu IO adafruit. Będzie inny dla wszystkich i należy go wygenerować zgodnie z opisem w sekcji konfiguracji adafruit.
Porty I2C są później definiowane, jak pokazano na schemacie.
# zdefiniować I2C_SDA 21 # zdefiniować I2C_SCL 22
Następnie trzy zmienne są używane do przechowywania ostatniego raportu oraz wartości bpm i spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT działa z modelem pub-sub (publikuj i subskrybuj). W tym modelu pracy urządzenie przesyłające dane do serwera Adafruit pozostaje w trybie publikowania, w którym serwer IO Adafruit subskrybuje te same punkty danych. W efekcie za każdym razem, gdy urządzenie opublikuje jakiekolwiek nowe dane, serwer, jako że jest na nie zasubskrybowany, odbiera dane i podejmuje niezbędne działania.
To samo dzieje się, gdy serwer publikuje dane, a urządzenie je subskrybuje. W naszej aplikacji urządzenie wysyła dane SPO2 i BPM na serwer, więc je publikuje i odbiera stan ON-OFF z serwera, subskrybując tym samym ten. Ta rzecz jest skonfigurowana we fragmencie kodu opisanym poniżej:
Klient WiFiClient; 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"); // Zwróć uwagę, że ścieżki MQTT dla AIO mają postać:
W funkcji konfiguracji uruchamiamy I2C, łącząc WiFi z predefiniowanym SSID i Hasłem oraz rozpoczynamy proces subskrypcji MQTT dla stanu przełącznika (przycisk przełącznika utworzony w desce rozdzielczej Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {opóźnienie (500); Serial.print („.”); } Serial.println (); Serial.println („Połączono z siecią Wi-Fi”); Serial.println ("adres IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicjalizacja pulsoksymetru.."); // Zainicjuj instancję PulseOximeter // Awarie są zwykle spowodowane niewłaściwym okablowaniem I2C, brakiem zasilania // lub niewłaściwym chipem docelowym if (! Pox.begin ()) {Serial.println ("FAILED"); dla(;;); } else {Serial.println ("SUKCES"); } // Domyślny prąd dla diody IR wynosi 50 mA i można go // zmienić, odkomentowując poniższy wiersz. Sprawdź MAX30100_Registers.h dla wszystkich // dostępnych opcji. kiła.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Zarejestruj wywołanie zwrotne dla wykrywania rytmu pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Po tym wszystkim max30100 jest uruchamiany z ustawieniem prądu led. Różne bieżące ustawienia są również dostępne w plikach nagłówkowych MAX30100 dla różnych konfiguracji. Uruchamiana jest również funkcja oddzwaniania wykrywania bicia serca. Po tych wszystkich ustawieniach czujnik pulsoksymetru jest zatrzymywany.
W funkcji pętli uruchamiane jest połączenie MQTT, a model subskrypcji jest sprawdzany co 5000 milisekund. W tej sytuacji, jeśli przełącznik jest włączony, zaczyna odczytywać czujnik pulsoksymetru i publikować dane tętna i wartości SPO2. Wyłączenie wyłącznika wstrzymuje wszystkie zadania związane z czujnikiem pulsoksymetru.
void loop () {MQTT_connect (); Subskrypcja Adafruit_MQTT_Subscribe *; while ((subskrypcja = mqtt.readSubscription (5000))) {if (subskrypcja == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Uruchamianie POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funkcja implementująca zadanie. * / "pox_read", / * Nazwa tekstu zadania. * / 1024 * 3, / * Wielkość stosu wyrażona słowami, a nie bytes. * / NULL, / * Parametr przekazany do zadania. * / 2, / * Priorytet, na którym zadanie jest tworzone. * / & poxReadTaskHld); / * Służy do przekazywania uchwytu utworzonego zadania. * /} opóźnienie (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcja realizująca zadanie. * / "mqttPub", / * Nazwa tekstowa zadania. * / 1024 * 3, / * Rozmiar stosu wyrażony w słowach, a nie w bajtach. * / NULL, / * Parametr przekazany do zadania. * / 2, / * Priorytet, na którym zadanie jest tworzone. * / & mqttPubTaskHld); / * Służy do przekazywania uchwytu utworzonego zadania. * /}} else {Serial.print (("Stoping POX…")); // Detele zadania odczytu POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Usuń zadanie publikacji MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Służy do przekazywania uchwytu utworzonego zadania. * /}} else {Serial.print (("Stoping POX…")); // Detele zadania odczytu POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Usuń zadanie publikacji MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Służy do przekazywania uchwytu utworzonego zadania. * /}} else {Serial.print (("Stoping POX…")); // Detele zadania odczytu POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Usuń zadanie publikacji MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstracja pulsoksymetru opartego na IoT
Układ jest poprawnie podłączony w płytce stykowej, a program podany poniżej wgrywamy do ESP32. Upewnij się, że odpowiednio zmieniłeś poświadczenia Wi-Fi i Adafruit w swoim kodzie, aby działał dla Ciebie.
Po połączeniu się z WiFi i serwerem Adafruit IO zaczął działać zgodnie z oczekiwaniami.
Jak widać, poziom SPO2 pokazuje 96%, a bicie serca pokazuje 78 do 81 bitów na minutę. Dostarcza również czasu, w którym dane są przechwytywane.
Jak widać na powyższym obrazku, przełącznik jest wyłączony, a dane wynoszą 0. Pełne wideo robocze projektu można również znaleźć na dole tej strony.
Mam nadzieję, że podobał Ci się artykuł i dowiedziałeś się czegoś przydatnego. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy poniżej lub opublikuj na naszych forach.