Programování | Pojďme programovat elektroniku | Arduino

Pojďme programovat elektroniku: Detektor horečky a kolabujícího srdce

  • Zatím jsme měřili jen pokojovou teplotu
  • Dnes si vyzkoušíme měřit teplotu těla
  • Do hry zapojíme také pulsmetr

Po delší přestávce je tu další pokračování našeho seriálu o programování elektroniky. Mimochodem, další díly najdete v časopisu Computer, kde si nyní hrajeme s Raspberry Pi, Pythonem a skvělou knihovnou pro zpracovávání počítačového vidění OpenCV. Digitální verzi najdete třeba v online trafice iKIosek.cz.

Zatímco minule jsme si ukázali, jak lze na pár řádcích kódu postavit základní principy kamerového detektoru pohybu, v příštím vydání budeme v obrazu z drobné kamerky hledat (nejen) červené dámské plavky.

Ale zpět na Živě.cz. Současná situace, kdy téměř veškerá mediální realita podléhá dvěma slovíčkům koronavir a COVID-19, se samozřejmě musí promítnout i v tomto článku. Dnes si proto postavíme elektronický obvod první pomoci – detektor horečky!

5b7c241d-9cea-42bd-bcc2-c4b08d0f334b12bf4d19-1442-4721-a7a6-e6a1e22b55b1
A toto je on – celý nevzhledný bastl dnešního detektoru horečky na nepájivém poli. Skládá se ze základní desky Arduino Nano, teploměru, pulsmetru, šesti LED a bzučáku. V článku si všechny komponenty pečlivě rozebereme.

Detektor horečky

Co k tomu budeme potřebovat? Jakýkoliv prototypovací mikropočítač, základem detektoru totiž bude přirozeně teploměr a jako bonus také snímač tlukotu srdce. Komplexnější detektor by mohl dále obsahovat hromadu pokročilejších čidel. Nabízí se třeba co nejpřesnější pokojový senzor koncentrace oxidu uhličitého.

Horečkoměr na videu:

Proč CO₂? Protože z rychlosti růstu jeho koncentrace v uzavřené místnosti můžeme odhadnout některé metabolické procesy v lidském těle. Stručně řečeno, když zalehnete ke spánku v klidovém stavu, množství oxidu uhličitého, který vydechujete do okolí, bude nesrovnatelně menší než po bujarém večírku, nebo v situaci, kdy váš imunitní systém bojuje s infekcí a stojí ho to nemalé množství spálené energie.

Měření tělesné teploty je pro kutily oříšek

Ale zpět k našemu detektoru. Tentokrát si vystačíme s teploměrem a zmíněným čidlem srdečního pulzu. S teplotními senzory jsme si v našem seriálu hráli už mnohokrát, vždy jsme ale měřili ambientní teplotu okolí. Lidské tělo je ale úplně jiná liga, a to už jen z hlediska konstrukce samotného teploměru.

Stručně řečeno, běžné prototypovací moduly jsou ergonomicky opravdu nevhodné, abyste si je strkali do podpaždí, přikládali k čelu nebo nedej bože téměř polykali. Potřebujeme tedy teploměr ve formě uzavřené sondy.

DS18B20 a sonda

Aliexpress ale i české e-shopy nabízejí ve formě ergonomicky vhodné sondy zejména digitální a levné termometry s čipem DS18B20. Byť rozhodně neoplývají nejvyšší přesností na trhu (okolo 0,5 °C), pro naše experimentální účely se v tomto případě hodí více než ostatní právě díky tepelně vodivému kovovém povrchu.

4338563b-57d9-483a-b380-040a9418c8b86f882f4a-4b3f-4ec4-b9a8-9bb5e3c21bf3
DS18B20 ve standardním pouzdře TO-92 a jako sonda, kterou použijeme i dnes

Elektronické termometry měří teplotu zpravidla poměrně jednoduchým (ale efektivním) způsobem. Namísto speciálních kovů a slitin, které při zahřívání nebo zchlazení mění svůj objem (typicky rtuť) nebo délku (svinutá kovová páska s ukazatelem), měří teplotu zpravidla jako změnu vodivosti materiálu, ze kterého je vyrobené samotné čidlo.

049faf39-b1ac-4e40-a14f-85b2660b59bf
Zapojení pinů teploměru DS18B20 (Zdroj: Last Minute Engineers)

Když totiž začnete elektrický obvod zahřívat, atomy ve vodiči se více rozkmitají a chaotický pohyb způsobí vyšší elektrický odpor. Když naopak elektrický obvod začnete chladit, chaotický pohyb atomů se zpomalí, obvodem bude lépe protékat vyšší proud a elektrický odpor se sníží.

Nu, a když takový obvod zchladíte na teplotu blízké absolutní nule, velmi zjednodušeně řečeno vyrobíte supravodič – obvod s dokonalou vodivostí a nulovým odporem.

Jen tři drátky

I když jsou dnes na trhu dostupné mnohem přesnější digitální teploměry, DS18B20 je mezi kutily stále oblíbený pro svoji komunikační sběrnici OneWire/1-Wire a velmi jednoduché použití třeba v prostředí Arduino.

cebb304c-6bf9-42b8-9b2d-b07a62becfba
Teploměr DS18B20 také velmi rychle reaguje na změnu teploty, takže se vhodná sonda v ústech ohřeje na teplotu těla během několika sekund.

OneWire už podle svého názvu používá jen jeden signálový vodič, a jelikož se jedná o sběrnici, můžeme na ni takových teploměrů DS18B20 zapojit hned několik. Každý z nich má v nitru vlastní komunikační mechanizmus s pevnou identifikační adresou, takže je náš řídící mikropočítač dokáže snadno rozlišit.

a493151c-2f4e-42b7-938d-93b1c2f8478e
Typické zapojení teploměru DS18B20 k 5V destičce Arduino Nano s pull-up rezistorem (4 700 ohmů), který spojuje 5V a signálový pin. Pull-up zajistí, že bude na signálovém pinu v klidovém stavu stále logická 1/HIGH, kterou vyžaduje sběrnice 1-Wire.

Práci ve vývojovém prostředí Arduino usnadňuje zejména to, že je pro sběrnici OneWire i samotné teploměry k dispozici hromada knihoven. Najdete je buď na GitHubu, anebo je doinstalujete přímo ze správce knihoven editoru Arduino.

Při práci se sběrnicí 1-Wire je třeba myslet na to, že signálový pin musí být v klidu stále ve stavu logické jedničky (HIGH), a tak je třeba aktivovat vhodný interní pull-up rezistor na řídícím mikropočítači, pokud jej nabízí, anebo použít dostatečně silný rezistor v obvodu. V případě zapojení s pětivoltovým Arduinem se nabízí třeba rezistor s odporem 4 700 ohmů (4k7). 

Kalibrace se rtuťovým teploměrem

A ještě jedna drobnost. Byť je teploměr v provedení sondy maximálně kontaktní, přesto je třeba počítat s určitým posunem. Jednoduše se nemusí ani tak dostatečně zahřát, protože hrot zdravotního kontaktního teploměru vede teplo ještě o něco lépe.

Problém lze vyřešit právě kalibrací s běžným zdravotním teploměrem a rozdíl v měření pak jednoduše připočítat. 

Stupnice horečky v podobě šesti LED

Náš detektor horečky bude vedle teploměru DS18B20 vybavený ještě jednoduchým integrovaným obvodem šesti LED. Budou sloužit jako stupnice. Když tedy změřená teplota překoná 37 °C, rozsvítí se první LED, když 37,5 °C, rozsvítí se další, no a takhle dál a dál, až bude při nebezpečné horečce svítit celá řada.

6ea0bbbb-f837-4fb3-87a5-702c0a34ffc1
Drobný blok šesti LED s integrovanými rezistory, takže jej můžete připojit rovnou k desce Arduina, ESP82666 atp. Dá se také připojit přímo na lištu pinů na desce Arduino Uno.

Při horečce zároveň začne hlasitě pískat piezoelektrický bzučák, další drobnost, která nesmí chybět na našem detektoru a zároveň korunová součástka, kterou bez problému utáhne každé robustní 5V Arduino.

08872b49-29ea-47e0-b0ec-1f596afbfd5f
Hlasitý piezobzučák podpoří paniku, pokud teplota přesáhne 38 °C

Změřená hodnota se nakonec pošle skrze sériovou linkou okamžitě do počítače, kde ji může analyzovat a zobrazit další pokročilejší software – pro naše testovací účely třeba neméně populární programovací a běhové prostředí Processing, což je vlastně takové Arduino pro počítač.

3b9dc081-4eac-4a91-9ddb-688d63d07fdc9f94cbf9-1ca0-405a-a40c-76c8c03c0d093897fdf6-445a-4975-bc24-be4dc06f8b1f
Výstup z detektoru v běhovém prostředí Processing na PC

Processing může po spuštění zobrazit grafické okno, spojit se skrze USB kabel a sériovou linku s naším detektorem, no a jakmile dorazí teplota, zobrazí ji tučným písmem přímo na ploše.

Srdeční tep

Co by to ale bylo za detektor horečky, když by to byl vlastně jen prachsprostý teploměr? Přidáme tedy ještě snímač srdečního tepu. Ten nám podobně jako CO₂ odhalí aktivitu samotného metabolismu. Když bude srdce i v klidu bít s nebezpečně vysokou frekvencí, asi se něco děje. A pokud nebude bít vůbec, nejspíše to bude také důvod k zamyšlení a mírné panice.

Optická metoda, kterou znáte z hodinek

Detektory srdečního tepu mohou používat celou plejádu technik, běžný smrtelník s chytrými hodinkami na zápěstí se dnes ale nejčastěji setká s optickou detekcí úderu srdce. Je to přesně to (zpravidla) zelené a docela silné světýlko, které na spodní straně sportovních hodinek prozáří pokožku. Hned vedle něj je umístěné fotocitlivé čidlo.

1420deca-f16e-467e-9bb1-f9f9e6cf075078ba9ebe-a7be-4ac7-af25-f36edb3eaf203844fa77-13fb-403e-aab3-c6c1b0535386
Optický pulsmetr na běžných sportovních/chytrých hodinkách

Pokud vám nebude bít srdce, snímací čidlo bude zaznamenávat stále stejnou hodnotu jasu. Když však budete mít štěstí a srdce udeří, nažene do tkání pod kůží čerstvou krev, takže záznam jasu zakolísá.

A právě toto zakolísání optický pulsmetr zaznamená jako úder srdce, takže stačí, aby jich během několikasekundového měření bylo hned několik, no a pak už z jejich prodlevy snadno spočítá počet úderů za minutu – BPM.

Změří i okysličení krve

Aby toho nebylo málo, některé čipy zvládnou optickou metodou zjistit také míru okysličení krve – nabízejí funkci oximetru. Umí to třeba modul MAX30102 od Maxim Integrated, který najdete i v e-shopech pro bastlíře ve formě drobné prototypovací destičky a s komunikací skrze rozšířenou sběrnici I²C. I pro tento čip dohledáte na GitHubu hromadu knihoven pro prostředí Arduino, zjištění pulzu a okysličení je tedy otázkou několika málo řádků kódu.

6d33d9d5-3786-4a70-81e1-e91c987dbcec
Prototypovací modul s pulsmetrem a oximetrem MAX30102

V každém případě, optický oximetr není o moc sofistikovanější než samotný pulsmetr. Okysličení totiž neměří žádná invazivní jehla, která odebere vzorek krve, ale opět fotocitlivé čidlo. Míra okysličení krve totiž odpovídá její barvě. Čidlo tedy neměří jen náhlou změnu odstínu pokožky, ale i míru této změny.

Pulse Sensor za pár kaček

My si ale vystačíme s mnohem primitivnější a analogovou destičkou Pulse Sensor, jejíž klony seženete na Aliexpressu za pakatel. Destička má jen tři piny. Vedle napájení tedy jen jeden signálový vodič, na kterém se zvýší, nebo naopak sníží napětí, které analogicky odpovídá hodnotě samotného fotosnímače.

5fc2cfb2-3959-40ee-9903-4b2a32a737980a3d34f3-644e-4916-809f-46487ec2b51c8a789329-56ab-456e-9782-e77a449f1da5
Jednoduchý analogový snímač srdečního tepu Pulse Sensor

Když tedy Pulse Senzor připojíte na analogový vstupní pin destičky Arduina nebo jiné stavebnice z A/D převodníkem, stačí surovou hodnotu přečíst a vypsat do vestavěného plotru.

Pokud nebude čidlo rušit okolní světlo (třeba blikající zářivky), rázem v grafu krásně uvidíte tlukot vašeho srdce, a to pro amatéry v docela solidním rozlišení. Vyrobíte si vlastně jednoduchý domácí elektrokardiogram – EKG.

c511d131-ec01-4eb6-8ec0-9ef920a5adf7
Surový analogový výstup z Pulse Sensoru v  grafickém plotru prostředí Arduino

Vlastní EKG je sice hezké, ale ještě potřebujeme z křivky vypočítat samotný srdeční tep za minutu, což bude pro laika docela oříšek, tlukot srdce je totiž docela složitý pohyb, takže v grafu vidíte při jednotlivých úderech hromadu dílčích amplitud.

Autoři Pulse Sensoru naštěstí i v tomto případě vyrobili pro prostředí Arduino knihovnu s hromadou příkladů. Doinstalujete ji opět skrze vestavěného správce knihoven a zjištění pulzu pak bude otázkou několika řádků kódu.

Infračervené bezkontaktní teploměry

Tak, a máme hotovo! Detektor horečky měří teplotu a puls a my si můžeme před cestou na nákup ověřit, jestli se nám točí hlava jen z permanentního sledování koronavirového zpravodajství, anebo už opravdu kolabujeme pod útokem těžké infekce.

Pokud bychom chtěli něco lepšího, nabízí se vyměnit kontaktní, a tedy nehygienické čidlo teploty za to infračervené, kterým v těchto dnech šermují na hraničních přechodech policisté a hasiči. Nutno podotknout, že budete muset sáhnout mnohem hlouběji do peněženky, cena se už totiž může pohybovat v řádu stokorun – zejména u ověřených objednávek z českých e-shopů.

7b8d3d97-4112-4f89-aa69-b401e12e2a9521d30cd7-1c72-434b-b546-faf5ca56a76764421da9-e4a5-4394-a35d-d48e184e2b7f
Infračervený teploměr Melexis MLX90614 a jeho prototypovací moduly

Základním modelem k experimentování by mohlo být třeba infračervené teplotní čidlo Melexis MLX90614, které by mělo dosahovat podobné přesnosti jako DS18B20, tedy 0,5 °C. U detekce lehce zvýšené teploty to tak spolehlivé nebude, ale jako čidlo horečky nad 38 °C už ano.

Na Arduino-shop.cz a dalších českých e-shopech jej seženete ve formě prototypovací destičky s vyvedenými piny pro komunikaci na sběrnici I²C zhruba za čtyři stovky. Objednávka z Asie bude levnější, ale v dnešní době časově krajně nejistá.

c91afde4-3345-441e-8df1-ec006e33fca9285b776a-98ee-4f76-b702-b348717a70eb7d5d930a-ca72-4d50-921a-aff0f4aa8008
64pixelová tepelná kamera s čipem AMG8833

Další exotickou možností, pokud tedy doma máte opravdu hodně naplněných prasátek, je Panasonic Grid-EYE AMG8833, kterým je zase vybavená deska Infra Grid Module od českého Hardwaria (původní BigClown).

V tomto případě se nejedná primárně o bezkontaktní teploměr, ale 64pixelový tepelný senzor s rozsahem 0-80 °C, takže s ním lze měřit také pohyb člověka před detektorem včetně určení směru na vzdálenost až okolo 7 metrů.

Jelikož toto čidlo primárně neplní funkci běžného teploměru, odpovídá mu i horší přesnost zhruba 2,5 °C. Horečku bychom s ním tedy sice také změřili, ale dostatečně spolehlivě jen u těch nešťastníků, na kterých by to muselo být dostatečně vidět i bez jakéhokoliv termometru. Nejspíše by totiž právě kolabovali.

A nakonec kompletní kód pro Arduino

V každém případě, dnes jsme si ukázali, jak fungují některé biometrické senzory a přejeme vám, ať v následujících dnech a týdnech nebudete potřebovat jejich mnohem spolehlivější profesionální sourozence.

Na úplný závěr nesmí chybět kompletní kód v C++ našeho detektoru pro vývojové prostředí Arduino, který dnes běžel na základní desce Arduino Nano s mikrokontrolerem ATmega328P:

