čtvrtek 2. května 2013

Velké digitální měření teplot s čidly DS18B20

Delší dobu jsem nosil v hlavě myšlenku měření teploty na klíčových místech otopné soustavy v mém domě. Kotel s relativně vysokým a hlavně neměnným výkonem plus velké množství vody v podlahovém vytápění (majícím velkou tepelnou setrvačnost) totiž způsobují cyklické přechody mezi stavem "je tu chladno, proč ještě kotel netopí" a stavem "je tu zbytečné horko, proč kotel topil tak moc". Chtěl jsem pochopit, jak vlastně celá ta otopná soustava funguje, protože věřím, že by se její regulace dala značně vylepšit - a na to jsem potřeboval vědět, jak se mění teplota v čase, tedy potřeboval jsem teplotu měřit, trvale zaznamenávat a průběžně zobrazovat.

Už dříve jsem sem tam narazil na informace o digitálním měření teploty, ale nakonec mě rozhýbaly k akci až následující dvě věci - jednoduchý český návod na Teploměr pro PC a levná čidla DS18B20 v mém oblíbeném e-shopu. Měl jsem radost, že jeden kus krásného integrovaného digitálního teplotního čidla s 12bitovou přesností a unikátním 64bitovým identifikačním číslem vyjde z Číny jen na 50 Kč, tak jsem tam začátkem listopadu 2012 objednal hned 4 kusy. A protože jsem chtěl čidla připojit k mému novému serveru, který bohužel nemá žádný sériový port, objednal jsem rovnou v Číně i adaptér z RS232 na USB, abych měl kam převodník pro DS18B20 zapojit (spoiler alert: dobře si ho prohlédněte, protože to je naposledy, co ho vidíte).


Týden před Vánoci zboží konečně dorazilo, ovšem tehdy jsem na něj z pochopitelných důvodů neměl čas. Ke stavbě převodníku pro připojení digitálních čidel na sériový port jsem se tak dostal až na Silvestra, takže jsem to udělal nedočkavě, rychle a bezohledně, starou dobrou metodou vrabčího hnízda tak, aby výsledek pasoval do plastového krytu konektoru Canon.



Při testech vše perfektně fungovalo, tak jsem neváhal připojit všechna 4 čidla naráz - jak vidno, zapojují se jednoduše paralelně - a odečítat teplotu na všech současně, abych se ujistit, že ukazují stejně. A skutečně, kalibraci mají výtečnou, rozdíly v teplotách byly maximálně desetinu stupně Celsia. Dokonce jsem použil i právě koupený teploměr a porovnával naměřené hodnoty čidel s ním, pořád všechno bezvadně sedělo. Byl jsem tedy připraven začít čidla rozmisťovat po domě.


Důležitá poznámka o sběrnicích: tato skvělá čidla mají tři vývody - zem, napájení a jeden vývod datový, který umožňuje obousměrnou komunikaci po speciální jednodrátové ("1-Wire") sběrnici vyvinuté právě pro tato čidla. Takže na propojení čidla (či mnoha čidel) s počítačem stačí tři dráty - napájení, zem a data. Ale výrobci čidel (firmě Dallas) se zdály tři dráty ještě moc, a tak vymyslel tzv. pasivní režim, kdy stačí pouhé dva(!) dráty - čidlo se totiž dokáže napájet z komunikace na datovém vodiči (nabije si v sobě kondenzátor a pak z toho chviličku žije). No a protože se v návodech psalo, že pasivní režim je super a sexy, šel jsem do něj taky a rovnou natáhl z pracovny do sklepa ke kotli jen dva dráty (upřímně řečeno jsem neměl moc na výběr, z nouze jsem použil kablík původně myšlený na přenos zvuku z PC v pracovně do TV v obýváku, ještě než jsem před 8 lety postavil MythTV HTPC přímo v obýváku).

Mechanickou část bych rád přeskočil, protože jsem ji tak trochu nedořešil. Nejdřív jsem si koupil skvělou hliníkovou lepicí pásku, o které jsem se domníval, že povede teplo, a tou jsem čidla přilepil přímo na měděné trubky s otopnou vodou. To se ukázalo nedostatečné - čidla se pod lepicí páskou uvolňovala, ztrácela 100% kontakt a měřené hodnoty se rychle začaly lišit od skutečnosti. Tak jsem to pojistil kovovou sponou (tou na zahradní hadice), kterou jsem ale nedokázal utáhnout dost pevně a zároveň dost šetrně - měl jsem pocit, že při utahování to čidlo rozdrtím. Tohle bych ještě rád nějak vylepšil. Stejně tak jsem nevyřešil rozumně nějaké konektory, takže jsem nakonec čidla napájel na dráty natvrdo. To má své výhody (žádné selhávající kontakty), ale i nevýhody (výměna čidel, přemístění čidel, výměna vodičů - všechno znovu pájet).

Pokojové rozvody k čidlům jsem udělal chytřeji: použil jsem existující ethernetové rozvody - tedy CAT5 kabeláž. Pro čidlo jsem po dlouhém váhání a pročítání zkušeností jiných vybral vodiče č. 4 a 5 (modrý a modrobílý), které jsou v normální počítačové síti nepoužité a zároveň jsou spolu hezky zkroucené (takže jsem si říkal, že sběrnice bude odolná vůči případnému okolnímu elektromagnetickému rušení). Čidla jsem nacvakl přímo do RJ45 konektoru a zastrčil do ethernetové zásuvky. Tím můžu měřicí bod jednoduše stěhovat po celém domě, kdekoliv je existující rozvod LAN...

Záhy jsem rozmístil všechna 4 čidla (voda do topení, voda z topení, voda z kotle a vzduch v obýváku), měření fungovalo skvěle, grafy ukazovaly nečekané souvislosti, bylo to úchvatné. Zachtělo se mi měřit ještě víc a tak jsem začal shánět další čidla. Velmi překvapivě jsem našel DS18B20 v místním obchůdku fy Official a to za ještě lepší cenu než v Číně - pouhých 37 korun!


Nakoupil jsem jich další hromádku, k tomu relé na 230V a začal plánovat, že počítač převezme úlohu termostatu v obýváku, který dnes řídí topení kotle pouze podle teploty vzduchu. Jistě dokážu naprogramovat dramaticky účinný a nesmírně inteligentní software, který bude řídit kotel tak skvěle, že doma nebude ani zima ani horko!

Na dobrou regulaci vytápění by se ale opravdu hodilo znát venkovní teplotu (abych tak trochu zapojil i ekvitermní regulaci), takže jsem protáhl 1-Wire sběrnici o dalších pár metrů ze sklepa až ven na stěnu domu a tam přidal další čidlo. Zároveň jsem natáhl další větev sběrnice doma a kromě obýváku začal měřit teplotu i v horním patře, protože obývák má největší solární zisk ze všech místností a to velmi často doplete regulaci kotle, který pak netopí, protože celý den svítilo Slunce.


A v tom se to celé po..kazilo. Teplotu měřím každou minutu a grafy zobrazuji za posledních 12 hodin, 48 hodin, a celý týden. A naráz začalo být nepřehlédnutelné, že software Digitemp občas vyčte z čidel naprostý nesmysl. Postupně jsem se pokoušel ty nejviditelnější hrubky odstraňovat - například "127,94" stupňů Celsia jsem brzy vyhodnotil jako chybu čtení, kdy z čidla soft vyčte jen 12 binárních jedniček. Stejně tak jsem brzy začal z grafu vynechávat hodnotu "85,0", o které jsem se dočetl, že přímo značí Error, tedy chybu čtení čidla.

Bohužel i přes tyto úpravy se pořád množily chyby, kdy teplota na některém čidlu v naprosto náhodné momenty "ustřelila" třeba o padesát stupňů Celsia jedním či druhým směrem, ačkoliv při dalším čtení o minutu později už bylo vše opět v pořádku. Tyto chyby měly také tendenci se akumulovat, kolikrát když se objevily, tak se pak objevovaly pořád, množily se a někdy pomohl až restart PC (?!). Jindy zase zmizely po několika hodinách samy. Byla to noční můra a pokusům a ladění jsem věnoval nesmírné množství energie a času. Podle tohoto by opravdu nešlo řídit kotel...


Začal jsem cíleně hledat další podobné nešťastníky na Internetu a brzy jsem našel celou řadu materiálů, ze kterých poměrně jednoznačně plynulo, že použití pasivního módu (tedy jen dvou drátů k čidlům) je naprosto hloupé a funguje to v podstatě jen náhodou a jen na velmi krátkých (desítky centimetrů) sběrnicích s jen pár čidly. Jenže já už v té době měl mohutně rozvětvenou síť čítající jistě desítky metrů nejméně třemi směry, a 8 čidel online. Aha, takže takto velké sběrnice nemohou v pasivním módu fungovat kvůli odporu a kapacitě vedení. Ach jo! Naštěstí nešťastníci měli několik tipů na řešení, které jsem postupně vyzkoušel:

1) pro 1-Wire sběrnici použít kroucenou dvoulinku, protože ta eliminuje rušení, co se může po cestě indukovat. Takže jsem pracně přepájel celé vedení ve sklepě od čidla k čidlu. Výsledná změna žádná, nebo možná dokonce k horšímu. Hledal jsem tedy dál a pak jsem se dočetl, že problém způsobuje kapacitance dlouhého vedení, která v podstatě "zaoblí" hrany digitálního signálu tak moc, že se stane nečitelným. Takže chyba, zpět na stromy!

2) pro 1-Wire sběrnici použít NEkroucenou dvoulinku, protože má menší kapacitanci. Opět jsem pracně přepájel celé vedení ve sklepě. Neměl jsem sílu předělat čidla nacvaknutá v RJ45 konektorech, takže jsem místo toho vypojil domácí měření úplně. Sběrnice se tím dramaticky zjednodušila a chyb čtení opravdu výrazně ubylo. Ovšem jak regulovat topení bez vnitřní teploty? Hledal jsem tedy další tipy a našel...

3) přidat kondenzátor před čidla. To se mi zdálo divné, vždyť jinde vysvětlovali, že to přestává fungovat právě proto, že dlouhá sběrnice už má příliš velkou kapacitanci, no ale zkusil jsem přidat kondenzátor tuším 22nF k nejvzdálenějšímu čidlu. Sběrnice totálně vytuhla, takže tudy ne.

4) No a poslední tip, který jsem našel, bylo přidat rychlou diodu v závěrném směru před každé čidlo (to myslím doporučuje sám autor Digitempu). Prý to ořeže nějaké zlé napěťové špičky na sběrnici nebo co. Koupil jsem tedy 8 Schottky diod a postupně je začal dávat paralelně k nejvzdálenějším čidlům. To se mi zdálo, že zabralo, ale spíš jsem měl jen štěstí na několikadenní klid před bouří, neboť chyby na sběrnici se (zřejmě po zapojení jedné domácí větve ke sběrnici) opět vrátily...

Začátkem února jsem se po stovkách pokusů dostal do stavu, že pokud jsem odpojil dvě domácí větve zapojené přes CAT5 a nechal jen větev sklepní, tak to fungovalo téměř bez chyb, ale jakmile jsem sběrnici zapojil "do hvězdy", chybové byly i desítky procent ze všech měření. Bylo to bohužel v souladu s tím, co jsem se nakonec dočetl o pasivních 1-Wire sběrnicích na webu, kde jasně doporučují žádné zbytečné odbočky či dokonce rozbočky a celou 1-Wire sběrnici jen jako jeden (nepříliš dlouhý) drát.

Už to peklo nebudu dál protahovat. Po mnoha týdnech v podstatě marných bojů jsem při pročítání dalších a dalších zdrojů informací o 1-Wire sběrnicích a neustálém narážení na zmínky o tom, že pokud chceme mít čidla připojená k Arduinu přes pasivní sběrnici, rozhodně musíme přidat rezistor 4k7 mezi zdroj napětí a tu sběrnici (kterým se sběrnice takto de-fakto "napájí"), mě napadlo zkusit takové napájení sběrnice přidat i na ten můj převodník. Tipoval jsem, že tam sice něco takového bylo původně myšleno i u tohoto převodníku pro DS18B20 na RS232 (zřejmě to má brát energii z DTR), ale třeba je tam "málo šťávy?".

Tak jsem udělal naprosto krutý HW hack: vzal jsem stavebnici "Logitronic 02" (krásné dětství, dnes bezostyšně zkopírováno v stavebnicích Voltík), vrazil do ní 4xAA nabíjecí NiMH články (= 5V, jak se pro TTL hodí) a přes potenciometr nastavený na zhruba 4kOhm připojil k mé 1-Wire sběrnici. A světe div se - všechny ty proklaté chyby, které mě dva měsíce zoufale trápily, naráz zmizely! 3.března jsem otevíral šampáňo...

Zřejmě jsem ta čidla na sběrnici měl skutečně napěťově "podvyživená", proto všechny ty chyby čtení, kdy čidla neměla dost energie dokončit datový přenos. V té době jsem už začínal podezřívat použitý USB-RS232 adaptér, a tady se mi to potvrdilo. Stačilo na zkoušku přepojit 1-Wire převodník do PC s reálným RS232 portem a teploty byly také bez chyb, i bez dodatečného napájení (proč mě tohle nenapadlo ani jednou za poslední dva měsíce trápení?!). Loni jsem koupil dva ty USB-RS232 adaptéry, jeden na toto měření teplot, druhý na připojení UPS, a oba zklamaly obrovským způsobem, po vyčerpávajícím hledání chyb všude jinde.

Výborná zpráva je, že i ta moje docela hustě rozvětvená a velmi dlouhá pasivní 1-Wire sběrnice s kroucenou dvoulinkou naráz začala fungovat dobře. Bedlivě jsem ji sledoval a čekal na moment, kdy selže, ale nic takového se nestalo, šlapala poctivě po další týdny a naměřila stovky tisíc měření bez jediné chyby! Takže všechny ty negativní články a špatné zkušenosti byly možná způsobené taky podobnou napěťovou podvýživou. Pokud je pasivní 1-Wire poctivě "napájen", vydrží zjevně hodně, rozhodně víc, než se píše na webu. Koncem února, v nejhorší situaci, jsem už byl psychicky připravený celé to předrátovat a předělat sběrnici na třívodičovou, ale teď si říkám, že to asi vydrží tak, jak to je.

Nakonec se vybily ty akumulátory držící 1-Wire sběrnici nad vodou a při následném pokusu napájet ji přímo z USB jiného počítače jsem zřejmě popravil ten USB-RS232 adaptér (čehož ovšem vůbec nelituji, protože ten si stejně nic jiného nezasloužil!). V té době jsem už byl pevně rozhodnutý postavit nový ďábelský počítačový termostat využívající tuto mohutnou síť teplotních čidel, ale ne na bázi PC, které nemá žádný rozumný výstupní port pro ovládání relé (ano, bohužel, paralelní port u mého "serveru" taky chybí), ale na bázi pro mě zcela nového světa - Arduina.

Doplnění: po téměř dvou letech má tento článek své pokračování zde.