LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

[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: