Vývoj elektroniky | 11. 12. 2018

Arduino na steroidech (část 2. (závěr))

Tento článek je pokračováním článku z [1], kde jsme se podrobně seznámili s čipem ESP8266 a vývojo­vým modulem NodeMCU, dále si instalovali vývo­jové prostředí PlatformIO a potřebná rozšíření pro čip ESP8266. Doufám, že jste si tento modul, který je velmi vstřícný vůči vývojářům a vůbec bastlířům, na eBayi za pár dolarů objednali a zkusili klasický příklad s rozblikáním LED. K tomu stačí opravdu jen NodeMCU, PC a USB kabel. Nic víc. Nyní nastává slí­bený okamžik, kdy se seznámíme s reálným využitím modulu ESP8266 ve funkci (nejen) dveřního senzoru odesílajícího email v případě otevření dveří, jak jsem sliboval v závěru minulého článku. Pojďme tedy na to.

Následující text pojmu trošku jako výklad a trošku jako příběh. Příběh, kterým vás provedu od začátku návrhu zapojení zmíněného dveřního senzoru přes slepé vývojové cesty až ke zdárnému konci. Můžete samozřejmě přesko­čit a postavit si ono zařízení rovnou. Ze software (progra­mového vybavení obou mikrokontrolérů) uvedu pouze ukázky, pokud bude mít někdo zájem, nechť mi napíše na email, SW mu na vyžádání zašlu. Předesílám, že senzor jako celek se skládá ze dvou programovatelných obvodů – a to ESP8266 [2] zajišťujícího WiFi komunikaci – odesílání emailu a ATTiny85, který slouží v podstatě jako R/S klopný obvod. Pokud by zapojení chtěl někdo zjednodušit, tento R/S obvod není nutný a malou modifikací zapojení může senzor pracovat pouze v konfiguraci s ESP čipem. Ale o tom dále.

Celý dveřní senzor je realizován v tomto okamžiku jako prototyp na vývojové desce – obr. 1, tzv. „breadboardu“ – jedná se o PCB s izolovanými body v rastru 2,54 mm, slou­žící k prototypové stavbě, nebo k realizaci jednoduchých zapojení, u kterých je zbytečné nebo časově náročné vytvá­řet konkrétní obrazec plošných spojů. Součástky jsou do „breadboardu“ klasicky pájeny a spoje se realizují pomocí drátků na spodní straně desky. Tato montáž je vhodná pro klasické součástky nebo hotové moduly, nikoli pro SMD, ovšem za pomoci trpělivosti, popř. různých adaptérů, např. mezi SOT23 pouzdro a rastr 2,54 lze používat i SMD komponenty.

Cesta vývoje senzoru

Prvotní pohnutkou k designu tohoto dveřního senzoru byla potřeba detekce otevření vchodových dveří v bytě a oznámení této události na mobilní telefon. Forma ozná­mení mohla být libovolná, zvolil jsem tedy email z naprosto jednoznačného důvodu – různé možnosti pomocí slu­žeb typu Messenger, Viber, WhatsUp jsou sice lákavé, ale neustálá změna podmínek a ořezávání API rozhraní může způsobit nutnost program v senzoru upravit, popř. úplně předělat. V současné době není problém pomocí jiných služeb si nastavit, že po přijetí emailu se specifickým předmětem nebo od specifického odesílatele či určitému adresátovi reagovat zasláním zprávy na vybraný komuni­kátor – tzv. IFTTT (if this, then that) [4]. Toto vše ovšem podmiňuje používání datového tarifu na mobilním telefonu. Je zde ovšem ještě jedna možnost, kterou můžeme vyu­žít – zatím všichni mobilní operátoři umožňují přeposílat část emailu jako SMS zprávu. A bingo – bez nutnosti mít datový tarif nebo chytrý telefon – tato varianta bude spo­lehlivě pracovat i na starém tlačítkovém telefonu. Vodafone nabízí zřízení emailu ve tvaru xxxxx@vodafonemail.cz, který z emailu vezme prvních 320 znaků a přepošle vám dvě SMS po 160 znacích na vaše mobilní číslo. Jiní operátoři tuto možnost taktéž nabízí, ptejte se na infolince.

Doručovací kanál tedy máme, potřebujeme však ještě něco na straně senzoru, a to je přítomnost WiFi sítě. Pokud tímto nedisponujeme, nebude dveřní senzor pracovat. Protože však můj byt – a předpokládám, že i další byty či domky technologických nadšenců – jsou pokryté WiFi signálem, ušetříme za komunikační modul na bázi SMS nebo GPRS. Koneckonců není problém si v případě nut­nosti nějakou fotopast či bezpečnostní zařízení oznamující pomocí SMS vniknutí do objektu koupit. Ale to není náš případ – my si ono zařízení sami vyrobíme. A hlavně si ho můžeme modifikovat podle našich konkrétních potřeb a program upravit k obrazu svému. To mají zloději nejraději.

Modul ESP8266 se dokáže připojit do libovolné WiFi sítě v kmitočtovém pásmu 2,4 GHz. Pokud provozujete síť pouze na 5 GHz, budete si muset opatřit nějaký starší přístupový bod pro toto frekvenční pásmo, ESP bohužel 5 GHz neumí. Dále se neumí přihlásit do firemního zabez­pečení, nezvládá tedy tzv. ENTERPRISE mode. Klasické přihlášení pomocí SSID a hesla se šifrováním WPA a WPA2 je samozřejmostí – je obecně známo, že WPA2 je minimální bezpečnostní standard.

A teď k samotnému návrhu zapojení. Protože bude zaří­zení napájeno z baterie, aby mohlo být umístěno kdekoli a zabíralo co nejméně místa, je kritickým parametrem jeho proudový odběr. Proto bude celý design zaměřen na mini­malizování odběru proudu z baterie. Pro detekci otevření dveří, oken, nebo čehokoli jiného budeme potřebovat mag­netický nebo jiný spínač, který je klidu rozepnutý. Vyrábí se totiž obě varianty – v klidu sepnutý a v klidu rozepnutý. Proč právě rozepnutý? Klíč je v protékajícím proudu přes spínač a detekční vstup v klidovém stavu, který trvá většinu doby. Podívejme se na obr. 2, který ukazuje 4 možnosti připojení detekčních spínačů k vyhodnocovací jednotce, v našem případě mikrokontroléru, ať už ATtiny (Atmel), nebo ESP. Jaké jsou výhody a nevýhody jednotlivých řešení:

Obr. 2

SW1 – NO (normally open) – vhodné pro detekci, kdy kon­trolovaná událost způsobí sepnutí kontaktu – v klidu je kontakt rozepnutý a vstup mikrokontroléru je pomocí rezistoru držen na nulovém potenciálu. Protože se jedná o vstupní pin, neteče přes rezistor ani do vstupního pinu téměř žádný proud. Vstupní pin musí být samozřejmě konfigurován tak, aby nebyl připojen vnitřní Pull‑up rezistor – pozor na to. Tato metoda připojení je použita v našem případě.

SW2 – NC (normally closed) – vhodné pro detekci, kdy kon­trolovaná událost způsobí rozepnutí kontaktu – v klidu je kontakt sepnutý a do vstupu mikrokontroléru teče malý proud – v případě ATtiny typicky méně jako 0,05 μA – problém je však jinde – v případě rozpojení spínače musíme definovat novou logickou úroveň, a to pomocí rezistoru, který je připojen k zápornému pólu. Tzn., že rezistorem protéká v klidu proud – ten můžeme regulo­vat pomocí velikosti tohoto „zemnícího“ rezistoru, jehož velikost by však měla být taková, aby onen potenciál na vstupním pinu definovala. Např. pro velikost rezistoru 1 MΩ dostáváme velikost příčného proudu 3,6 μA, což není rozhodně zanedbatelný proud a způsobí pokles životnosti baterie.

SW3 – NO (normally open) – vhodné pro detekci, kdy kon­trolovaná událost způsobí sepnutí kontaktu – v klidu je kontakt rozepnutý. Rezistor nastavuje vstupní pin do logické úrovně 1, vstupní proud pinu je dle katalogu typicky méně jako 0,05 μA, max. 1 μA. Toto připojení je senzoru je také vhodné.

SW4 – NC (normally closed) – vhodné pro detekci, kdy kon­trolovaná událost způsobí rozepnutí kontaktu – v klidu je kontakt sepnutý, bohužel jím protéká neustále příčný proud (jako varianta SW2) daný velikostí rezistoru zapo­jeného mezi vstupní pin a kladný napájecí pól.

