pondělí 26. října 2015

Arduino na 433 MHz a bazénový teploměr

Moc se mi líbí jezdit na konference o Linuxu, Open Source a souvisejících tématech - například na LinuxDays či OpenAlt (dříve LinuxAlt). Rád se tam potkávám se zajímavými lidmi, hltám přednášky a užívám si srocení chytrých lidí a všeho toho šrumu okolo.

A letos jsem dokonce dostal příležitost na LinuxDays vystoupit s vlastní přednáškou - vlastně rovnou se dvěma přednáškami - na mé tolik oblíbené téma: Arduino. Existují videozáznamy z obou z nich, takže se můžete pobavit, i když jste v Praze nebyli.

První přednáška se jmenuje "Arduino a Internet věcí" (prezentace zde):




Druhá se jmenuje "Arduino na 433 MHz" (prezentace zde):



Jak jste si při sledování videí nemohli nevšimnout, i přes pečlivou domácí přípravu jsem zvlášť v druhé přednášce narazil v časovém stresu na opravdu zrádnou věc: skrytou vnitřní kapsu batohu, která ukrývala klíčové předměty, které se měly stát vrcholy mé přednášky. A já je prostě nedokázal v tom tlaku rychle najít a myslel jsem si, že jsem je někde zapomněl. Ale hodinu po přednášce jsem je v tom batohu už našel! Je to možné? Fakt se mi to stalo... No mrzelo mě to tak moc, že jsem se rozhodl průšvih z přednášky napravit.

A za nápravu považuji sepsání tohoto článku, který mi právě teď vychází na Root.cz. Najdete v něm nejen doplnění mé přednášky o chybějící meteostanici, ale především podrobný popis až skoro návod, jak si můžete postavit vlastní venkovní bezdrátové čidlo k existující meteostanici napájené akumulátorem dobíjeným solární energií. Tak směle do toho! :-)

EDIT: článek má ještě dvě pokračování: druhé a třetí. A pod každým je velmi výživná diskuse. Pěkné počtení! :-)

středa 7. října 2015

Dual Joystick USB adaptér

Pravděpodobně jste někdy hráli hry na starých skvělých 8bitových počítačích jako jsou Atari 800 XL nebo třeba Commodore C64. Anebo jste mladšího data výroby, takže jste už jen slyšeli vyprávět, jaké to bylo úžasné, když vaši rodiče pařili celé dny i noci nesmírně chytlavé, hratelné, boží hry.

International Karate pod posvátnou horou, která dala tvar Atari logu
Pokud nemáte to štěstí, že byste měli doma funkční počítač z osmdesátých let, nezoufejte. Existuje celá řada velmi zdařilých emulátorů, programů, díky kterým i na obyčejném kancelářském PC či Macu můžete zprovoznit k nerozeznání podobné prostředí, ve kterém bezchybně běží ty 30 i více let staré, ale stále naprosto dokonalé a zábavné hry.

Montezuma's Revenge
Jen namátkou jmenuji Atari800 emulátor (na kterém už přes deset let pracuji v celosvětovém týmu dalších dobrovolníků), nebo jsem teď třeba viděl emulátor konkurenčního počítače C64 pojmenovaný VICE. Samozřejmě existují mnohé jiné emulátory stejných počítačů - Atari 800 i C64 byly ve své době naprosté fenomény a každý je chtěl, což přetrvalo i do doby, kdy programátoři museli dospět a přejít na kancelářské nevzhledné šedivé krabice (=PC). Takže jak to bylo jen trošku možné, ti schopnější ihned začali programovat emulátory svých dávných lásek a díky tomu máme dnes skutečně bohatý výběr.

legenda Quick Shot, kdo by si ho nepamatoval?

Ovšem je tu jedna věc, která zážitek kazí: chybí původní ovladače, pákové joysticky. Ano, ty otřískané, vymleté, stokrát spravované a někdy i ulomené Quick Shoty II a jim podobné. Hrát tehdejší hry na dnešní klávesnici není vůbec zábavné, je to jiné ovládání, jiný pocit. Ale kdyby tak bylo možné vzít ze skříně ten starý joystick (případně někde koupit nový) a připojit ho k PC/Mac/RaspberryPi, pustit emulátor oblíbeného stroje přes celou obrazovku, osolit zvuk naplno - tak by to bylo stejně úžasné jako tehdy!

elegantní stříbrná raketa se dvěma tryskami
Pokud chcete dětem ukázat, jaký gamesník se ve vás ukrývá, případně chcete pochopit, proč na ty staré hry s 2D grafikou a čtyřkanálovým zvukem vaši rodiče pořád s láskou vzpomínají, pořiďte si můj nejnovější vynález - Dual Joy USB adaptér.

levý je #1, pravý je #2
Díky němu jednoduše připojíte jeden nebo dva pákové ovladače k jakémukoliv stroji s USB a můžete začít pařit stejně jako tehdy!

adaptér doporučuji připojit přes USB prodlužku
Adaptér je testován pod Androidem, MS Windows XP/7/8/10, Apple OS X a Linuxem, ale nemá důvod nefungovat i kdekoliv jinde. Funguje jako standardní HID zařízení a zprostředkuje 4 směry a jedno tlačítko, přesně jako to měly ty staré Atari/Commodore joysticky (pokud tam bylo více "Fire" tlačítek, byly navzájem propojené).

Archon - bojové "šachy" pro dva hráče
Při jeho návrhu a výrobě jsem využil téměř roční zkušenosti s PARCP-USB adaptérem, takže jsem už nešel do mini USB zásuvky, ale nechal jsem trčet USB konektor ven.


Může vám to připadat nezvyklé, nebo dokonce nebezpečné, ale když použijete krátkou USB prodlužku (místo abyste adaptér cpali přímo do PC), tak ten konektor snad nevylomíte.


Vevnitř najdete mikrokontrolér a pár nezbytných součástek. Ano, chtěl jsem tam původně vestavět Arduino Pro Mini, ale o pár milimetrů se mi tam nevešlo, tak jsem stejně jako u PARCP-USB musel nakonec navrhnout vlastní plošný spoj a osadit to jiným procesorem. Nevadí, aspoň to vypadá krásně elegantně nejen zvenku, ale i uvnitř :-)

Takže pokud máte o tento můj nejnovější vynález zájem, napište mi mail.

A to nejlepší na závěr: pokud nemáte dostatek Atari her, určitě hned zamiřte na Fandalův archív - nebudete věřit, kolik tam toho má!

čtvrtek 3. září 2015

Solární dobíjení autobaterie - fáze I

Letošní horké léto dalo slušně zabrat olověným akumulátorům v automobilech. Nedávno jsem, při hrátkách s napojením se na sběrnici automobilu (což je další zajímavý příběh), změřil napětí baterie a zjistil, že má sotva 11,8 V - to je už podpětí zkracující životnost akumulátoru. Musel jsem rychle jednat - otevřel jsem motorový prostor, našel akumulátor, odpojil ho, přinesl nabíječku, připojil jsem ji k autobaterii a začal rychle dobíjet. Po hodině jsem šel situaci zkontrolovat a našel (komerční) nabíječku mrtvou. Pochopil jsem, že tudy cesta nevede a rozhodl jsem se pro lepší řešení - místo občasného složitého dobíjení autobaterie velkou nabíječkou z elektrické sítě bude lepší trvale a průběžně dobíjet autobaterii energií solární.

Samozřejmě, že pro solární dobíjení existují hotová řešení. A samozřejmě, že jsem si žádné z nich nekoupil a raději zkusil postavit vlastní. Proč? No přece abych si pohrál, a hlavně abych to udělal lepší, než jsou na trhu nabízená řešení. Lepší znamená mít vevnitř Arduino. Ale to bude až ve druhé fázi, nejdřív předvedu fázi I.

Takže pro solární dobíjení potřebujeme solární panel. Na AliExpressu jsem si koupil krásný "Solar Panel Module for Light Battery Cell Phone Charger Portable 6V 2W 330MA DIY" za $3,36, tedy asi 84 Kč:



