Internetový termostat: stavba sítě teplotních čidel na 1-Wire sběrnici

27. 5. 2015
Doba čtení: 11 minut

Sdílet

V dnešním dílu seriálu o stavbě termostatu upřesníme jednu drobnost z minulého článku, mrkneme na možnost bezdrátových čidel a pak už se pustíme do tahání kabelů a zapojování čidel DS18B20 do 1-Wire sítě. Dokončenou síť můžeme otestovat z počítače, než budeme mít hotový termostat s mikrokontrolérem.

Ještě než se pustíme do stavby 1-Wire sítě, rád bych na základě bohatých komentářů pod předchozím článkem reagoval na dvě věci. Za prvé, kvůli zajímavé technicko-logické chybě v knihovně, kterou pro čtení teplot z DS18B20 používám, jsem se roky mylně domníval, že čidlo DS18B20 dokáže změřit teplotu za 35 milisekund, a proto jsem do článku napsal, že z nich zvládneme číst teplotu mnohokrát za sekundu (na rozdíl od pomalých DHT11/DHT22). Jak jsem posléze zjistil, pravda je, že při nejvyšší 12bitové přesnosti čidlu trvá změřit teplotu zhruba 600 milisekund, případně o chlup déle (výrobce si vyhradil až 750 milisekund). To znamená, že nezískáme přesnou teplotu víckrát než zhruba jedenkrát za sekundu (přesněji čtyřikrát za tři sekundy).

Při řízení vytápění konvenčními palivy (nikoliv třeba termojadernou reakcí) by to ale mělo bohatě stačit. Kdo potřebuje kratší časy mezi jednotlivými čteními teplot, může čidlu snížit přesnost konverze na 11, 10 nebo 9 bitů, a tím zkracovat maximální časy měření na 375, 188 nebo 94 milisekund. Musím však upozornit, že při každé konverzi teploty spotřebuje čidlo DS18B20 určitou energii, kterou vyzáří v podobě tepla, jež zpětně čidlo mírně ohřeje. Proto velmi časté požadavky na změření teploty mohou zkreslit naměřené hodnoty.

Druhá věc, kterou jsem z diskuse pochopil, je, že některé čtenáře by mohlo zajímat, jak postavit síť snímačů teplot bezdrátovou. Proto jsem do dnešního článku operativně zařadil následující fotku zobrazující tři různé bezdrátové vysílače, které mám doma v šuplíku.

Bezdrátové vysílače – zleva postupně 433 MHz, 2,4 GHz nRF2401 a WiFi ESP8266

Všechny tři kousky mají společnou jednu sexy vlastnost, a sice cenu. Stojí od 2 do maximálně 7 desetikorun, takže by s nimi šlo sestavit jednotlivá bezdrátová teplotní čidla do stokoruny (do ceny jsem započítal i miniaturní mikrokontrolér). Vysílač nalevo pracuje na frekvenci, kterou používají mnohé domácí meteo stanice. Prostřední vysílač na 2,4 GHz je zajímavý tím, že s pomocí vhodné knihovny je možné postavit mesh síť, takže není nutné, aby každý měřený bod dosáhl svým signálem až na server/termostat. A vysílač na fotce vpravo je fajn v tom, že je to celý volně programovatelný ARM 32bitový RISC mikrokontrolér, navíc řádově silnější než běžné Arduino, takže k němu stačí připojit DS18B20 a už měříme a teplotu hlásíme v LAN či do celého Internetu.

Každý z těchto vysílačů má svá specifika a zasloužil by si samostatný výživný článek. My se jim však zde nadále věnovat nebudeme ze dvou dobrých důvodů: především, bezdrát je možná elegantní a moderní, ale drát je drát. Pevný drát v 1-Wire sběrnici nabízí jistotu funkčnosti za všech podmínek, stabilitu spojení i kdyby padaly trakaře či soused (ne)úmyslně zarušil celé radiové pásmo. Kabel také zajišťuje napájení koncových měřicích bodů, které bychom u bezdrátových uzlů museli řešit nějak jinak. Druhým dobrým důvodem je, že většinu z těch vysílačů nemám pořádně odzkoušenou (už roky čekají v šuplíku, ale ještě nepřišly na řadu), takže o nich nemůžu napsat osobně ověřené věci a objektivně je porovnat.

Zapojení vývodů DS18B20

Jak tedy takovou síť čidel postavit? Stačí na vhodná místa v bytě i mimo něj čidla mechanicky upevnit a pak je všechny paralelně propojit kabelem (tj. DQ vývod každého následujícího čidla připojit na DQ vývod čidla předchozího, a analogicky GND na GND, a (pokud používáme i Vdd) Vdd na Vdd. Dlužno dodat, že když koupíte čidla ve vodotěsném provedení, tak černý drát je GND, červený Vdd a žlutý (či jiné podobné barvy) je DQ.

A teď nadchází moment klíčového rozhodnutí. Sběrnice 1-Wire, po které čidla komunikují, totiž dokáže fungovat ve dvou režimech: běžný režim sběrnice potřebuje tři vodiče – jeden pro napájení elektroniky v čidlech (Vdd), druhý pro datovou komunikaci (DQ) a třetí pro společnou napájecí i datovou zem (GND). Pak je tu ale druhý, docela unikátní režim 1-Wire sběrnice, zvaný parazitní. V něm čidlo DS18B20 dokáže napájet svou elektroniku parazitně z datového vodiče, takže sběrnice se zcela obejde bez napájecího (Vdd) vodiče a na propojení čidel rázem stačí jen obyčejná dvojlinka! Pokud stavíte síť teplotních čidel poté, co jste právě dostavěli či zrenovovali dům/byt, a zjistíte, že potřebujete umístit čidlo někam, kam vám nevedou více než dva dráty a vy kvůli třetímu drátu nechcete znovu rozsekat omítky, může být tato možnost parazitního zapojení celé sběrnice velmi lákavá. Případně vás fascinuje toto technické řešení, kdy čidlo má spojeny své vývody Vdd s GND a přesto, jakoby zcela bez napájení, funguje. Nebo vás možná láká jít až do absolutního extrému, kdy zemní vodič (GND) nahradíte přímo matičkou Zemí? Jeden čtenář mi tvrdil, že mu takto fungují čidla někde na zahrádce propojená jediným datovým vodičem (přičemž vývod GND čidla uzemnil), osobně jsem to ale ještě nevyzkoušel.

Parazitní zapojení DS18B20

Ať už máte důvody pro použití dvojlinkového provedení 1-Wire sběrnice jakékoliv, vězte, že parazitní napájení čidel na sběrnici s sebou nese určitou „křehkost“ celé sítě. Při dvoudrátovém provedení se sběrnice stane mnohem citlivější na kde co – například může mít vliv typ použitých vodičů (drát versus lanko), kapacita vedení (kroucená dvojlinka může začít kvůli své vyšší kapacitě vadit), elektrické rušení z okolních spotřebičů a především – sběrnice bude vyžadovat přísně kruhovou topologii a bude krutě trestat téměř jakékoliv odbočky z hlavního směru. „Křehkostí“ míním příliš velkou chybovost při datových přenosech. V praxi (ano, doma mám všechna čidla na parazitní sběrnici) jsem zjistil, že nesmím z hlavního směru sběrnice rozbočit k čidlu vedlejším vedením delším než pět centimetrů, jinak celá síť začne významně zlobit, tj. objeví se chyby při čtení (což se projeví tak, že čidlo vrátí hodnotu buďto 85 °C anebo –127 °C). Proto osobně doporučuji zapomenout na tuto technicky zajímavou možnost parazitního napájení čidel na sběrnici a pokud možno natáhnout třívodičový kabel od termostatu ke všem čidlům – ušetříte si tak nejeden zešedivělý či v zoufalství vytržený vlas.

bitcoin_skoleni

Pro třívodičovou sběrnici stále platí pravidlo kruhové topologie. Proto naplánujte vedení mezi jednotlivými čidly jako jednoho dlouhého „hada“. Délka sběrnice, která tímto naroste, nijak významně nevadí. Dobře fungují 1-Wire sběrnice i o délkách přesahující sto metrů. Na hvězdicové zapojení jako u domácí LAN s centrálním switchem však rovnou zapomeňte. Což nás přivádí k tomu, že pokud doma ještě nekomunikujete gigabitovou rychlostí, případně pokud jste už dráty jako Marconi opustili a přešli doma kompletně na WiFi, může být velmi výhodně roztahat tepločidlovou síť s pomocí existujícího CAT5 vedení původně určeného pro síť počítačovou. V takovém případě se přímo vybízí využít normálně nepoužité vodiče na pinech 4, 5, 7 a 8. Poté nehrozí problém ani při náhodném či úmyslném připojení počítačového vybavení (do 100 Mbps) do sítě společně s čidly DS18B20. Podobně lze použít pro zasíťování termočidel již nepoužívané telefonní rozvody, které se dřív v novostavbách taky tahaly do téměř každé místnosti. Toto však s existujícími telefony a živou telefonní přípojkou určitě nekombinujte (přestože je v RJ11 volný pár vodičů), přece jen je tam z telefonní sítě docela vysoké napětí 60 V a s tím by se DS18B20 ani mikrokontrolér v termostatu určitě potkat nechtěl.

Čidlo připájené na ustřižený konec síťového kabelu

Čidlo zacvaknuté přímo uvnitř RJ45 konektoru

Jak vidíte, teplotní čidla se dají zapojit přímo do ethernetových zásuvek. Tak je možné i bez sekání omítky začít měřit teplotu prakticky v celém bytě, pokud byl tento původně zasíťován. Samozřejmě teplota 15 cm nad podlahou může být jiná než v obvykle doporučované výšce 150 cm, ale to se dá lehce ošetřit softwarově v termostatu. Každopádně je potřeba dodržet tu kruhovou topologii, tj. pokud máte zasíťováno poctivě a kabely se z jednotlivých zásuvek setkávají v patch panelu někde v racku, bude potřeba pomocí patch kablíků v racku „zokruhovat“ jednotlivé zásuvky či místnosti do té výše uvedené podoby dlouhého „hada“.

V případě, že hrozí přesáhnutí rozumné délky sběrnice, nebo pokud chcete „izolovat“ některé měřené části od jiných (například byste neradi, kdyby nečekaný zkrat termočidla v dětském pokoji zablokoval měření v celé síti a termostat tak topil až do výbuchu kotle), je možné navrhnout síť termočidel jako několik nezávislých sběrnic. Takto mám například oddělenou sběrnici „vnitřní“ (teploty v pokojích) od sběrnice „vnější“ (teploty ve sklepě na kotli a venku na fasádě). Samozřejmě to bude vyžadovat, aby termostat komunikoval s více 1-Wire sběrnicemi, ale to nebude žádný problém.

Schéma mé domácí 1-Wire dvojsítě

Dlouho jsem přemýšlel, jak sběrnici efektivně rozbočovat, tj. jak k ní přidávat další čidla. Nakonec jsem použil pro tu část, která v domě využívá bývalé ethernetové rozvody, následující RJ45 rozdvojku (na obrázku níže). Stejná existuje i pro telefonní RJ11. U mé „vnější“ sběrnice jsem nakonec všechny odbočky a prodloužení 1-Wire sítě jednoduše připájel. Je to elektricky nejlepší a mechanicky nejtrvanlivější spojení. V úvodu seriálu jsem slíbil, že to půjde i bez páječky, takže by šlo určitě použít i nějaké mechanické svorkovnice („čokolády“), Wago svorky, možná dokonce 3,5 mm stereo jacky (a pro jejich rozbočení použít rozdvojky jako ke sluchátkům?).


Alza.cz

RJ45 rozdvojka

A jak sběrnici s čidly připojit k počítači pro otestování ještě předtím, než oživíte termostat s mikrokontrolérem? Zde se nabízí několik možností: jednak jsou to integrovaná řešení od firmy Dallas Semiconductor, která převádějí 1-Wire sběrnici na RS232 obvodem DS2480 či rovnou na USB obvody z řady DS9490 nebo dokonce iButtonLink. Jako správní hackeři ale jistě dáte přednost následujícímu schémátku s pár pasivními součástkami, které se navíc dají přímo připájet na CANON 9 konektor, vejdou se do jeho krytky, a tak máte prakticky zadarmo převodník z 1-Wire na RS232.

Schéma převodníku z RS232 na 1-Wire sběrnici

1-Wire síť má na PC poměrně dobrou SW podporu – v Linuxu i dalších systémech si můžeme nainstalovat DigiTemp, jen pro MS Windows je pak třeba LogTemp a jistě i řada dalších programů, o kterých nemám potuchy, neboť používám pouze Linux. Mocně vypadající 1-Wire Filesystem jsem vyzkoušet nestihl.

Zapojení převodníku, které se vejde do krytky konektoru

Pokud váš počítač už má místo RS232 jen USB porty, je možné teoreticky použít některý z dostupných převodníků USB na RS232. Prakticky před tím nahlas varuji, neboť je to, jak říkáme u nás, jistá cesta do Kroměříže. Pes je zakopaný v tom, že zatímco výše uvedené schéma spoléhá na to, že na RS232 jsou napěťové úrovně blízké ±12 V, tak levné čínské převodníky z USB na RS232 se jen obtížně přibližují k úrovni slabých 5 V. Pokud se z takového chabého napětí pokusíte napájet 1-Wire sběrnici, zaděláte si na bezesné noci a zbytečně promarníte své mládí laděním hrozných problémů (vlastní hořká zkušenost). V takovém případě bude mnohem lepší úplně přeskočit celý převodník z 1-Wire sběrnice na RS232 a připojit teplotní čidla přímo na GPIO piny mikrokontroléru či počítače, který bude srdcem termostatu.

Příklad připojení čidla DS18B20 k Arduinu

Ať už připojujete k počítači/mikrokontroléru 1-Wire sběrnici parazitní či normální, je potřeba zařídit ještě jednu klíčovou věc: čidla DS18B20 počítají s tím, že datový vodič sběrnice má tzv. pull-up, tj. něco jej napěťově táhne nahoru, k logické jedničce. Obvykle se to zařizuje rezistorem zapojeným na začátku sběrnice mezi datový vodič a napájení. Pro klasickou tranzistorovou logiku s 5V napájením se ve všech běžně dostupných návodech doporučuje použít pull-up rezistor s hodnotou 4k7. Praxe ukázala, že hodnotu tohoto rezistoru je potřeba snižovat podle narůstající délky sběrnice. Například mně se osvědčila hodnota 2k2 na „vnitřní“ (bytové) sběrnici, ale venkovní (sklep + fasády) sběrnice je delší a tak jsem musel jít s rezistorem dolů až na hodnotu 1k.

Je možné postupovat cestou pokus-omyl a zkoušet postupně klesající hodnoty rezistorů, anebo, jak mi jeden čtenář napsal, tam „prostě vrazit 5k potenciometr a tak dlouho s ním kroutit z jedné krajní polohy do druhé, až chyby na sběrnici zmizí“. Zatímco u vysoké hodnoty odporu jsou chyby na 1-Wire sběrnici způsobené příliš „měkkým“ a na dlouhém vedení dokonce nízkým napětím na datovém vodiči (což zvlášť u parazitního napájení prakticky znemožní čidlům nabít své kondenzátory, které jim slouží jako zásobárna energie), tak u nízké hodnoty odporu je datový vodič tak silně tažen k logické jedničce, že pro čidlo je obtížné přetáhnout ho do logické nuly. Zkrátka to chce i při volbě hodnoty pull-up rezistoru zlatou střední cestu.

Přemostění pull-up rezistoru tranzistorem

Další možností, především pokud selhává parazitní napájení čidel na sběrnici i při opravdu malých hodnotách odporu pull-up rezistoru, je přidat tranzistor paralelně k pull-up rezistoru a tento rezistor po dobu nabíjení vnitřních kondenzátorů v čidlech otevřením tranzistoru „přemostit“ a pustit tak na datovou linku plné napájecí napětí. Toto řešení by ale vyžadovalo speciální podporu na straně počítače či mikrokontroléru, jak v HW (řízení báze tranzistoru) tak i v SW (rozebrat knihovny pro 1-Wire a přidat tam spínání toho tranzistoru do správného místa v kódu), takže to zde zmiňuji pouze jako zajímavost a nikoliv jako řešení, které bych doporučoval následovat.

Koncový bod sběrnice – čidlo teploty na slunci s ochranným transilem

Tímto je 1-Wire sběrnice teplotních čidel hotova a připravena na připojení k novému termostatu. I když snad ještě jedna věc by se hodila, zvlášť pokud vede sběrnice kolem jiného silového vedení či dokonce venku po fasádě. Na dlouhých vodičích se může naindukovat nemalé napětí (a to nejenom při blízkém úderu blesku), takže je rozumné pokusit se ochránit jak čidla, tak i počítač k nim připojený pomocí vhodně orientovaných transilů s hodnotou 5,8 V (na nižší napětí se myslím nedělají) připojených na koncích sběrnice (mezi DQ a GND, případně i mezi Vdd a GND).

Příště už začínáme stavět samotný termostat!

Autor článku

Petr Stehlík vystudoval aplikovanou informatiku a pracuje jako vývojář webových aplikací a administrátor linuxových serverů. Provozuje vlastní server tvpc.cz.