Protože jsem našel v zásobách starý magnetický kon­takt MAM212 ze zabezpečovací ústředny TESLA Alarmic vyráběné kdysi v Tesle Liberec, který je v klidovém stavu rozepnutý, volil jsem zapojení spínače SW1. Pokud najdete v zásobách kontakt MAM202, který je v klidu (přiblížený magnet) sepnutý, budete muset volit variantu SW2 nebo SW4 za cenu snížení životnosti baterie. Proto hledejte u prodejců takový spínač, který je v klidu (stav v pořádku) rozepnutý, tedy NO – normally open. Může to být mecha­nická nástraha – přímé kontakty, nebo už zmíněný jazýč­kový kontakt ovládaný přiblížením a oddálením magnetu.

Obr. 3

Obr. 4

Obr. 5

Jaký zvolíme ESP8266 modul? Můžeme použít přímo NodeMCU – obr. 3, který má však v originálním zapojení nevýhodu velké klidové spotřeby – trvale je zapojen stabili­zátor napětí, dioda i USB/RS232 převodník. Existují návody, jak odpájením diody a přemostěním stabilizátoru spotřebu snížit, ale my zvolíme pří­mou cestu – použijeme modul ESP12E – obr. 4. Má vyvedené všechny potřebné signály a celkem snadno se pájí – existuje na něj redukce – obr. 5. Proč je použitý nějaký další mikrokontrolér, copak modul ESP není chytrý dost na tuto jednoduchou operaci? Je i není. ESP modul, jak jsem zmiňoval dříve, umí několik tzv. „sleep“ módů. To jsou speciální režimy, kdy se na úkor omezení činnosti také snižuje spotřeba celého modulu – viz tabulka 1. Pro nás je nejdůležitější tzv. „deep sleep“ mód. V tomto režimu je spotřeba celého modulu v řádu desítek μA, skoro všechno je vypnuto a jediné co běží je RTC generátor, který jsme nastavili před usnutím obvodu. Po vypršení nastaveného času dojde k vygenero­vání záporného pulsu cca 250 μs na vývodu GPIO16, který, pokud je vodivě spojen s RST vstupem, provede probu­zení obvodu a vykonání první instrukce programu. Odtud je zřejmé, že jediné probuzení ze spánku je možné pomocí vygenerování RESET signálu. A zde je kámen úrazu – nevíme, zda proběhl reset např. z důvodu vypnutí napájení, zda ho způsobil RTC časovač nebo jiná událost, která je na RESET vstup připojena. Pokud si budeme chtít zapojení zjednodu­šit, můžeme připojit spínací kontakt (pozor, pouze NO) mezi reset a GND a máme zabezpečovací zařízení hotové. Protože však chceme trošku inteligence, nezbývá nám, než něco přidat. A tím je právě onen externí obvod okolo detekčního spínače. Využijeme toho – obr. 6 (celkové schéma senzoru), že nám spínač obvod probudí, ale dalším signálem na GPIO5 (v našem případě, samozřejmě lze využít kterýkoli jiný) ozná­míme obvodu, že reset způsobil bezpečnostní kontakt a ne RTC. A proč máme RTC vlastně využívat? No, např. proto, že v případě dlouhé nečinnosti nebudeme vědět, zda senzor pracuje nebo ne – např. se vybila baterie nebo dalším spína­čem můžeme oznámit, že někdo otevřel skříňku s elektroni­kou. Senzor se tedy bude pomocí RTC pravidelně probouzet a kontrolovat velikost napětí baterie, ale email se odesílat nebude – a pokud ano, tak jen, že je nutné baterii vyměnit, nikoli že je poplach. Pro zapamatování stavu senzoru je vhodný tzv. R/S klopný obvod, neboli R‑S Flip‑flop obvod. Změna našeho detekčního kontaktu způsobí jednak reset ESP a také nastaví výstup R/S obvodu tak, že ESP pozná, zda šlo nebo nešlo o RTC reset. Pokud reset způsobí kontakt, pak ESP signálem na GPIO4 tento stav smaže (provede reset flip‑flop obvodu) pro další cyklus. R/S klopný obvod je vlastně jednoduchá (jednobitová) paměťová buňka.

Tab. 1

Obr. 6

Původně jsem na místě R/S klopného obvodu zkoušel přímo k tomu určený CMOS4XXX obvod, bohužel spotřeba v klidu byla v řádu desítek μA, což degradovalo výdrž baterie. Další variantou, se kterou jsem si hrál, bylo použití oblíbeného časovače 555 ve verzi CMOS, tedy 7555. Opět nevýho­dou byl klidový odběr v desítkách μA. V podstatě všechny varianty provedení R/S obvodu ztroskotaly na spotřebě v klidovém stavu. Proto jsem zvolil obvod Attiny85 (měl jsem jej po ruce, lze samozřejmě použít i Attiny25 nebo 45, taktéž minimalistický ATtiny10 – program není tak dlouhý), který s implementovaným stavovým automatem slouží jako R/S obvod. Snížení spotřeby na úroveň cca 0,3 μA bylo dosaženo uvedením ATtiny do „sleep“ módu, ze kterého lze mikrokontrolér probudit změnou úrovně na předem určeném pinu. Kdyby toto umožňovalo ESP, není celé hara­kiri s externím R/S obvodem nutné. Ale ESP8266 toto bohužel neumí – umí to až jeho mladší bratříček ESP32, ale to je jiná kapitola.

Navíc si přidáme ještě speciální signál ze spínače do vstupu GPIO14, který bude ESP obvodu oznamo­vat, v jakém stavu je kontakt. Můžeme totiž měřit dobu, po jakou je spínač sepnutý – může se stát, že dveře zůsta­nou otevřené. Nebo je někdo v krátkých intervalech zavírá či otevírá – závisí na umís­tění – okno, vrata. Lze si tak v programu nastavit, po jaké době a jak vůbec budeme reagovat poplašným emailem. To nám zcela rozšiřuje mož­nost individuálního řešení – např. pokud se věc vrátí na místo do určité doby, email se nepošle.

Zajímavá část (která ač jednoduše finálně vypadá, pro­šla velmi klikatými uličkami) zapojení je sloučení budícího „wake‑up“ signálu z GPIO16 generovaného RTC časova­čem v pravidelných intervalech a „budicího“ signálu z čidla. Protože RESET reaguje na záporný impuls, (RTC výstup generuje záporný impuls délky cca 250 μs) musí být sig­nály nějak sloučeny. K tomu slouží hradlo AND. Nikoli však hotový modul, ale kombinace sestávající z dvou diod a jed­noho rezistoru: pull‑up rezistor 10 kΩ připojený na Vcc. Dvě spínací schottkyho diody (z důvodu malého úbytku napětí v propustném směru) tvoří dva vstupy pro RESET signál. Možná by stačilo použít přímo výstup z ATtiny na onu diodu, ale z historického důvodu, kdy jsem si hrál s R/S obvo­dem tam zůstal spínací N‑MOSFET tranzistor, který připojí katodu diody na zemní potenciál a generuje tak reset ESP. Puls vytvořený ATtiny mikrokontrolérem má délku 1 ms – viz popis obslužného programu.

Obr. 7

S tímto obvodem okolo resetu je spo­jena velká část slepé designérské cesty. Při mnoha hrát­kách a měření tvaru reset signálu z RTC (GPIO16) a signálu na RST pinu mě znepo­kojoval modifikovaný tvar – jakási pomalá náběžná hrana – viz obr. 7. Efektem, který jsem totiž pozoroval po probuzení RTC časovačem, bylo upadnutí ESP obvodu do tzv. „zombie“ stavu – obvod měl spotřebu kolem 40 mA, ale byl „mrtvý“ – nekomuniko­val, sériová linka nepracovala. Jediné, co pomohlo, byl tvrdý reset. Strávil jsem několik večerů pokusy jak tuto hranu narovnat – byla podle mně evidentně způsobena diodovým oddělením. Při propojení mezi GPIO16 a RST „natvrdo“ byl resetovací puls krásný obdélník. Pomocí dvojic N a P MOSFET tranzistorů jsem postavil dva oddělovače v tzv. totem zapojení, které sloužili k posílení výstupu signálu za diodou tak, aby RST signál byl strmý. Domníval jsem se, že je v modulu nějaká velká kapacita, o které nevím, a která se pomalu nabíjí přes pull‑up rezistor 10 kΩ. Měnil jsem několik ESP12 modulů, zkoušel NodeMCU moduly, ale pořád docházelo po resetu obvodu k uvedení do „zom­bie“ režimu (fórum [3]) – název jsem si nevymyslel, toto chování ESP je popsané a probírá se na spoustě interne­tových diskuzních fórech. Po několika večerech jsem však problém odhalil – a nebyl vůbec způsobený změněným tvarem reset pulsu. Začal jsem totiž měřit nejen napětí na RST pinu, které tak nějak „mírně“ klesalo, ale i napětí na Vcc pinu modulu ESP12E. To totiž po probuzení také klesalo… Zkrátím to – pro měření proudové spotřeby celého senzoru jsem používal FLUKE 8845 A multimetr, který má nejnižší rozsah 100 μA a standardně zapnutou automatickou volbu měřícího rozsahu. Pokud byl modul ESP uspaný a spotřeba činila cca 20–80 μA, byl automaticky nastavený rozsah 100 μA, který má však poměrně velký průchozí odpor – bočník. Protože však ESP v okamžiku připojení do WiFi má spotřebu i 250 mA, došlo k poklesu napětí na bočníku a než multimetr zareagoval přepnutím na vyšší rozsah s menší velikostí bočníku, ESP spadlo do zmiňovaného „zombie“ stavu, protože Vcc napětí na něm pokleslo a způsobilo tak nějaký nedefinovaný stav. V okamžiku nastavení pevného rozsahu multimetru 100 mA začalo zapojení po resetu pracovat normálně. Výše uvedenou příhodu uvádím jako ilustraci toho, co vás může při vývoji libovolného zařízení potkat a jak je třeba měřit, přemýšlet a analyzovat možné příčiny. Samozřejmě, že jsem mohl mít vadnou sérii ESP modulů, protože jsem jich v daném zapojení vyzkoušel asi pět, ale pravděpodobnější je problém v konstrukci.

Ostatní rezistory a součástky jsou předepsané výrob­cem, nebo vycházejí ze zkušeností. ATtiny ovládá indikační LED, která po připojení napájení 5× zabliká a tím indikuje, že ATtiny je připravena. Také se rozsvítí po detekci sepnutí spínače a indikuje otevřené dveře. Rezistory připojené k ESP pinům GPIO0, GPIO2, GPIO15 a EN (Enable) jsou doporučeny výrobcem. Velikosti mohou být od jednotek kohmů (viděl jsem 3,3 kΩ) až po 12 kΩ, které jsem používal v nějakých konstrukcích. Rezistor 470 Ω zapojený do ESP programovacího konektoru slouží k ochraně signálu TxO (tedy TX výstupu) proti zkratu. RxI (RX input) je vstupní, tam problém s případným zkratem není.

Za zmínku ještě stojí použití rezistorů 330 Ω okolo ATtiny – ty jsou z důvodu ochrany programovací ISP sběr­nice, protože při programování by ESP mohl nějak ovliv­ňovat signály a způsobit např. dvou výstupů proti sobě. Zařazením rezistoru do signálové cesty dává prioritu ISP programátoru bez ohledu na stav signálů ESP modulu. Je to doporučené oddělení dle aplikační poznámky výrobce Atmelu.

Pro programování modulu ESP12 budeme potřebovat speciální převodník / generátor signálů a také interface stan­dardu RS232 v TTL úrovních – obr. 8. Využijeme totiž nejen RX a TX, ale také dva signály, které ovládají stav ESP, a to RESET a BOOT signál. Ovládání je převzato pro kompatibilitu s vývojovou deskou NodeMCU, takže PlatfomIO i Arduino IDE prostředí můžeme dále používat. Navenek se bude náš modul totiž tvářit jako NodeMCU. Schéma převodníku je na obr. 9. Není to nic složitého. Potřebujeme pouze převodník USB/RS232 v 3,3V TTL logice. Signály RX a TX propojíme přímo – pozor, musíme je ale „překřížit“ – TxO spojíme s RxI, signály DTR a RTS propojíme přes tranzistorový převod­ník. Použít můžeme libovolné univerzální NPN křemíkové

tranzistory. Já osobně použil MPSA44A, v pořádku je BC547 a podobné. Jako USB/RS232 doporučuji hotový modul z eBay, který využívá miniUSB a obsahuje přepínač mezi 3,3V a 5V logikou. Programování si řídí obě vývojové platformy samy, dokáží správně ovládat signály DTR i RTS.

Obr. 8

Obr. 9

Popis funkce zařízení

Jak jsem zmiňoval na začátku, dveřní senzor je složen ze dvou mikrokontrolérů. Nejdříve tedy popis činnosti ATTiny85 ve funkci R/S klopného obvodu. Seznamme se nejdříve vůbec s činností R/S klopného obvodu. Tento má dva vstupy zvané SET a RESET, dále pak výstup Q, někdy i negovaný výstup Q’ – tabulka 2. Qt je současný stav, Qt+1 je stav následující. Ve zkratce lze řící, že vstup S (SET) nastavuje výstup Q do 1, vstup R (RESET) ho nastavuje do 0, tedy maže. Komplementární výstup Q’ je invertovaný k Q. Zakázaný stav jsou oba vstupy v logické 1. Pak je výstup Q nedefinovaný. V mikrokontroléru je R‑S obvod naprogra­mován jako tzv. „konečný stavový automat“, anglicky „state machine“. Čidlo je připojeno na vstup PCINT3, který je v nastavení povolen jako zdroj přerušení při změně úrovně. Pokud tedy nastane sepnutí kontaktu, změní se na vstupu logická 0 vytvářená pull‑down rezistorem na logickou 1. Mikrokontrolér se probudí a začne vykonávat program tam, kde byl uspaný – výpis programu Program 1 – je zde pouze nekonečná hlavní smyčka programu. Na začátku je definována stavová proměnná „state = 0“, což je číslo stavu odpovídajícímu prvnímu spuštění po zapnutí. Před volání smyčky se nastaví všechny vstupy a výstupy, mikrokont­rolér používá jako zdroj hodin interní RC oscilátor 8 MHz, softwarově je nastavena dělička 8 pro snížení frekvence hodin na 1 MHz z důvodu snížení spotřeby. Program tedy poprvé zabliká, pokud jsou po spuštění dveře již otevřené, nastaví se stav 5, jinak stav 1, což je uvedení do sleep módu, které v dalším průchodu smyčky nastane poté, co se všechny možné piny nastaví jako výstupní do 0 – tím se sníží spotřeba ve sleep stavu. V okamžiku probuzení následuje volání funkce pro rekonfiguraci nastavení pinů do původního situace a nastavení stavu 2.

Program v mikrokontroléru má nastavený časovač tikající na 100 s. Použije se pro přesné nastavení reset pulsu pro ESP. Protože je RESETPULSE = 10 a stavový automat přejde do stavu 3, kde se čeká na časovač, jenž automaticky po 10 průchozích ukončí generování reset pulsu a zároveň zruší informaci o přijetí přerušení od čidla a přechází na stav 4, kdy se čeká na signál RESET pro R/S obvod. Není zde žádné časové omezení. Jakmile je signál RESET zaznamenán, výstup Q je nastaven na 0 a automat přechází do stavu 5, kde se čeká na zavření dveří, pokud jsou stále otevřené. Jakmile je někdo zavře, povolí se opět přerušení na vstupu PCINT3 a přecházíme do stavu 1. Tímto je ve zkratce popsána funkce ATtiny mikrokontro­léru. Program lze dovybavit dalšími smyčkami a kontrolami hazardního stavu, nicméně takto je algoritmus plně funkční. Je zde vidět výhoda programovatelného obvodu – například čekání na zavření dveří by se s diskrétními součástkami tvořícími R-S obvod velmi špatně realizovalo.