Bylo zrovna 1. září, půl páté odpoledne, když jsem k panelu připájel kabely a poprvé ho zkusil vystavit středoevropskému slunečnímu svitu:



7 voltů místo slibovaných 6, a skoro 300 miliampér ve zkratu? To jsou na tak pozdní odpoledne výborné hodnoty!

Teď jen potřebuju z těch až sedmi voltů vyrobit trvalých 14,40 V, což je prý takové rozumné napětí pro konečnou fázi nabíjení ("udržovací napětí") plně nabité 12V olověné baterie/akumulátoru. Na to použiji osvědčený "zvyšovač" napětí s čipem XL6009 - "1pcs XL6009 DC-DC Booster module Power supply module output is adjustable Super LM2577 step-up module" za krásných $0,90, tedy asi 22 Kč:


No a na výstup měniče napětí stačí připojit konektor do "cigaretového zapalovače", trimrem nastavit správné napětí, zastrčit do palubní desky a už nabíjíme! :-)

EDIT 4.září: podle první reakce pod článkem jsem zřejmě nenapsal, co přesně od solární dobíječky autobaterie očekávám, takže to sem doplňuji: Tento můj "vynález" nemá za úkol naplno dobít zcela "vytlučenou" baterii, ale má jen doplňovat ztráty způsobené samovybíjením baterie a odběrem stojícího vozidla. Pokud zvládne i víc (doplňovat odběry způsobené starty motoru, hlasitým poslechem autorádia či svícením světlomety bez běžícího alternátoru), bude to příjemný bonus.

Podle Wikipedie se samovybíjením olověného akumulátoru ztratí 3 - 20 % kapacity měsíčně. Mám novou 60 Ah baterii, tak dejme tomu 5 % za 30 dní, to jest 0,1 Ah za den.

Elektrosoustava stojícího vozidla (tj. jen alarm, rádio, blikající LED na palubovce) odebírá například 5 mA (to jsem neměřil, ale díval jsem se po fórech a může to být kolem 4 mA, nebo při více spotřebičích trochu víc) - tak potom je denní ztráta 0,12 Ah.

Dohromady tedy denně baterie stojícího automobilu zchudne o 0,22 Ah (velmi hrubým odhadem) . A toto množství energie tam potřebujeme doplnit. Moje sestava solárního panelu a měniče dokáže dodávat řekněme 100 mA (nezměřeno, jen tipuju) při opravdu pěkném slunečním svitu. To znamená, že za tři hodiny by měla denní ztráty pokrýt...

Samozřejmě v praxi budou všechna ta čísla u každého auta úplně jiná, podle stáří baterie, zapojení vozidla, nastavení panelu ke Slunci atd. Plus kdo denně 10x startuje, ale ujede dohromady jen 5 km, vybije baterii startérem. Ale čistě teoreticky by to mělo být schopno autobaterii aspoň trošku udržovat při životě... Praxe ukáže!

V plánované fázi II připojím k sestavě Arduino s displejem, které bude měřit napětí, proud, a počítat energii, kterou Slunce do akumulátoru vložilo. O tom napíšu zase příště, až budou fotky, schéma, plošný spoj a program hotový.

středa 2. září 2015

Stabilní napájení pro Raspberry Pi s WiFi a NoIR kamerou

Kromě haldy Arduin mám doma i jedno staré Raspberry Pi s (infra) kamerkou. Kdysi jsem si ho koupil, abych mohl sledovat a nahrávat noční život. Na nic jiného se Raspberry Pi asi nehodí - protože všechno ostatní zastane Arduino :)

Když jsem ho teď po půldruhém roce našel, oprášil a pokusil se ho použít, narazil jsem na zásadní problémy s napájením. Jak jsem je vyřešil, a co jsem na infra kamerku nakonec natočil, jsem sepsal do blogpostu, který se nakonec proměnil v článek na http://www.root.cz/clanky/nocni-lovy-beze-zbrani-s-raspberry-pi/

neděle 21. června 2015

Oddechovka: Arduino a piezzo bzučák

Rozdělal jsem starý analogový telefon, kterých jsme desítku vyřazovali ve firmě.



Na zvuk zvonění telefonu je tam obvod LS1240 a piezzo reproduktor.


Připojil jsem ten piezzo reproduktor k Arduinu napřímo, protože, na rozdíl od dynamického reproduktoru, nezničí pin nadměrným proudem (aspoň doufám, neboť ohmmetr mi ukazuje u piezzo nekonečný odpor). Takže jeden pin toho piezzo vede na pin č. 9 (D9) Arduina a zároveň i na pin A0. Druhý pin piezzo vede na zem (GND).

Inspiroval jsem se několika zdrojovými kódy programů dostupných přes vyhledávač na frázi "Arduino piezzo" a nakonec si svůj program upravil do následující podoby. Čtení z pinu A0 se používá na detekci zvuku (zaklepání na stůl), protože ten piezzo jev zjevně funguje obousměrně (mění elektrické napětí na zvuk, i zvuk na elektrické napětí).

const int buzzerPin = 9;

char Indiana_notes[] = "e2f1g1 1C3 2d1e1f3 4g2a1b1 1F3 1a1b1C3D3E3 4e2f1g1 1C3 2d1e1f3 2D1D1E2 2D1D1E2 2D1D1E3 2D2D2F2 2E2D2C2";
char Kocka_notes[] = "c2d2e2f2g4g4a4a4g5 2a4a4g4 2f2f2f2f2e4e4d4d4c5";

unsigned int tempo = 150;
bool melody;

void setup() 
{
}

void loop()
{
    while(analogRead(A0) < 50) ;
    
    playMelody(melody ? Indiana_notes : Kocka_notes);
    melody = !melody;

    delay(500);
}

void playMelody(const char *notes)
{
    pinMode(buzzerPin, OUTPUT);
    unsigned int len = strlen(notes);
    for (unsigned int i = 0; i < len; i+=2) {
        unsigned int duration = (notes[i+1]-'0') * tempo;
        if (notes[i] != ' ')
            tone(buzzerPin, frequency(notes[i]), duration);
        delay(duration + tempo/10);
    }
    pinMode(buzzerPin, INPUT);
}


unsigned int frequency(char note) 
{
    char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B' };
    unsigned int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988};

    for (byte i = 0; i < sizeof(names); i++) {
        if (names[i] == note)
            return frequencies[i];
    }
    return 0;
}

Výsledek jsem nadšeně hodil na YouTube. Nechte se inspirovat a taky něco s Arduinem spíchněte :-)


úterý 2. června 2015

Výroba kusových plošných spojů levně v Česku

V mém příspěvku o výrobě plošných spojů doma i venku jsem popsal dvě firmy, které plošné spoje komerčně vyrábějí - jedna je v USA a druhá v Číně. Měl jsem tehdy za to, že všechny české firmy se zbláznily a zhotovit zde malé plošné spoje v kusovém množství za rozumnou cenu je prostě nemožné, a proto jsem se zaměřil na zahraničí.

Od té doby jsem ale náhodou sám narazil na jednu firmu, a zároveň se od kamarádů i od čtenářů mých blogů v komentářích dověděl o dalších českých firmách, které se zaměřily právě na kusovou výrobu a v podstatě jsou schopné udělat velmi pěkné plošné spoje, velmi rychle, a za výbornou cenu. Všechny tyto firmy mají několik společných rysů:

  • vyrábějí plošné spoje fotocestou
  • bez problémů zvládají oboustranné a někdy i vícevrstvé plošné spoje
  • umějí vyvrtat otvory
  • ...ale neumějí udělat v otvorech prokovy
  • výslednou desku plošných spojů umějí pokrýt tenkou vrstvou něčeho dalšího chránící před korozí či usnadňující pájení
  • ...ale neumějí nepájivou masku
Některé z těch firem pak vyhrávají kromě ceny ještě i rychlostí od objednávky po dodání výsledku, která může být i 25krát (!) lepší než v případě zahraničních firem. To je samozřejmě dané především tím, že pošta nejde ze zámoří, ale jen tady u nás po Česku, kde to náš víceméně monopolní přepravce zvládá poslední dobou docela rychle ("večer podáte, ráno dodáme").

Dá se říct, že ty firmy nedělají nic jiného než to, co si člověk může udělat s minimem vybavení a spoustou pečlivosti sám doma - ale dělají to tak levně a tak rychle, že se naráz nevyplatí podomácku plošné spoje vyrábět! A to říkám s plným vědomím toho, že jsem před necelým rokem investoval nemalou částku do vybavení právě pro domácí leptání plošných spojů. Dnes už je ale doma nedělám a plně se spoléhám na jednu konkrétní firmu, kterou uvedu níže.

Takže které že to firmy jsem našel nebo se o nich dověděl? Místo jmen uvedu rovnou jejich URL a to v pořadí, v jakém jsem se o nich dověděl:

Osobně mám zkušenosti jen s prvně uvedenou firmou "Plošňáky.cz" a to z jednoho prostého důvodu: o plosnaky.cz a tistaky.cz jsem se dověděl prakticky ve stejnou chvíli a tak jsem oběma napsal mailem stejný dotaz. Pán z plosnaky.cz mi odpověděl během pár hodin, zatímco pán z tistaky.cz mi neodpověděl ani za půl roku. Tím bylo rozhodnuto a začal jsem posílat své zadání právě do Plošňáky.cz. Tato firma se za posledních pět měsíců, kdy jejich služby využívám, rychle vyvíjela a výrazně zlepšovala své výrobní schopnosti.



Zatímco v lednu ještě přišly desky pocínované, v březnu (i na můj popud ;-) už byly postříbřené. A v dubnu už byly i vyvrtané. A co jsem sledoval její twitter účet, tak vývoj neustal a služby se stále zlepšují. Co je pro mě ale "killer feature" je brutální rychlost reakce. Když v neděli večer pošlu zadání, a v úterý ráno mám doma hotové plošné spoje, tak to je prostě masakr. Anebo jsem zkoušel ve středu v poledne, a měl jsem je doma na druhý den ráno! V tu chvíli přimhouřím oko i nad občasnou mírnou nepřesností leptání (která nemá vliv na funkci živočicháře). Umožňuje mi to vyrábět elektronické prototypy mnohem rychleji než dříve, můžu dělat plně SMD věci atd.. Zkrátka je to výborné!



Mí kamarádi z Olomouce mají dobrou zkušenost s Haspojem, kamarád z Prahy si dělával spoje u Tišťáky.cz a byl s nimi taky spokojen. A čtenář v diskusi mi poradil tu poslední firmu, která je podle svých webových stránek taky levná, přesná a rychlá. Tak co víc si přát?


Pokud znáte ještě další firmy, které dokáží vyrobit levně, rychle a kvalitně kusovky plošných spojů, napište mi do komentářů (a buďte předem přihlášení ke google účtu, jinak vám komentář zmizí, jak bude google přesměrovávat na přihlašovací stránku!). Takové informace mohou pomoci dalším lidem baslit levněji, rychleji a na vyšší úrovni (SMT FTW! :-)

pondělí 1. června 2015

Arduino termostat podrobněji

Domluvil jsem se s redakcí root.cz a můj blogpost o digitálním termostatu tam teď vychází ve formě seriálu (protože mají limit na délku článku a můj text jej několikanásobně překročil). Pokusil jsem se tam rozepsat podrobněji, co a jak. Zatím vyšly dva díly, tento týden vyjde díl třetí, věnovaný hardware termostatu. Příště bude díl o software a pak možná ještě napíšu pátý obsahující nějaké shrnutí, uvidíme.

Jelikož mě čtenáři mého blogu požádali o podrobnější informace o mém termostatu, píšu sem, že je postupně najdou tam, na Root.cz :-) Celý seriál najdete na následující adrese: root.cz/serialy/inteligentni-internetovy-termostat/

Doporučuji nakouknout i do diskuse, je neuvěřitelně bohatá. V tuto chvíli je pod prvním dílem 246 komentářů a pod druhým 117. Téma čtenáře skutečně zaujalo, ovšem v diskusi se sešli především odborníci "od fochu". Díky tomu je v ní ukryto velké informační bohatství, i když je znát, že by to profíci řešili jinak než Arduinem :-)

čtvrtek 23. dubna 2015

Jak jsem se hloupě nechal hacknout přes prohlížeč v Linuxu

Tak jsem si dobrovolně nechal hacknout můj klíčový pracovní stroj, jen vlastní důvěřivostí a hloupostí. V nejbezpečnějším prohlížeči na světě zvaném Google Chrome, běžícím v bezpečném operačním systému Ubuntu, bez návštěv pochybných stránek na Internetu, jsem měl pocit sucha a bezpečí jako uvnitř Alcatrazu - že na mě nikdo nemůže, že jsem fakt dobře zabarikádovaný a nedobytný.

A pak jsem si před měsícem nainstaloval rozšíření Adblock Super (verze 2.7.4) a liboval si, jak mi ubylo reklamy na webu. Jenže před pár dny se mi začaly po kliku na odkazy otevírat úplně jiné stránky plné reklam na nějaké online gamesky. Tušil jsem, odkud vítr vane, tak jsem zakázal to jediné rozšíření, které jsem měl, ale nepomohlo to. Dál mi něco předělávalo stránky tak, že po kliku na normální odkazy jsem končil úplně jinde v reklamním pekle.

Začal jsem tedy pátrat online po podobně postižených. Zatímco pro Windows se dá najít několik nástrojů, které rádoby odstraňují různé podobně problémové situace, pro Linux neexistuje  nic - což je logické, neboť Linux se nedá zavirovat, že? Nakonec jsem našel vlákno v google product fóru, kde pár nešťastníků popsalo něco velmi podobného, co pronásleduje mě, ale řešení veskrze žádné - snad jen promazat ~/.cache/chrome a pak to prý přestane.

Nezbylo mi než se na podívat pořádně sám. Dobrá pomoc je, když v chrome://extensions povolíte "Režim pro vývojáře". U povolených rozšíření se objeví možnost "Zkontrolovat zobrazení" a URL. Pokud to URL obsahuje "background.html", tak běží v pozadí.


A když jsem otevřel background.html od Adblock Super, našel jsem tam kromě jeho 10+6 skriptů ještě jeden zjevně navíc: sosá z "https://cdn.dreamnetworld.com" soubor "extend.js":


A tento skript obsahuje funkci popupSnooze() a ta už jednou za několik hodin náhodně vkládá ty po***né (nevyžádané) reklamy:


Děsivé je, že na to jednak není žádná detekce (ani čerstvě nainstalovaný Extension Defender nic nenašel) a dále že nepomůže ani vypnout to nakažené rozšíření, background.html dál zjevně běží a škodí. WTF Google?

A jak může mít +Google Chrome ve vlastním Obchodě nakažené rozšíření? Kde to jsme?


Největší smrt je, že to může zjevně dělat s jakoukoliv stránkou cokoliv, tedy například číst údaje z mnou zadávaných platebních karet (když platím online), zná to login a heslo mého internetové bankovnictví, PayPalu, Bitcoin peněženky atd. Docela děsivé. Zbořil se mi mnohaletý mýtus o bezpečném operačním systému Ubuntu GNU/Linux a bezpečném prohlížeči Google Chrome. Zdá se, že jedinou možností, jak se aspoň trochu chránit, je odstranit z prohlížeče všechna rozšíření mající právo editovat jakékoliv stránky a používat ho bez nich, tak jak ho vydal výrobce.


P.S. možnost, že Adblock Super je v Chrome Webstore "čistý" a něco ho nakazilo až u mě na počítači raději ani neuvažuju - to by totiž bylo ještě mnohem horší...

EDIT: rozhodl jsem se to přece jen ověřit a na jiném počítači jsem se jal instalovat Adblock Super. Helemese - necelou hodinu po vydání tohoto blog postu je v Chrome Webstore naráz úplně jiná verze!


40x menší instalační soubor, major verze o jedničku nižší... Tak tomu říkám změna. Vtipné je, že kvůli menší verzi (1.3 < 2.7.4) nedojde k automatické aktualizaci u lidí, kteří už tu prokletou verzi s malware nainstalovanou mají.

ROTFL, tak ta "nová" verze je ještě horší. Sice už nemodifikuje cizí stránky, na rozdíl od té "mé" verze:


Za to ale obsahuje místo slibované funkčnosti jen zběsilé otevírání reklamních oken:


Takže jsem si nyní 100% jistý, že už ta verze 2.7.4 byla výrobcem nakažená, a teď se to snaží takto zamaskovat či "vylepšit"...

Z instalace rozšíření do prohlížeče jsem tímto definitivně vyléčen.

neděle 22. března 2015

Daně a smrt, nejlépe elektronicky

Jak říkává Joe Black, daně a smrt jsou jediné dvě jistoty, které v tom našem postdemokratickém světě máme. A jelikož tu první jistotu musím kvůli mé samostatně výdělečné činnosti řešit mnohem častěji než tu druhou, snažím se maximálně si to ulehčit. Proto jsem loni poprvé všechny tři březnové daně (z příjmu, sociální a zdravotní) vyřešil jak nejvíc elektronicky to šlo. Letos jsem to zkoušel znovu a opět jsem narazil na ty samé problémy co loni, které jsem ale za ten rok zapomněl! Tudíž jsem si tím marastem musel znovu projít jako by to bylo poprvé. No a abych si příští rok zase netrhal vlasy, raději si to už sem zdokumentuju.

Samotná daň z příjmu jde online pořešit překvapivě dobře. Daňový portál na webu Ministerstva financí funguje výborně - tedy hned poté, co člověk projde přes následující znalostní test z oblasti počítačové a Internetové bezpečnosti:

web českého ministerstva není důvěryhodný pro americký prohlížeč, protože soudruzi udělali někde chybu...

Po odhalení tajného tlačítka "pokračovat na nespolehlivý web" v "rozšířených nastaveních" se dá prokliknout na další stránku, kde si portál otestuje prohlížeč a systém a s potěšením oznámí, že v 64bitovém Ubuntu s Google Chrome budu mít možnost "Komfortní práce se službami daňového portálu" a také mám povoleno "Vyplnění inteligentních elektronických formulářů EPO2". Ještě před pár lety mělo ministerstvo jen EPO1, což jsou smrtící potvory pouze pro MS-Windows a Internet Exploder vyžadující instalaci nějakého binárního bazmeku, ale EPO2 už je čistá HTML aplikace a funguje multiplatformně a výtečně.

Na portálu člověk rychle v sekci "Elektronické formuláře" najde "Daň z příjmů fyzických osob - od roku 2013 včetně (EPO2)". Tam si pak může pustit skvělého průvodce, který se inteligentně ptá většinou jen na to skutečně potřebné a šikovně skrývá všechen ten kontextově nepotřebný balast. Když si člověk nevede žádné účetnictví a z daňové evidence si zapíše jen jedno číslo celkových ročních příjmů, je vyplnění celého přiznání jednodušší než když Vlastík Tlustý před volbami mával v TV korespondenčním lístkem a sliboval daňové přiznání na formulář velikosti A6.

Na závěr je možné si nechat celý vyplněný formulář zkontrolovat - tato funkce také funguje na jedničku. Dále je tam možnost tisku, která v PDF nasimuluje klasický růžový formulář se všemi stránkami pečlivě strojově vyplněnými. To bych ale musel zanést ten vytištěný formulář na podatelnu finančního úřadu, což by bylo zbytečně pomalé a pracné. Proto volím jinou možnost na daňovém portálu nově dostupnou - elektronické podání!

Po stisku tlačítka "Odeslání písemnosti" mám sice opticky na výběr ze tří možností, ale pokud člověk nechce přistoupit na další státní vydírání, ať už v podobě datových schránek, anebo v podobě kupování předražených státních certifikátů od oligopolu firem, které je poskytují, musí nutně zvolit možnost "Nepodepisovat". Písemnost se tak sice na ministerstvo odešle, ale stejně je nutné vytisknout si v dalším kroku potvrzení o tom, že jsem to fakt podal a utíkat s tím papírkem na podatelnu finančního úřadu, jinak je elektronické podání neplatné. To jsem na to vyzrál, co? ;-)

Další kladné body autorům EPO2 připisuji za možnost kdykoliv si celý formulář včetně všech příloh uložit do XML souboru a tento později znovu načíst do EPO2 a pokračovat v editaci. No a po podání je dobré uložit si jakési potvrzení (soubor typu p7s), díky kterému je možné sledovat průběh zpracování daňového přiznání.


Druhý krok je sociální daň, ze které žijí dnešní důchodci (ano, nejde o spoření na vlastní důchod, státní důchody jsou totiž typické "letadlo"), taky se z ní platí lidi bez práce (práce není a ani nebude protože robotizace), rodiče s dětmi na rodičovské dovolené (buďme rádi, že můžeme být doma s dětmi až 4 roky - v USA jen tři měsíce!), též živobytí mimořádně "přizpůsobivých" spoluobčanů a kdo ví co ještě. Proto hbitě naskočím na správné tiskopisy a vybírám si mezi "eTiskopisem" a běžným formulářem v PDF.  "eTiskopis" vyžaduje instalaci binárního smetí jménem Form Filler. Přestože mi pohrobek 602. základní organizace Svazarmu nabízí 37 MB blob i pro moje 64bitové Ubuntu pod názvem "archivní produkt" (he, to zní jako víno), zdravě paranoidně to odmítám a vydávám se cestou snad menšího odporu, tedy PDF formuláře.

Ten PDF formulář (OSVC_2014_v3.pdf) bohužel nejde v Evince vyplnit - možná je to jen dokument bez formulářových políček, nevím. Tak hledám dál něco interaktivnějšího, co by mě nenutilo vyplňovat kolonky rukou. Najdu tak úplně nový web jménem "ePortál", na kterém jsou sice interaktivní formuláře, ale bohužel vyžadují instalaci dalšího, ještě většího blobu:


Milou Javu si do Google Chrome nenainstaluji, protože dodavatel Javy trvá na starém API, zatímco dodavatel prohlížeče iniciativně vyvinul nové API a staré zahodil. Mohl bych udělat úkrok stranou, pustit Mozilla Firefox a Javu si nainstalovat, ale vzhledem k tomu, jaká díra do systému se Javou v prohlížeči otevírá, zvolil jsem vzdálené přihlášení na Windows stroj do kanceláře, kde Javu musím mít kvůli práci, a formulář vyplnil bez problémů tam. Dobré je, že formulář (resp. ten Java applet) opět napomáhá se správným vyplněním, přeskakuje položky, které nejsou potřeba a na konci umožní zkontrolovat, je-li vše vyplněno OK. A samotná funkce "Tisk" vygeneruje vyplněné PDF, které jsem si mohl pohodlně přetáhnout ze vzdáleného počítače k sobě a doma v klidu vytisknout.


Poslední z daní je zdravotní (je to tak, je to daň, protože je povinná - skutečné zdravotní pojištění by bylo dobrovolné). Jsem pořád u defaultní zdravotní pojišťovny s kódem 111, jejíž portfolio zahrnuje především děti a jiné nepříliš přispívající jedince, takže mě hřeje dobrý pocit, že z mých peněz někomu zafinancuju třeba novou přilbu na kolo či masáže. Protonovou léčbu asi ne, s tím bude asi konec. Takže šupky dupky na web pro plátce a hned mi nabízí správný formulář pro OSVČ. Skvěle! Kliknu tedy na "Tiskopis pro rok 2014" odkazující na http://www.vzp.cz/uploads/document/tiskopis-za-rok-2014.pdf a hledím na následující stránku:


Říkají "prosím čekejte", tak čekám jak trotl a pořád nic. Vracím se na předchozí stránku a nacházím tam následující návod: "Pokud se vám po kliknutí na odkaz tiskopisu zobrazuje chyba, stáhněte si tiskopis na disk vašeho počítače (pravým tlačítkem myši příkaz "Uložit odkaz jako...")". No jasně, takže nejsem jediný, komu ten klíčový formulář nejde stáhnout. Tak na něj klikám pravou myší a stahuji PDF na můj disk. Pak na něj dvakrát kliknu, aby se otevřel v systémovém prohlížeči Evince a co nevidím:


Pokud tomu dobře rozumím, tak má VZP na svém webu poškozený PDF, nebo PDF obsahující tady tu Please wait stránku místo skutečného formuláře? WTF? Tak jsem jim  bleskově napsal nevybíravý mail. Hned po jeho odeslání, kdy už to nejde vrátit, jsem dostal klasické Déjà vu - totéž se přece dělo loni, a taky jsem jim napsal,  že jsou úplní mantáci, když nemají na webu funkční formulář! A oni mi ho pak s omluvou poslali mailem... a ani ten stále nešel otevřít.

Abych vyloučil neblahý vliv svobodného operačního systému na toto kruté PDF, přihlásil jsem se opět vzdáleně na Windowsový stroj v kanceláři a zkusil to PDF otevřít tam. Stále ani ťuk, stejná stránka Please wait bla bla bla. No, zkrátím tuhle smutnou story - nakonec mi nezbylo než si dočíst tu PDF stránku s error hláškou až do konce - a oni tam píší, že musím mít Adobe Reader! Proboha na co? Vždyť produkty Adobe jsou dnes největší díry do systémů, kudy denně proudí malware desítkami známých a přesto neopravených chyb! Jen blázen by měl něco podobného na počítači.

No ale daně jsou daně, těm člověk neunikne, takže nakonec otevírám to dokumentem doporučené URL adobe.com/go/, kde se ale dovídám, že můj operační systém má smůlu (nebo spíš štěstí, jak se to vezme) a produkt Reader pro něj firma Adobe nenabízí. Takže znovu vzdáleně do kanceláře, zavirovat si dobrovolně pracovní stroj s Windows instalací Adobe Readeru a konečně otevřít to 53 kB PDF. Kupodivu je v tom souboru skutečně ukrytý i ten formulář pro VZP, ne jen ta pitomá chybová Please wait stránka. To jsem teda ještě s PDF nezažil.

Po vyplnění formuláře nastává další nečekaný zádrhel. Tisk z Adobe Readeru je sice v pohodě možný, ale vzhledem k tomu, že sedím doma a formulář jsem vyplnil v práci, tak to můžu vytisknout akorát tak v práci. No jo, ale já ten papír potřebuji doma... Vyplněné PDF je pořád prokleté, tj. stále nejde otevřít v jiném prohlížeči. Musím ho vytisknout na Windows chtě-nechtě. Takže nebudu tisknout na papír, ale vytisknu to přes virtuální tiskárnu do souboru, ten si přenesu domů a doma vytisknu na papír. OK.

Windows 8.1 ve výchozím stavu nabízejí tisk do "Microsoft XPS Document Writer". Na disku vznikne soubor s koncovkou .oxps, ale jak ho na Ubuntu otevřít? Studoval jsem nějakou dobu, co to ten XPS je, dokonce jsem si kvůli němu nainstaloval do mého systému jakýsi xpstopdf, ale výsledkem bylo jen binární smetí. On je ten XPS sice ECMA standard, ale asi vznikl podobně jako jiné podobné microsoftí "open standardy", takže je k ničemu. Musím jít jinou cestou a vytisknout ho ještě na Windows do PDF, které si teprve přenesu domů.

Google poradil, že nejlepší pro tisk ve Windows do PDF je CutePDF writer. Nainstaloval jsem ho tedy do Windows v práci a vytiskl - prázdnou stránku! Tak to je konec. Teď jsem sice mohl ještě nějakou dobu hledat další virtuální PDF drivery do Windows, ale protože jsem se s těmi daněmi mořil už pátou hodinu (!), nakonec jsem vyměkl a všechny své supercitlivé osobní údaje včetně ročního výdělku, adresy, rodného čísla a dalších klíčových údajů odeslal zoufale do Anglie do následující online webové služby: https://xps2pdf.co.uk/, kterou mi doporučil Google. Odtamtud mi obratem přijelo korektní PDF, které už jsem si doma konečně vytiskl jako normální člověk... A teď jen zapomenout, co jsem to udělal, a nepřemýšlet, jak s mými soukromými údaji v Anglii naloží.

Za tohle peklo s formulářem si VZP zaslouží 666 palců dolů. Napsal jsem jim další mail, který si nedají za rámeček. Pro vyplňování formulářů přece není nutné takto sviňsky vynucovat Adobe Reader - PDF formuláře umí pohodlně vyplňovat i Evince a další normální PDF prohlížeče...

Můj závěr z elektronického zpracování a podání daní na Ubuntu bez uzavřených děravých programů třetích stran? Daňový portál Ministerstva financí - jednička s hvězdičkou! Kdybych měl datovou schránku (dobrý sluha, ale zlý pán) nebo tzv. Kvalifikovaný certifikát (dle mého názoru předražený, když ho potřebuju jen 1x za dobu jeho platnosti), celé přiznání včetně jeho podepsání a elektronického podání bych v pohodě udělal za pár minut z tepla domova!

Sociálka - jedna mínus. Nabízí pro můj operační systém jak případný Form Filler, tak ani Javový applet není nikterak nedostupný (stačí použít Firefox). Je jen moje paranoidní volba, že jsem si ani jedno nechtěl nainstalovat a raději použil jiný počítač, shodou okolností s Windows. Šlo by to klidně i pod virtualizovaným Ubuntu, kdybych chtěl ty nedůvěryhodné programy udržet v sandboxu, ale co uživatelé tabletů, phabletů či Chrome booků? Vyžadovat instalaci čehokoliv do HTML5 prohlížeče či dokonce operačního systému je v roce 2015 docela ostuda - EPO2 ukazuje, že to jde i bez doplňků jen v čistém prohlížeči.
I u České správy sociálního zabezpečení je (podobně jako u Portálu Ministerstva financí) pravděpodobné, že s kvalifikovaným certifikátem bych mohl odeslat ten vyplněný formulář elektronicky pohodlně přímo z domova. Opět jen moje volba, že se raději projdu městem a jednou za rok tu paní, co mě má na sociálce na starosti, pozdravím. Vždycky si při tom uvědomím, že to, co jsem vyplnil do formuláře doma je zbytečná práce, protože rozhodují čísla, co jí v sekundě spočítá její systém. My to musíme vyplňovat a nosit tam vlastně jen proto, abychom potvrdili náš poddaný vztah pohůnků k státní vrchnosti.

Ale VZP, to je každopádně kalamita. Zmršený formulář v PDF, který trvá na Adobe Acrobat Readeru a v jiných zobrazuje zlou hlášku, je zásadní překážka. Do Ubuntu se sice dá Reader nainstalovat, ale z principu trvám na tom, že PDF nemá být vázán na jeden konkrétní program a má jít zpracovat v kterémkoliv z lepších PDF prohlížečů, které nejsou děravé jako cedník od Adobe. Přestože to většině lidí s Adobe Readerem nainstalovaným někdy z minula kvůli něčemu jinému bude fungovat naprosto bez problémů, ode mě má VZP za tři až čtyři, protože to PDF je rozhodně nějak poškozené, upozorňoval jsem je na to už před rokem a dodnes to nenapravili. Dokonce ani nenabízejí čistý formulář pro vyplnění propiskou, když je někdo zoufalý bez Adobe. Možnost elektronického podání jsem na VZP už ani nehledal, ale nevylučuji, že s kvalifikovaným certifikátem či datovou schránkou to jde. Nevím. Měl jsem dost i tak - z těch pěti hodin strávených touto akcí připadají více než 3 hodiny jen na vrub VZP!

Předpokládám, že příští rok už budu vědět, kde číhají nástrahy a proběhnu tím minovým polem nikoliv za odpoledne, ale za půl hodiny. Následná procházka rozkvétajícím jarním městem bez kvalifikovaného certifikátu a osobní roznos vytištěných formulářů po úřadech je taková milá třešnička, která mi připomíná, jak před volbami vždycky politici slibují Jednotná inkasní místa a podobné věci, ale nakonec vždy obíhá ovčan, nikoliv lejstro :-)

EDIT: tak jsem se s tím známkováním asi dost sekl - teď mi +Ctirad Feřtr ukázal jakousi webovou aplikaci, proti které ty formuláře výše popsané zblednou závistí a zalezou pod nejbližší kámen.

středa 18. března 2015

Tasker - "multitasking" na Arduinu

Poměrně rychle jsem přijal programovací styl navrhovaný Arduino IDE, tj. dvě hlavní funkce - setup() a loop(). Do setup() dám inicializační věci a do loop() dám samotné jádro programu, které provádí nějakou periodickou činnost. Dokud jde jen o jednu činnost, například blikání LEDkou v sekundovém rytmu, je to jednoduché: rozsvítím LED, počkám půl sekundy díky volání funkce delay(500), zhasnu, počkám další půlsekundu dík dalšímu volání delay(500) a je to:

void loop() {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
}

Bezva, ale co když potřebuji vykonávat činnosti dvě a navíc různé? Třeba během blikání LED chci ještě číst teploty z čidel. Anebo kreslit na displej. Anebo odpovídat na požadavky web klientů. Anebo tisíc jiných věcí. Co pak? Jak během delay(), kdy program stojí a čeká, vykonávat jinou činnost?

Když jsem pracoval na řídicím programu pro můj vytuněný domácí termostat, docela mě zarazilo, kolik chvílemi až protichůdných požadavků musí zvládat vyřizovat v podstatě naráz:
  • měřit teploty z obou větví digitálních čidel DS18B20, třeba jednou za tři sekundy
  • měřit teplotu a vlhkost z čidla DHT11, nesmí častěji než jednou za sekundu
  • podle teplot a dalších údajů spínat kotel, stačí jednou za pět sekund
  • řídit podsvícení displeje, to je potřeba nejméně dvakrát za sekundu
  • kontrolovat, jestli se někdo nedotkl displeje, to je potřeba co nejčastěji, aspoň 10x za sekundu
  • překreslovat displej, nejlépe přesně jednou za sekundu, pokud se ho někdo nedotkl, jinak dřív
  • sledovat požadavky na interní webserver, to stačí tak 2-3x za sekundu
  • občas ujistit watchdog, že ještě žiju a nemá mě zresetovat (aspoň jednou za 4 sekundy)
Mimochodem, stejné problémy vyvstanou třeba při řízení robotického auta (což mám se synem taky v řešení) - tam je potřeba číst údaje z různých snímačů (vzdálenosti, světla, rychlosti), poslouchat dálkové ovládání a zároveň neustále řídit motory, do toho sem-tam blikat blinkry, svítit světly, přehrávat hlasy či muziku a podobně.

Na tohle všechno by byl ideální nějaký multitasking/multithreading, ne? Po více než dvaceti letech strávených v multitáskových operačních systémech to k němu člověka tak nějak táhne.  Ono se to všechno sice dá nacpat do té funkce loop(), ale je potřeba u toho moooc přemýšlet a hlavně - nikdy nevolat delay()!

Takže můj termostat měl všechny výše uvedené činnosti napsané za sebou v loop() cyklu jednu za druhou, ale zároveň jsem si musel definovat hromadu proměnných, které si pamatují, kterou z těch výše popsaných událostí jsem kdy zavolal a pak je nutné kontrolovat, jestli už je čas ji zavolat znovu - a pokud ještě není, tak ji nevolat a pokračovat v cyklu dál.

Nemusím vysvětlovat, že zdrojový kód ty dodatečné podmínky a přeskoky docela znepřehledňují. Navíc čtení z digitálních čidel DS18B20 napájených parazitně je potřeba provádět vlastně nadvakrát - nejdřív je nutno požádat o změření teploty, pak počkat 750 milisekund (pro 12bitovou přesnost) a pak teprve přečíst samotné teploty z čidel. To je další komplikace.

A když jsem teď začal znovu rozvíjet ten můj termostat a chtěl jsem tam přidat další funkci, která by na definovaný interval, třeba 30 minut, změnila nějaké nastavení a po uplynutí času ho zase sama vrátila zpět (ano, jde o větrání), uvědomil jsem si, že už to dál nechci takto plácat. A začal jsem hledat nějakou knihovnu, která by toto spouštění úloh v čase řešila za mě.

Poměrně brzy jsem našel celou řadu hotových řešení přímo pro Arduino (či pro nejbližší ATMEL procesory), které všechny slibovaly modré z nebe a světový mír. Vlastně je tu všechny můžu vypsat, ať ušetřím jiným hledačům čas:
No, strávil jsem docela dost času procházením těch existujících řešení, našel v nich chyby v návrhu i implementaci a nakonec jsem se rozhodl: napíšu si vlastní!

Upřímně řečeno, většinou lidi znovuvynalézající kolo nepovažuju za nejmoudřejší, ale v tomto případě jsem si byl docela jistý, že žádné z 11 dostupných řešení nefunguje tak, jak potřebuju, a že tedy bude OK věnovat část mé životní energie na řešení dvanácté, napsané mně na míru. Stanovil jsem si přitom následující zásady:
  1. co nejjednodušší použití (NE C++ třídám, dědičnosti, složitému API, mnoha parametrům)
  2. co nejkratší implementace (aby bylo na první pohled zřejmé, že to funguje správně)
  3. co nejúspornější provoz (malá zabraná jak flash tak RAM paměť)
  4. co nejpružnější a nejmocnější vlastnosti (předávání parametrů do volaných funkcí, ideálně dynamické vytváření úkolů za běhu)
  5. 100% kompatibila s Arduinem (žádný vlastní časovač či přerušení)
  6. a samozřejmě bez chyb přetečení časovače po 49 dnech
Nakonec bylo napsání vlastního řešení rychlejší, než jsem čekal. Výsledný kód implementace se vejde na jednu obrazovku monitoru, pro použití stačí zavolat jednu jedinou funkci s navíc intuitivním jménem i parametry, v RAM zabírá jedna úloha jen 14 bajtů včetně parametru předávaného do volané funkce a dokonce je možné vytvářet další úlohy dynamicky za běhu!

Výsledek jsem nazval Tasker pro Arduino a ihned ho použil v mém termostatu. Špagetový kód z funkce loop() jsem rozdělil na jednotlivé malé funkce a volám je jako samostatné úlohy v jejich pravý čas. Zdrojový kód termostatu se tím krásně pročistil a výsledek funguje díky prioritám implementovaným v Taskeru mnohem lépe, než dříve (například vyhodnocení dotykové vrstvy má teď jednu z nejvyšších priorit, aby reakce na dotyk byla okamžitá - tohle mi dřív trochu zlobilo). Super!

Můj Tasker jsem s radostí uvolnil pro všechny na GitHubu: https://github.com/joysfera/arduino-tasker

Nechci zde opisovat či překládat anglicky psaný manuál viditelný hned na tom URL uvedeném výše, ale pár ukázek elegantního řešení typických problémů s mým Taskerem si neodpustím. Pro začátek obligátní blikání LEDkou - na čtyři řádky a bez delay():

Tasker tasker;
void blik(int) { digitalWrite(13, !digitalRead(13)); }
void setup() { tasker.setInterval(blik, 500); }
void loop() { tasker.loop(); }

A ještě třeba nekompletní ukázka možnosti čtení těch DS18B20 periodicky každé tři sekundy, a to bez jakéhokoliv čekání na cokoliv, postaveném na zřetězení úkolů díky možnosti dynamického přidávání nových úkolů za běhu:

Tasker tasker;
OneWire oneWire(4);
DallasTemperature sensor(&oneWire);
float g_teplota;

void ctiSensor(int) {
    g_teplota = sensor.getTempC(0);
}

void ctiTeplotu(int) {
    sensor.requestTemperatures();
    tasker.setTimeout(ctiSensor, 750);
}

void setup() {
    sensor.begin();
    sensor.setWaitForConversion(false);
    tasker.setInterval(ctiTeplotu, 3000);
    tasker.run();
}

void loop() { }

To mi připomíná, že bych měl vyvézt na GitHub i mé úpravy v knihovně DallasTemperature... Snad někdy brzy.

Lepší ukázka využití Taskeru a kompletní popis API je na URL výše. A samozřejmě nejlepší dokumentací je samotný zdrojový kód, o kterém si troufám tvrdit, že je přehledný a dobře čitelný. Tak si to užijte! :)

EDIT 2017/01/27:
Na přání jsem doplnil klíčový řádek do příkladu se čtením čidel od Dallasu, takže už to nebude blokovat. A víte co? Rovnou jsem tam doplnil i tři další řádky, aby ten program byl celý funkční.
Tento příklad najdete i v mém git repozitáři jako druhý example vedle MultiBlink.

Inteligentní internetový termostat se sítí digitálních teplotních čidel

Pokusy s měřením teplot v síti digitálních teplotních čidel DS18B20 jsem popisoval na jaře 2013 v tomto článku. Tehdy jsem narazil na potíže se stabilitou čtení hodnot z čidel, protože jsem měl síť připojenou přes dva převodníky v sérii (levný čínský USB na RS232 se sotva TTL úrovněmi a z RS232 přes pár nějakých diod a odporů na OneWire), byla napěťově podvyživená, takže parazitní napájení selhávalo a vůbec to bylo celé takové nešikovné.

amatérský převodník z RS232 na OneWire sběrnici
Už tehdy před dvěma lety jsem měl poměrně jasno v tom, že si postavím vlastní digitální termostat, jehož srdcem bude Arduino, tento termostat bude online a budu tak moci řídit teploty nejen v obýváku, ale i kdekoliv ze světa. Zároveň bude mít informace z celé sítě teploměrů po domě i jeho okolí a proto bude schopen mnohem inteligentněji řídit vytápění podlah s tou jejich několikahodinovou setrvačností a nenechá se vykývat občasným přehřátím obýváku díky pasivnímu příjmu spousty energie ze Slunce.

Proto jsem postupně začal nakupovat potřebné součástky. Nejdřív dorazil (už 4. dubna 2013) ethernetový modul pro Arduino s TCP/IP v HW díky čipu Wiznet 5100:


Cestou z daleké Číny mu pošťáci pěkně pokřivili všechny nožičky. Naštěstí nejsou při připojování k Arduino Pro Mini potřeba - stačí zapojit SPI konektor (a ještě teda pin 10):


Ověřil jsem si, že není problém zároveň komunikovat po ethernetu a zároveň něco zobrazovat na displeji z Nokia 5110 (bohužel připojeném na ne-SPI piny, což byl falešný test - viz níže). Nastal čas na další krok - zmenšování, aby termostat nevypadal v obýváku jako krabice od bot přilepená na zdi.


17. dubna dorazil z dálav nový ethernetový převodník, mnohem menší, formátem odpovídající Arduino Pro Mini. Super.


1. května 2013 jsem si pokusně zapojil DS18B20 k Arduinu a nechal vypisovat naměřené hodnoty na displej. Vše v pohodě, žádné převodníky nejsou potřeba. Paráda!


Při pokusech s novým ethernetovým převodníkem jsem zjistil, že má chybu ve svém zapojení, která v podstatě znemožňuje sdílení SPI sběrnice s jiným zařízením (protože pořád drží MISO signál, i když s ním zrovna nikdo nemluví). Jelikož ale potřebuji mít na SPI rozhraní připojený jak Ethernet, tak i displej (kvůli rychlosti vykreslování), musel jsem strašným hackem opravit tu chybu v zapojení - přilepil jsem zezadu na RJ45 konektor CMOS 4011, přeškrábal jsem cestičku na plošném spoji k signálu SEN a s pomocí hradla znegoval signál od CSC (čip select). Popis problému a jeho řešení je v Aplikačních poznámkách k W5100. Jo a přidal jsem na Wiznet maličký chladič, protože se ten čip za provozu skutečně hodně ohřívá. To bylo 18. června.


Pak jsem (1. září) začal pracovat na čidlu na sluneční straně. Jsem asi jeden z mála lidí na světě, který chce měřit teplotu přímo na Slunci a nikoliv ve stínu (popravdě jsem o dalším podobném bláznovi ještě neslyšel). Vyrobil jsem proto vodotěsnou krytku na nevodotěsné čidlo DS18B20, jejímž cílem bylo simulovat pro čidlo podmínky připomínající hodně prosklenou místnost - tj. čidlo mělo přijímat maximum tepelného záření od Slunce, přitom nemělo být na přímém vlivu větru (který by ho moc ochlazoval), ale zároveň nemělo ani být ve vzduchotěsném "skleníku", který by zkresloval (idealizoval) venku panující poměry. Nemaje nic lepšího po ruce, použil jsem plastový obal na vrták i s původní čepičkou. Na fotce je též vidět, že čidlo je skutečně napájeno jen pasivně a navíc má mezi nohama transil, což v mé fantazii chrání síť s čidly proti přepětí, které se venku na tak dlouhém vedení může naindukovat raz-dva.


3. září 2013 už čidlo pěkně visí, přilepené jen průhlednou izolepou, prý voděvzdornou, no uvidíme, jestli to časem neupadne. Spodní část krytky není uzavřená, takže čidlo může volně "dýchat". Doufám, že toto odstraní ten "skleníkový efekt", kterého jsem se mírně obával.


Pak (22. září) byl čas na návrh a výtisk krásné krabičky. Vytvořil jsem pracně dokonalý 3D model v OpenSCADu, který se mi ale těžce nedařilo vytisknout na naší 3D tiskárně. Smršťování ABS při chládnutí roztrhá vysokou krabičku po vrstvách a nazdar.


Na fotce z 4. října je vidět prakticky hotový HW nového termostatu. Je to sendvič, kdy na desce s oboustranným "plošným spojem" je v konektoru zasunutý barevný TFT displej o krásném rozlišení 220 x 176 bodů s dotykovou vrstvou. Displej má dost nešikovně vyvedený ten dvouřadý konektor, jen tak to vlaje na tom tenkém ohebném plošném spoji a čekám, že se to utrhne - ale levnému koni na zuby nehleď... Gumička a pěnová podložka jen dokresluje mou tehdejší bezradnost ohledně řešení mechanické stránky termostatu.


Z druhé strany plošného spoje je vidět, jak jsem posadil Arduino Pro Mini vedle Ethernetového převodníku a nemilosrdně je prodrátoval přes převodník napěťových úrovní CD4050E. Ano, je to řešení poplatné době - tehdy jsem ještě neuměl vyrábět plošné spoje jako to umím dnes.


19. října, prakticky na prahu topné sezóny (naštěstí byl tehdy teplý podzim), jsem narychlo ve sklepě řešil spínání kotle signálem z nového termostatu. Vyrobil jsem tam jakousi krabičku, do které vede z obýváku CAT5 kabel a v krabičce se rozděluje na tři různé svazky: jeden napájí termostat v obýváku zálohovaným napětím ze sklepa, druhý svazek vede signál od termostatu pro sepnutí relé (to je taky v té krabičce), které spustí kotel, a třetí svazek propojuje síť digitálních teplotních čidel s termostatem.


