Nudíte se? Postavte si wifi teploměr!

Ačkoli k mědvědům i medvídkům všeho druhu máme pozitivní vztah, tentokrát vám na nudu nebudeme ordinovat pořízení medvídka mývala, ale elektrobastlení, po němž neskončíte s něčím, co musíte krmit, ale co naopak bude krmit vás. Užitečnými daty. I když, počkat... O užitečnost tady zas až tak nepůjde.

Adam Lindenthal

Photo by Gary Bendig on Unsplash

Motivace

Určitě jste vždycky toužili vědět, jak teplo máte v obýváku v tu kterou denní či noční dobu. Že ne? Nevadí, já také ne :-) Vzhledem k cílové skupině lze ale předpokládat, že věta "protože to jde" postačí nejen jako odpověď na otázku "k čemu wifi teploměr, proč?", ale i jako dostatečně silná motivace se do něčeho takového pustit.

Pokud patříte k racionálnější a skeptičtější části publika, zkusím si vycucat z prstu několik "pádnějších" důvodů:

  • postavíte si vlastní IoT device a napíšete si to do CVčka
  • není to drahé (v podstatě...)
  • pokud vás měření teploty omrzí, celé to rozeberete a postavíte něco jiného
  • teplota v obýváku vynesená na časovou osu může opravdu být zajímavý údaj, obzvlášť pokud spolu s ní sbíráte i další veličiny
  • nemusíte monitorovat jen teplotu v místnosti, ale třeba teplotu vody v bazénu (patříte-li k těm šťastnějším), ve skleníku, v serverovém racku...
  • z nasbíraných dat můžete vytěžit nějakou novou informaci (do oken svítí slunce -> je tepleji, překvapivě) nebo nad nimi postavit nějakou automatizaci a tím si zjednodušit život, případně i něco ušetřit na energiích; ostatně základem chytré domácnosti je měření a sběr dat, aby bylo nad čím tu chytristiku a automatizaci vůbec budovat

Teď už i největší odmítač jistě touží po vlastním wifi teploměru. Nebudu to tedy zdržovat, pojďme na to.

Solidní základ

Nebudeme začínat úplně od nuly, tak jako když jste si před dvaceti lety stavěli plašič krtků podle schémátka v časopise Amatérské Radio (např. Arádio - Stavebnice a Konstrukce 2/97, str.4). Objedeme se i bez dovedností jako jsou leptání plošných spojů a když na to přijde, dá se to zvládnut i bez pájení. Obojí ale využít lze, i když spíše pouze v míře malé. 

Jako základ totiž použijeme vývojovou destičku ESP8266, popř. novější ESP32. Proč ne rovnou tu novější? Protože pár těch starších se mi shodou okolností válí v šuplíku, zatímco ta novější se mi zatím nikde neválí. Ještě jsem "nesdělal", popř. neoddělal, všechny ESP8266. Pokud se obsah vašeho šuplíku liší natolik, že tam ani jednu ESP8266 nemáte (těžko tomu uvěřit), klidně objednávejte rovnou ESP32. Nezkoušel jsem, ale postup by měl být až na drobnosti v podstatě totožný.

Pokud jste si někdy hráli s Arduinem nebo jeho klony, je to skoro to samé. Jedná se o maličký SoC (system on chip) počítač, oproti Arduinu má však k dispozici více výkonu (80MHz) a podstatně více paměti (minimálně 512kB) i uložiště (4MB flash). Nevypadá to jako mnoho, ale pro většinu podobných projektů je to už skoro kanón na vrabce. Především ale disponuje integrovaným wifi controllerem i anténou přímo na desce (u větších verzí desky s překvapivě rozumným dosahem, připojila se i v místech, kde se telefon už nechytal), takže není třeba si s konektivitou nějak lámat hlavu a dokupovat drahé shieldy pro Arduino. 

Programovat lze obě desky např. v prostředí Arduino IDE a použít stejný "dialekt" jazyka C (jsou ale na výběr i jiné jazyky).

Pokud hodláte napájet svůj výtvor baterií, je tu ještě jedna velmi podstatná výhoda - tzv. deep sleep režim, který umožní uvést celou desku na předem definovaný čas do stavu s velmi nízkou spotřebou energie, kdy jediné, co se napájí jsou hodiny reálného času (RTC) a pravděpodobně nějaký řadič přerušení (protože přes HW přerušení se celý tento drobný počítač opět probouzí). Kovaní hardwaristé, prosím, přijměte mou omluvu za prznění faktů a pojmů - jak jste si asi všimli, hardwarové stránce rozumím jako koza petrželi. Ale jednou tu máme dobu IoT a tak podobné výrobky může dělat každý debil :-) Ale to odbočujeme. 

V běžném prostoru se teplota mění pozvolna, a tak je málokdy potřeba znát čerstvý údaj každých pár vteřin. Nic se proto nestane, když se zařízení probudí, změří teplotu (příp. další veličiny), nějakým způsobem (typicky přes WiFi) ji odešle někam, kde je možné si hodnotu zapamatovat a kdykoli ji přečíst, a zase na nějaký čas usnout. 

Nebo se taky můžete rozhodnout, že chcete trvalé napájení ze sítě a pak můžete přímo na desce spustit odlehčený http server a nechat ostatní zařízení se na teplotu vždy dotázat.

Co všechno bude potřeba?

- vývojová deska ESP8266 nebo ESP32 (možná jsou i další podobné); pozor, oba typy existují v mnoha formátech od malé po titěrnou, doporučuji volit konzervativně, aby se ještě s piny dobře pracovalo (u menších verzí nejsou některé potřebné piny vyvedeny na "konektor" a je pak potřeba to s páječkou už trochu umět). Pokud objednáte z Číny, vyjde to na cca 100 - 200Kč, podle verze

- nějaké čidlo; např. DHT22, nebo levnější DS18B20, existují také nějaké varianty od firmy Bosch. Záleží, na jaké přesnosti trváte a kolik jste ochotni za ni zaplatit, obecně vzato to bude cca 50 - 200Kč

- pokud zvolíte nějakou menší verzi desky, která nemá integrovaný programátor, budete potřebovat externí programátor (resp. převodník z USB na UART); touhle cestou jsem nešel, takže přesně nevím, ale jedná se opět o jednotky dolarů

- nějaké drátky na propojení čidla a desky (idealně s tzv. DuPont konektory) a k tomu buďto nepájivé kontaktní pole, univerzální plošný spoj, nebo kousek kuprexitu, leptací roztok či peroxid a všechny ty věci okolo. Jde nám o to propojit výstupy (nožičky) čidla s piny na desce a zapojení dalších součástek (vlastně jedné, viz. dále). Možností je mnoho, jak to uděláte je na vás

- nějaký odpor, třeba 10k bude fajn; zní to vágně, ale na té hodnotě (pokud není diametrálně jiná) zas až tak extra nezáleží

- počítač, na kterém budete psát kód a nahrávat ho na desku, propojovací kabel s deskou (obvykle USB - mini/micro USB, podle konkrétní desky)

- v případě bateriového napájení samozřejmě vhodný článek a ideálně nějaký nabíjecí a stabilizační modul. Ja použil tohle, protože jsem měl doma články 18650 a příslušnou nabíječku, ale samozřejmě se to dá zbastlit klasickými LMxxx stabilizátory, různými step-up convertery a pár součástkami okolo. Osobně v téhle oblasti nejsem až tak v pevně v kramflecích, tak jsem vzal zavděk hotovým řešením za cca 2 USD.

Zapojení

Z předchozího popisu je zjevné, že toho zas až tak moc zapojovat nebudeme. Naše asembláž řeší vlastně jen tři věci - napájení, připojení čidla a pokud chceme využít deep sleep režim, tak i propojení pinu, který probudí desku ze spánku s pinem, který po uplynutí definované doby dá vědět, že je čas vstávat. 

Schéma zapojení s čidlem DHT22


Napájení

Pro napájení poskytuje deska několik možností, záleží čím chceme napájet a jaké napětí máme k dispozici. Já zvolil 3.7V článek typu 18650 a příslušný battery modul, který řeší nabíjení i napájení vč. stabilizace a na výstupu dává stabilních 3.3V, což je přesně napětí, které mají tyhle desky rády :-) Na mnoha fórech se sice řeší, kolik toho tyhle destičky opravdu snesou, údajně se dají provozovat na 4V i více, otázkou ale je, jak dlouho a jak stabilně. Teoreticky je tak možné vzít 3.7V článek (který bude mít plně nabitý bez zátěže třeba 4.1V) a připojit ho k desce napřímo, bez jakékoli další elektroniky a ochran, ale tím budete desku provozovat nejprve dost za hranou specifikace, poté s postupným vybíjením článku chvilku v optimálním rozmezí a nakonec deska vypne v době, kdy v článku ještě zbývá dost energie, protože poklesne nominální napětí pod provozní minimum. Jednoduchý modul tohle (zřejmě za cenu mírných ztrát) vyřeší a poleze z něj ideální napětí, ať je plně nabitý, nebo téměř prázdný.

Plus, není nutné vůbec řešit, který pin má jakou ochranu a stabilizaci a připojit výstup na základní Vcc pin a k tomu samozřejmě zem na GND.

Připojení senzoru

Připojení čidla je také velmi přímočaré. Můžeme si vybrat téměř kterýkoli z GPIO pinů (za chvíli si povíme o jednom který potřebujeme pro jiný účel), třeba podle krabičky, do které budeme chtít celý výrobek nacpat. Popřípadě různých čidel, nebo naopak nějakých výstupních zařízení (dioda, servo) můžeme chtít připojit poněkud více a pak se řídíme tím, který pin nám zbývá volný.

Senzory se připojují ke sběrnici 1-Wire, což - logicky - znamená, že budete potřebovat dva dráty :-) Vlastně tři. Ve skutečnosti to označení znamená, že na tom samém drátě může být připojeno senzorů víc. Senzor potřebujeme připojit na zem (GND), na datový GPIO pin (třeba D4) a k napájení (třeba na pin 3V3). Mezi datový a napájecí pin senzoru je pak dobrou praxí připojit zmíněný pull-up rezistor. Která nožička senzoru je která se dočtete v data sheetu toho konkrétního čidla, obvykle včetně doporučeného zapojení. 

Zprovoznění režimu hlubokého spánku

Usnout není pro desku problém, se vstáváním je to složitější (což je mi vlastně sympatické, mám to dost podobně). Po usnutí je prakticky celé zařízení neaktivní a jediné, co se napájí je “budík” (hodiny reálného času - RTC) se spotřebou řádově v mikroampérách. Když budík dotiká a příjde čas, “zazvoní” tím, že nastaví logickou úroveň HIGH (logická 1) na pinu RST. 

Nic víc se ale nestane, zbytku desky je to jedno. 

Chceme-li probrat desku z letargie, je potřeba do něj šťouchnout skrze pin GPIO 16, obvykle označený jako D0. A to právě tím signálem z budíku, který se objeví na pinu RST. Mezi tyto dva piny proto musíme dát propojku.

Některé (měnší) verze desky nemají oba tyto piny vyvedené na tzv. headery (řada pinů na kraji desky) a je potřeba vzít do ruky páječku a propojovat přímo nožičky procesoru. Je to titěrná práce, při které máte velkou šanci desku odeslat do křemíkového nebe. Proti gustu… Každopádně nic pro mě :-)

Ještě poznámka na okraj - desku lze probouzet i jinak než výhradně signálem z RST, může to být i úplně externí signál, např. z pohybového PIR senzoru - fantazii se meze nekladou - nicméně dále to zde rozebírat nebudeme.

Programování

Stejně jako v případě Arduina, i zde se drží tentýž model, kdy po startu zařízení se provolá metoda init() a následně se v nekonečné smyčce provolává metoda loop(). Při měření teploty (a podobných aplikacích, které neprobíhají kontinuálně) na konci smyčky buďto vykonávání na určitou dobu pozdržíme (delay), nebo rovnou desku uvedeme některého z úsporných režimů (sleep, deepSleep).

Kam s daty

Naměřené údaje je potřeba někde uchovávat. Pokud se rozhodnete pro “pasivní přístup” a na desce spustíte web server, máte asi vystaráno - kdo chce, pošle si request a podívá se na aktuální teplotu. Z principu pak ale nemůžete desku uspávat a šetřit tak energií, tento přístup je tak vhodný zejména pro provoz z elektrické sítě. 

Při “aktivním přístupu” - deska se někam připojí předá data - je výběr nepřeberný. Klasika je http, může to ale být i google tabulka (přes google action script), databáze - ať už na vlastním serveru nebo někde na cloudu, ať už relační, nebo třeba InfluxDB nebo jakákoli jiná, nějaká webová služba (třeba IFTTT), email, nebo specializovaná služba na sběr dat z IoT zařízení (thinkspeak, apod). Pokud chcete propojovat více zařízení různých výrobců (i vlastní výroby) do nějakho centrálního hubu, docela šikovná volba je protokol MQTT

Kód

Každou z možností se zde zabývat nemůžeme, navíc je toho plný internet, takže pro ukázku alespoň jedna z možností, kdy teploměr posílá MQTT zprávu s teplotou a vhlkostí s čidla DHT22 přes bezdrátovou síť. Statická IP adresa je nám v tomto případě vcelku k ničemu (celý ten stroj většinu času prospí), takže spoléháme na DHCP.

Zjednodušeně pak může program vypadat např, nějak takto:

`<p>CODE: https://gist.github.com/Duck28/2ab5f802be72ce348db9841511c8d87d.js</p>`

Upload na desku a ladění

Program se pak nahraje na desku připojenou k počítači přes USB přímo z IDE (v případě Arduino IDE je to volba Sketch -> Upload). Někdy to na první dobrou nejde a je potřeba řešit ovladače (tady záleží na tom, jaký má vaše deska UART - USB převodník, obvykle jsou to CH340 nebo CP2102), ale není to nic, co by se nedalo snadno dohledat.

Pokud vám program nefunguje na první pokus bezchybně, nejste první ani poslední. Pokud necháte desku připojenou k počítači (ať už přes vestavěný nebo externí programátor), můžete si do programu přidat debugovací výpisy a přečíst si je po seriové lince. Jen je třeba správně nastavit přenosovou rychlost v kBaud/s, aby vysílač (deska) i přijímač (počítač) byli na stejné vlně.

Provoz

Na půdě, kde je v létě nesnesitelné vedro a v zimě je tam skoro jako venku vydrží nabitý článek 18650 s kapacitou kolem 3000mAh (když byl nový) shromažďovat a vysílat data cca tři měsíce. Není to ohromující, ale nějaké větší optimalizaci jsem se prostě nevěnoval, zatím mi to tak stačí. Některé varianty desky jsou o něco úspornější, dá se použít úspornější stabilizátor napětí, někdo dokonce odpájí z desky stavové LEDky, aby nežraly… To už záleží na každém bastlíři a do jisté míry je to i součást té zábavy.

Pokud jste došli až sem a před vámi leží funkční klubko drátů a vesele vykreslujete grafy teploty u vás doma (btw, kdyby se to tak chtělo trošku víc měnit, ať ten graf líp vypadá, což?), cítím jako svou povinnost vám poskytnout ještě jistá bezpečnostní varování.

S elektřinou není sranda, dokonce ani s baterkama! Ale to jsem nemyslel, to všichni víte, nás teď zajímá něco jiného - tzv. WAF skóre - Wife Acceptance Factor, někdy též Wife Approval Factor. Pokud jste svobodný mládenec, nebo jste svou životní partnerku poznal na fyzikální olympiádě, jste v pohodě - vás se to netýká. A my ostatní... No, však na to asi brzo přijdete každý sám ;-) 

Já dopadl celkem dobře a teplotu měřím nahoře na příborníku (není tam zespodu vidět), na půdě (kam nikdo kromě mě takřka nevkročí) a v garáži (tam by se vzhledem k entropii ztratil i sálový počítač). Ke cti mé drahé polovičky dlužno dodat, že první verze, s hodnotou WAF už od pohledu někde u bodu mrazu, vydržela poměrně dlouho na kuchyňské lince a zabírala tam prominentní zásuvku. Nic ale netrvá věčně… 

Jeden z "hotových" teploměrů. Ta Wago svorka by tam nemusela být, pokud bych měl po ruce správné propojovací kabely, nebo nebyl líný pájet. Každopadně i tak by to bylo za -990 WAF bodů.

Na závěr

Ač celý proces stavby a zprovoznění není v ničem nepřekonatelně složitý, obnáší nezanedbatelné množství práce, obzvlášť dělá-li člověk něco takového poprvé. Může pak působit lehce demotivačně, když zjistíte, že například Xiaomi vyrabí hotový Aqara Temperature Sensor, který měří teplotu, vlhkost i atmosfreický tlak a posílá data přes protokol ZigBee do své proprietární brány (kterou lze však snadno nahradit vlastním řešením s běžně dostupným hardwarem a open source softwarem), funguje na jednu knoflíkovou baterii několik měsíců až let, je mnohem menší než krabička od sirek a navíc má formu úhledné krabičky, ne klubka drátů. A to vše za cenu kolem dvou stokorun. Nicméně, jak známo, i cesta může být cíl a v průběhu realizace vlastního projektu zažijete víc zábavy a nesporně se víc naučíte, než při koupi hotového. A to se přece počítá.

programování
IoT
WiFi
ESP8266
ESP32
bastlení
arduino
hardware
C
Zpět →