Následuje popis funkce programu v obvodu ESP. Program je napsán v Arduino frameworku. Jak jsem zmi­ňoval v prvním díle, používám pro vývoj PlatformIO IDE, které od jara 2018, kdy vyšla první část článku, urazilo velkou cestu. Taktéž ESP8266 Arduino framework by opraven, mohu tedy opravdu doporučit místo standard­ního Arduino IDE rozhraní. Pro popis uvedu jen funkce setup(), loop() a SensorSleep(). Dalšími funkcemi je připo­jení do WiFi sítě a odeslání emailu, ty jsou delší a vysvět­lení je zbytečné – lze je najít na internetu v příkladech pro ESP8266. Právě s vlastním odesíláním emailu můžeme narazit. Spousta internetových providerů totiž nepovoluje použití SMTP serveru, pokud k nim nejste buď fyzicky připojení, nebo se nepřihlašujete jménem a heslem – je to z důvodu ochrany proti spamu. Někdy je zablokován i port 25. Můžeme si tedy napsat vlastní komunikaci přímo s SMTP serverem poskytovatel připojení nebo využít externí SMTP server. V IoT komunitě se často doporučuje služba https://www.smtp2go.com/, která zdarma umožňuje posílání do 1 000 emailů měsíčně. Protože se připojuji přes internetového providera NETBOX, využívám přímo SMTP server smtp.netbox.cz. Správné nastavení v programu je základ úspěchu, při ladění pomohou pomocné výpisy komuni­kace mezi ESP a serverem. Funkce setup() (výpis Program 2) nastaví sériovou linku pro kontrolní výpisy (DEBUG), dále nastaví správné piny pro vstup/výstup. Následuje připojení k WiFi a kontrolní ladící výpisy, např. časovače. Měřím si totiž, jak dlouho mi bude trvat přihlášení k WiFi, abych ho mohl považovat za neúspěšné a restartovat jej. Zajímavá je někdy funkce system_get_rst_info() – zde to sice není důležité, ale někdy a pro jiná zapojení s ESP8266 se to může hodit – tabulka 3. V našem případě se objeví buď 0 – tedy zapnutí, nebo 5 – tedy probuzení „deep-sleep”. Následuje vykonání funkce loop().

Tab. 3

V této funkci čtením stavu pinu STATUS_RS (což je výstup Q z R/S klopného obvodu) zjistíme, zda se ESP probudil pomocí RTC časovače pro kontrolu baterie – algoritmus není v ukázce implementován, nebo opravdu poplachem díky sepnutí kontaktu. Jestliže je tedy vyhlášen opravdový alarm, počkáme, než se dveře uzavřou (čtení stavu DOOR_SW signálu) – není to nutné, smyčku můžeme vynechat nebo ji umístit jinam a čekat, než se dveře zavřou, popřípadě kontrolovat čas, jaký jsou dveře otevřené a např. poslat email, že někdo zapomněl po sobě zavřít…

Resetujeme impulsem z ESP do ATtiny trvajícím 10 ms R/S klopný obvod a odešleme informační email. Na závěr zavoláme funkci SensorSleep(); V ní se pouze vypíše ladicí informace o času uspání sensoru a funkcí ESP.deepSleep() se ESP uspí na nastavený čas (parametrem jsou μs) – v mém případě 5 minut – zapínám senzor velmi často, pro­tože měřím životnost baterie a statisticky dobu připojení do vlastní WiFi sítě.

Originální programy pro oba mikrokontroléry na požá­dání zašlu – email je uveden pod článkem. Rád bych se ještě podělil o několik drobností, které mi pomáhají s vývojem a které mohou možná pomoci i vám.

První takovou pomůckou, nehmotnou, jsou ladicí výpisy, jak je možné vidět ve výpisu programu pro ESP čip (pou­žitelné jsou však pro jakýkoli C jazyk). Jsou volány pomocí DEBUG_PRINTLN(„Senzor aktivni“); apod. Samozřejmě lze použít pro kontrolní výpisy přímo Serial.println(„text“), ale pokud chceme rozlišovat kompilaci programu pro svoje ladění a distribuční verzi, kde nechceme aby výpisy na sériové lince byly u zákazníků vidět, můžeme použít násle­dující makra:

Jak to pracuje? Jestliže na začátku programu definujeme #define DEBUG, pak jsou všechny DEBUG_XXXXX makra nahrazeny skutečným voláním výpisu na sériovou linku. A až je program hotový, odstraníme nebo zakomentujeme #define DEBUG, znova přeložíme a všechna volání výpisů jsou odstraněna. Distribuční verze programu je připravena a velmi rychle se můžeme vrátit v případě nutnosti k vývo­jové verzi programu.

Další pomůckou, kterou si vám dovolím nabídnout, jsou speciální průchozí banánky – obr. 10. Jsou poměrně drahé – cca 120–150 Kč na Farnellu, liší se přítomností mechanické ochrany na vlastním pinu. Používám je velmi často, protože zjednodušují připojení libovolných vodičů do multimetru nebo zdroje – pouhým stisknutím tlačítka drát upevníme či uvolníme – něco jako WAGO svorky. Neznačkové nabízí i GES. Existují i přímo originál WAGO banánky, nevýhodou je, že nejsou průchozí, cena je cca 40–50 Kč, nabízí je zatím GME.

Obr. 10

Takový tip na snížení spotřeby uspaného ATtiny je nasta­vit všechny nepoužité piny jako výstupní s úrovní 0. Zmiňuji to v předchozím textu, jen připomínám. V tomto konkrétním případě se snížila spotřeba ATtiny ve spánku z 20 μA na konečných akceptovatelných 0,3 μA.

Další poznatek je ohledně spotřeby ESP8266 ve zmiňo­vaném „deep sleep“ módu – tabulka 1. kde se zmiňuje spo­třeba 10 μA. Tato spotřeba silně závisí na napájecím napětí.

Pokud je připojen čerstvě nabitý LiON akumulátor s napě­tím okolo 3,9 V, může spotřeba narůst až na 90–100 μA. Se snížením napětí na cca 3,6 V spotřeba klesne na cca 20 μA – viz obr. 11. Modul ESP8266 má podle katalogového listu napájecí napětí 2,5–3,6 V, předpokládám, že oněch 10 μA lze dosáhnout při nejnižším provozním napětí.

Obr. 11

Poslední pomůcka, související s měřením klidové spo­třeby mikrokontroléru, je odpínač ISP programovacího rozhraní – obr. 12. Těžko totiž lze měřit reálnou spotřebu zařízení s připojeným programátorem. Zapojení je velice jednoduché – bistabilní relé ovládají všech 5 signálů – MISO, MOSI, SCK, RESET a VCC, které odpojují. Relé lze ovládat ručně tlačítky, ale i externími signály, což je výhodné, pro­tože mikrokontrolér může sám ovládat připojení a odpojení programátoru. To je výhodné v případě použití citlivého měřicího přístroje – mikroampérmetru – u kterého nedo­jde k přetížení, protože se může automaticky připojit až v okamžiku, kdy mikrokontrolér usne a zároveň se odpojí programátor.

Obr. 12

Závěr

V článku je popsáno zapojení a programové vybavení bateriově napájeného dveřního senzoru oznamujícího ote­vření pomocí emailu skrze WiFi připojení. Senzor je sesta­ven ze dvou mikrokontrolérů – Attiny85, který slouží jako vylepšený R/S klopný obvod a zdroj signálu pro probuzení nadřízeného modulu ESP12E, realizujícího vlastní WiFi komunikaci a odeslání informačního emailu.

Tímto je seriál o „vylepšeném“ Arduinu uzavřen. Nástupcem obvodu ESP8266 je obvod ESP32 osazený dvoujádrovým 32bitovým procesorem Tensilica L108 a podstatně vyšším výpočetním výkonem (160 MHz) než stávající ESP8266. Tento nástupce již umožňuje probou­zení pomocí změny signálu na libovolném pinu, má v sobě několik časovačů a čítačů pro měření kmitočtu nebo časo­vého intervalu a další vylepšení. Je možné jej také progra­movat jak v Arduino IDE, tak PlatformIO. Obsahuje i více vstupně/výstupních pinů a více sběrnic – I2C, UART, I2S – včetně variabilní konfigurace pinů. Mám-li vám něco dopo­ručit, vyzkoušejte ESP32 a v budoucnu používejte místo ESP8266.

Obr. 13

A jako úplná perlička na závěr – pokud vás zajímá, jak vypadá pracovní stůl, kde výše popsaný senzor vznikl, podívejte se na obr. 13. Přeji vám velkou chuť do bastlení a objevování nových věcí. Pokud budete mít se stavbou a oživením nějaké problémy, budu-li vědět, rád poradím.

Ondřej Pavelka vyvoj@onpa.cz

Literatura a odkazy:

[1] Pavelka, Ondřej: Arduino na steroidech 1. část, magazín EEM 1/2018, Infocube, Brno 2018

[2] https://www.espressif.com/en/products/hardware/ esp8266ex/overview [online; cit 8. září 2018]

[3] https://www.esp8266.com/ [online; cit 8. září 2018]

[4] https://ifttt.com/