// Vsechny knihovny doinstalujete ze spravce knihoven:
// Projekt->Pridat knihovnu->Spravovat knihovny
// Knihovna pro praci s cidlem Pulse Sensor na deskach Arduino
#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
// Knihovna pro praci se sbernici 1-Wire na deskach Arduino
#include <OneWire.h>
// Knihovna pro praci s teplomerem DS18B20 na deskach Arduino
#include <DallasTemperature.h>

// Jako zakladni desku pouzijeme Arduino Nano
// Na tyto piny pripojime modul s 6 LED, nebo 6 samostatnych LED
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8

// Na tento pin pripojime primitivni piezeelektricky bzucak
#define BZUCAK 10

// Signalovy pin teplomeru pripojime na digitalni pin 2
OneWire oneWire(2);
// Po startu sbernice 1-Wire na pinu 2 vytvorime objekt samotneho teplomeru
DallasTemperature teplomery(&oneWire);
// A do tretice jeste objekt pulsmetru Pulse Sensor
PulseSensorPlayground pulsmetr;

// Funkce setup se spousti jen jednou po startu programu
void setup() {
  // Nastartujeme seriovou linku rychlosti 115200 b/s
  Serial.begin(115200);
  // Nastartujeme teplomer
  teplomery.begin();
  // Pulsmetr je pripojeny na analogovy pin A0
  pulsmetr.analogInput(0);
  // Knihovna umoznuje rozblikat LED pri detekci pulsu
  // Vyhradime ji tedy posledni LED v rade
  pulsmetr.blinkOnPulse(LED6);
  // Arduino Nano ma 10b A/D prevodnik, analogovou hodnotu 0-5V tedy vyjadruje cislem 0-1023
  // Hranicni hodnota pro knihovnu, kdy rostouci napeti zacne interpretovat jako puls, bude 550
  // Da se upravit v pripade jinych A/D prevodniku, vysokeho sumu atp.
  // Viz dokumentace knihovny Pulse Sensor
  pulsmetr.setThreshold(550);
  // Start pulsmetru
  pulsmetr.begin();

  // Nastavile piny, ke kterym jsou pripojeny LED, na vystup
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  // Na vystup nastavime take pin, ke kteremu je pripojeny bzucak
  pinMode(BZUCAK, OUTPUT);
}

// Smycla loop se spusti po zpracovani funkce setup a opakuje se stale dokola
void loop() {
  // Zmerim teplotu
  teplomery.requestTemperatures();
  // Ziskam teplotu ve stupnich Celsia z prvniho teplomeru na sbernici
  float teplota = teplomery.getTempCByIndex(0);
  // Ziskam hodnotu pulsu v uderech za minutu
  uint8_t puls = pulsmetr.getBeatsPerMinute();

  // Pokud knihovna prave detekovala uder srdce
  if (pulsmetr.sawStartOfBeat()) {
    // Vypisu do seriove linky hodnotu pulsu a take zmerenou teplotu
    Serial.print("♥ ");
    Serial.print(puls);
    Serial.print(", ");
    Serial.println(teplota);
  }

  // Podle aktualni telesne teploty zapinam, nebo naopak vypinam LED
  if (teplota > 37.0) digitalWrite(LED1, HIGH); else digitalWrite(LED1, LOW);
  if (teplota > 37.5) digitalWrite(LED2, HIGH); else digitalWrite(LED2, LOW);
  if (teplota > 38.0) digitalWrite(LED3, HIGH); else digitalWrite(LED3, LOW);
  if (teplota > 38.5) digitalWrite(LED4, HIGH); else digitalWrite(LED4, LOW);
  if (teplota > 39.0) digitalWrite(LED5, HIGH); else digitalWrite(LED5, LOW);

  // Pokud telesna teplota prekrocila kritickou mez, zapnu bzucak
  if (teplota > 38.0) digitalWrite(BZUCAK, HIGH);
  else digitalWrite(BZUCAK, LOW);

  // Pockam 10 ms, at si vsechny cipy „oddychnou“ a vse zopakuji
  delay(10);
}
Diskuze (8) Další článek: Koronavirová omezení zvyšují návštěvnost PornHubu. Ten pomůže penězi i prémiovým členstvím zdarma

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,