[PRZYKŁAD] Pulsoksymetr MAX30100 + KAmduino UNO
Po podłączeniu układu można przejść do napisania oprogramowania na platformę Arduino (Pełny kod znajduje się w sekcji „do pobrania”, na końcu artykułu). Do napisania programu użyta została biblioteka dostępna pod adresem https://github.com/oxullo/Arduino-MAX30100. Należało w niej jednak wprowadzić niewielkie modyfikacje. Podczas uruchamiania przykładowego kodu okazało się, że tętno autora wynosi ok. 30 uderzeń na minutę. Okazało się, że jest to równe częstotliwości sprawdzania pomiaru temperatury i czujnik reagował na momenty zbierania próbek. W związku z tym w funkcji odświeżającej wartości z czujnika zakomentowana została część odpowiedzialna za pomiar temperatury. Funkcja PulseOximeter::update w pliku MAX30100_PulseOximeter.cpp wygląda teraz tak:
void PulseOximeter::update() { checkSample(); checkCurrentBias(); // checkTemperature(); }
Także w pliku MAX30100_BeatDetector.h zamieniono parametr BEATDETECTOR_BPFILTER_ALPHA na wartość 0.2 w celu lepszego uśredniania wartości tętna.
#define BEATDETECTOR_BPFILTER_ALPHA 0.2
Zmodyfikowana wersja biblioteki znajduje się w paczce „Kod projektu”. Teraz można przejść do kodu głównego.
Najpierw zostaną zaimportowane biblioteki oraz zadeklarowane niezbędne stałe i zmienne.
#include <LiquidCrystal.h> #include <Wire.h> #include "MAX30100_PulseOximeter.h" #define OKRES_WYSWIETLANIA 200 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); PulseOximeter max30100; uint8_t saturacja; float tetno; uint32_t poprzedniOdczyt = 0;
W funkcji setup inicjalizowane są urządzenia – czujnik MAX30100 oraz ekran LCD. Prąd diody podczerwonej ustawiany jest na wartość 11 mA. Warto zwrócić uwagę, że zbyt duży prąd diody może powodować stałe przesterowanie detektora, a w konsekwencji brak możliwości zaobserwowania zmian w sygnale wyjściowym.
void setup() { lcd.begin(16,2); lcd.setCursor(0,0); max30100.begin(); max30100.setIRLedCurrent(MAX30100_LED_CURR_11MA); //ustawienie pradu diody podczerwonej }
W głównej pętli programu aktualizowane są odczyty czujnika MAX30100. Następnie, co 200 ms, na ekranie LCD wyświetlane są aktualne wskazania tętna i saturacji.
void loop() { max30100.update(); if (millis() - poprzedniOdczyt > OKRES_WYSWIETLANIA) { saturacja = max30100.getSpO2(); tetno = max30100.getHeartRate(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Tetno: "); lcd.print(tetno); lcd.print(" bpm"); lcd.setCursor(0,1); lcd.print("Saturacja: "); lcd.print(saturacja); lcd.print("%"); poprzedniOdczyt = millis(); } }
Działanie przykładu zostało zaprezentowane na poniższym materiale wideo: