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