Arduino senzor tepu srdce

Arduino senzor tepu srdce je vstupní modul, který obsahuje kombinaci infračervené LED diody a fototranzistoru. Pokud tedy do dráhy mezi IR LED diodu a fototranzistor vložíme například prst ruky, infračervené světlo z LED diody nám bude prosvěcovat prst a my budeme moci díky fototranzistoru měřit proměnné elektrické napětí. Změny v elektrickém napětí pak budou způsobeny tepáním krve skrze prst a my můžeme s poměrně dobrou přesností měřit srdeční tep v jednotce BPM (údery za minutu). Co se týká napájecího napětí, je vhodné použít 5 V z Arduina.

Pro úspěšné propojení senzoru tepu srdce s Arduino deskou je nutné zapojit 3 propojovací piny. Propojíme krajní pin S s pinem A0, prostřední pin s pinem 5 V Arduina a krajní pin „„ se zemí Arduina. Pro vstupní pin S je možné využít také ostatní analogové piny, ale je nutné tuto volbu provést také v ukázkovém kódu.

Ukázkový kód obsahuje na svém začátku nastavení čísel propojovacích pinů a vytvoření konstanty, která slouží pro nastavení zpoždění při detekci. Podprogram setup na svém začátku obsahuje nastavení komunikace po sériové lince a dále nastavení pinu pro analogový vstup jako vstupní a nepovinné indikační LED diody jako výstupní. Pro indikační LED diodu byl zvolen pin 13, protože ji většina Arduino desek na tomto pinu obsahuje již v základu. V nekonečné smyčce loop nejprve vytvoříme dočasné proměnné pro ukládání výsledků a poté pomocí funkce if zkontrolujeme detekci tepu zavoláním podprogramu detekceTepu. Pokud je zmíněným podprogramem detekován tep, přepočteme naměřený údaj na tepovou frekvenci v jednotce BPM, rozsvítíme indikační LED diodu a pokud je naměřená frekvence v rozsahu 50 až 200 tepů za minutu, vytiskneme tuto informaci po sériové lince. Následuje už jen vynulování proměnné pro další měření, pauza programu a připočtení zpoždění pro účely dalšího měření. Pokud ale není v aktuálním běhu detekován tep, pouze provedeme vypnutí indikační LED diody a po pauze provedeme novou kontrolu tepu. Podprogram detekceTepu v sobě obsahuje důležitou funkci programu, kdy po vytvoření pomocných proměnných načteme analogovou hodnotu z připojeného senzoru tepu srdce a tuto hodnotu poté přepočteme pro účely dalšího měření. Po přepočtu proběhne detekce špičkové hodnoty a v případě, že výsledek je označen za platný, nastavíme proměnnou vysledek jako platnou a vrátíme ji pomocí funkce return. V opačném případě upravíme maximální naměřené hodnoty pro další měření a aktuální běh ukončíme bez detekce tepu.

// Arduino senzor tepu srdce KY039

// nastavení čísel propojovacích pinů
#define indikLED 13
#define analogPin A0
// vytvoření konstanty pro zpoždění při detekci
const int zpozdeniMereni = 60;

void setup() {
  // komunikace po sériové lince rychlostí 9600 baud
  Serial.begin(9600);
  // inicializace analogového pinu jako vstup
  // a digitálního pinu jako výstup
  pinMode(analogPin, INPUT);
  pinMode(indikLED, OUTPUT);
}

void loop()
{
  // vytvoření dočasných proměnných pro uložení výsledků
  static int uderyZaMinutu = 0;
  int tepovaFrekvence = 0;
  // kontrola detekce tepu srdce podprogramem detekceTepu
  if (detekceTepu(analogPin, zpozdeniMereni)) {
    // výpočet frekvence tepu srdce
    tepovaFrekvence = 60000 / uderyZaMinutu;
    // rozsvícení indikační LED diody při detekovaném
    // měření tepu
    digitalWrite(indikLED, HIGH);
    // vytištění informace o naměřené tepové frekvenci
    if (tepovaFrekvence > 50 & tepovaFrekvence < 200) {
      Serial.print("Tepova frekvence: ");
      Serial.print(tepovaFrekvence);
      Serial.println(" uderu za minutu (BPM).");
    }
    // vynulování proměnné pro další měření
    uderyZaMinutu = 0;
  } else {
    // v případě žádné detekce tepu vypni indikační LED diodu
    digitalWrite(indikLED, LOW);
  }
  // pauza programu do dalšího měření
  delay(zpozdeniMereni);
  // připočtení zpoždění pro další měření
  uderyZaMinutu += zpozdeniMereni;
}
// podprogram pro detekci tepu a výpočet jeho frekvence
bool detekceTepu(int senzorPin, int zpozdeni) {
  // vytvoření pomocných proměnných
  static int maxHodnota = 0;
  static bool SpickovaHodnota = false;
  int analogHodnota;
  bool vysledek = false;
  // načtení analogové hodnoty ze senzoru
  analogHodnota = analogRead(senzorPin);
  // přepočet analogové hodnoty pro další výpočty
  analogHodnota *= (1000 / zpozdeni);
  // upravení maximální hodnoty
  if (analogHodnota * 4L < maxHodnota) {
    maxHodnota = analogHodnota * 0.8;
  }
  // detekce špičkové hodnoty
  if (analogHodnota > maxHodnota - (1000 / zpozdeni)) {
    // nastavení nového maxima při detekované špičce
    if (analogHodnota > maxHodnota) {
      maxHodnota = analogHodnota;
    }
    // nastavení platnosti výsledku, když
    // nebyla detekována špička
    if (SpickovaHodnota == false) {
      vysledek = true;
    }
    SpickovaHodnota = true;
  } else if (analogHodnota < maxHodnota - (3000 / zpozdeni)) {
    SpickovaHodnota = false;
    // upravení maximální hodnoty při změně měřených hodnot
    maxHodnota -= (1000 / zpozdeni);
  }
  // vrácení výsledku podprogramu
  return vysledek;
}

Po nahrání ukázkového kódu do Arduino desky s připojeným senzorem tepu srdce dostaneme například tento výsledek:

Tepova frekvence: 76 uderu za minutu (BPM).
Tepova frekvence: 83 uderu za minutu (BPM).
Tepova frekvence: 83 uderu za minutu (BPM).
Tepova frekvence: 83 uderu za minutu (BPM).

Arduino senzor tepu srdce je pěknou ukázkou, že i tak jednoduchá kombinace jako je Arduino, infračervená LED dioda a fototranzistor dokáže alespoň pro orientační měření nahradit dražší měřící přístroje. Když jsem totiž při vlastním testování tohoto modulu se senzorem tepu srdce srovnal výsledky společně s měřením pomocí chytrých hodinek Apple Watch, dosahoval jsem podobných výsledků s maximální odchylkou 10%. Pro orientační měření se tedy jeví tento modul jako velice zajímavou volbou. Jen je nutné správně vyzkoušet polohu fototranzistoru a IR LED diody, kdy je nejlepší namířit tyto dvě součástky proti sobě a mezi ně vložit natěsno svůj prst.

 

Seznam použitých komponent:

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/918-arduino-senzor-tepu-srdce-1420993910.html

Další podobné články