Toto je už finální zapojení termostatu. Vepředu vlevo je MOSFET řídící podsvícení displeje podle úrovně okolního světla, vepředu vpravo je stabilizátor 3,3 V pro napájení ethernetového převodníku. Vpravo vzadu je vestavěné čidlo DHT11 a DS18B20 pro měření teploty a vlhkosti v obýváku. To se bohužel neosvědčilo, protože v krabičce termostatu panují zcela nereálné teplotní a vlhkostní poměry, neboť ten ethernetový převodník opravdu topí a celou krabičku termostatu tak parádně vyhřeje a vysuší. Vzadu jsou pak vidět všechny zapojené kabely - síťový (RJ45 na CAT5) do routeru, plochý kabel, který později ve zdi redukuju na další CAT5 vedoucí do sklepa k výše popsané krabičce, a také dvoulinku k fotorezistoru na snímání úrovně světla v obýváku.


22. října 2013 jsem v obýváku sundal původní termostat (na fotce ještě visí na kablíku) a začal přemýšlet, jak na jeho místo nacpu ten nový termostat se všemi těmi dráty a redukcemi.


Tady je ještě vidět, že jsem si nakonec slušně poradil s tou mechanickou stránkou - vytiskl jsem takové "lože" pro displej, do kterého přesně zapadá, a toto lože jsem přišrouboval díky pacičkám (ze spodní strany) k tomu plošnému spoji konektoru. Tím se to nejenom zpevnilo, ale hlavně to dostalo tvar jednolité desky plošného spoje, kterou jsem poté mohl z boku zasunout do lyžin v krabičce (snad se mi ji jednoho dne povede vytisknout).


25. října 2013 už termostat pevně visí, ale zatím na dočasném místě na parapetu v pracovně. Díky prosíťování celého domu nebyl problém přepojit všechnu kabeláž z obýváku do pracovny a mít tak termostat funkční i tam. Dokonce už mi tam běží software, který jsem mezitím napsal - zobrazuje přesný datum a čas (získaný z Internetu díky NTP), relativní vlhkost 38 % a úroveň okolního osvětlení 394 (z rozsahu 0-1023). Dále jsou tam vidět teploty z obou sítí - levý sloupec je vnitřní (bytová) síť, pravý sloupec je vnější (sklep a venku) síť. Toto rozdělení na dvě sítě vysvětlím později. No a vypisuju si taktéž úroveň napětí, abych viděl, kolik voltů ze sklepa po těch dlouhých CAT5 drátech přijelo, a navíc i uptime, abych viděl, jestli je termostat stabilní a vydrží běžet bez restartů či výtuhů měsíce nebo raději roky.


27. října se mi pořád ještě nedařilo vytisknout krabičku dobře. Je zkroucená a má potrhanou většinu "mostů" těch ventilačních otvorů. Čert aby ten 3D tisk spral! Takové skvělé teoretické možnosti a taková zklamání při praktickém tisku...


29. října 2013 jsem konečně spokojen, krabička je celá a po přelakování acetonem (který zalepí prasklinky) i docela pevná.

No a tady mé fotografie končí. Dá se předpokládat, že ještě koncem října jsem termostat skutečně přišrouboval na správné místo v obýváku, zapojil kabely a úspěšně je nacpal do zdi a celé to začalo fungovat. Finální foto jsem nenašel, ale v historii vývoje software termostatu je vidět, že od 30. října 2013 topí naplno.

Dnes je březen 2015, takže termostat má za sebou dvě úspěšné topné sezóny, a musím říct, že se mimořádně osvědčil. Podle grafů teplot, které celý systém okolo termostatu také generuje, je vidět, že přestalo docházet k přetopení a tedy protopení zbytečného plynu navíc. Také faktury za plyn hovoří jednoznačně. A v bytě je tepleji, teplota tolik nekolísá, řídím to zkrátka tak, jak jsem si roky předtím jen představoval.


Samozřejmě hlavní kouzlo je v software, který je uvnitř termostatu. Nacpal jsem do Arduina hromadu knihoven, abych dokázal obsluhovat všechen ten připojený hardware:
  • OneWire sběrnici a na ní DallasSemiconductors čidla
  • displej s řadičem ILI9225B
  • grafickou knihovnu od Adafruitu pro vykreslování textů a možno i grafiky
  • knihovnu pro dotykovou vrstvu, abych mohl snímat dotyky prstů na obrazovce
  • Ethernetovou knihovnu, abych mohl komunikovat po LAN síti a na Internet
  • DHT11 knihovnu, abych mohl číst teplotu a vlhkost z vnitřního čidla
  • Time knihovnu, abych měl datum a čas, den v týdnu a podobné vymoženosti
  • NTP knihovnu, abych měl přesný čas synchronizovaný přes Internet
  • a možná jsem ještě na něco zapomněl...
Přestože jsem původně počítal s tím, že termostat bude díky tomu, že je neustále plně online, schopen například stahovat a zobrazovat předpověď počasí z ČHMÚ či odjinud, anebo bude podle předpovědi na nejbližší hodiny schopen dokonce topit (wow), nakonec jsem musel ze  svých představ významně slevit. Dokonce se mi ani nepodařilo plně využít krásnou barevnou grafiku displeje pro zobrazení nějakých tlačítek, posuvníků pro nastavování teploty, grafů zobrazujících průběh teplot či otopný program atd. Bohužel, došlo mi místo v paměti Arduina.

Je to tak - ta přemíra knihoven zaplácala přes 80 % z celkové volné kapacity 31 kB flash paměti procesoru ATMEGA328, který je srdcem Arduina Pro Mini. Nejenže mi nezbylo místo na nějaké grafické srandičky, ikonky mráčků, sluníček, šipečky a podobně, ale nemám bohužel ani dost místa na naprogramování aspoň nějakého uživatelského rozhraní či pokročilého ovládání přes Internet. Proto je zatím rozhraní docela spartánské - displej zobrazuje jen čas a čtyři klíčové teploty (plus minima a maxima vnějších teplot za posledních 24 hodin). Podle vnitřních teplot termostat topí, a podle vnějších teplot se oblékáme, když jdeme ven.


Měření teploty na přímém Slunci se velmi osvědčilo - a ani čidlo přilepené izolepou na svodu rýny a vystavené dešti, plném slunečním svitu a mrazu za těch 17 měsíců neodpadlo. Jen jsem ještě neměl čas naprogramovat podle něj topení. Současný algoritmus pracující s průměrem teplot v obou patrech domu funguje dostatečně dobře.

V posledních týdnech jsem po chvilkách obnovil práci na SW termostatu a pokouším se vyšetřit aspoň pár bajtů flash paměti navíc, abych dokázal kromě dvou obrazovek s čísly dát na displej i nějaká tlačítka. Mám představu tlačítka pro větrání ("netop, větráme") a možná i nějakého nouzového topení ("zatop trochu víc, večer bude zima"). Přitom jsem narazil na několik zásadních věcí, které mě přiměly definovat dva úplně nové projekty, na kterých jsem začal ihned pracovat a které popíšu v blogu vzápětí (kódová označení "multitasking" a "pořádný font")...

Každopádně budu chtít vyřešit tu slepou uličku s nedostatkem místa v paměti procesoru. Buďto jsem měl oddělit logiku síťování a topení (backend) od grafického zobrazování a uživatelského vstupu (frontend) a dát tam dvě Arduina (což jsem původně skutečně zvažoval, ale nakonec jsem se na to bůhvíproč vykašlal), anebo prostě musím nasadit procesor s větší pamětí. Přemýšlel jsem nad ATMEGA1284p (který má už podle označení 128 kB flash paměti), ale +Ctirad Feřtr mě upozornil, že cenově mnohem výhodnější je nějaký 32bitový ARM. Takže jsem si za 4 dolary koupil Maple Mini a uvidím, jestli se mi podaří ho rozchodit jak potřebuji. Určitě si zaslouží vlastní článeček, snad někdy brzy.