Hlavní navigace

Hardware inteligentního internetového termostatu

3. 6. 2015
Doba čtení: 14 minut

Sdílet

V dnešním dílu se vrhneme na hardware a popíšeme si, jak se dá takový termostat podomácku postavit. Ještě předtím nás ale čeká důležitá oprava jednoho slova z minulého dílu. Po výčtu všech nezbytných komponent projdeme popisem zapojení a závěrem nahlédneme do výroby krabičky metodou 3D tisku.

Úvodem se vrátím ještě k předchozímu dílu, kde jsem při popisu zapojení 1-Wire sběrnice nesprávně použil termín „kruhová topologie“ (když jsem zrovna nepsal o „dlouhém hadovi“). Podíváte-li se na obrázek níže (převzatý z Topologie sítí na Wikipedii), tak mně doma spolehlivě funguje parazitní 1-Wire síť v topologii přímé (Line) či sběrnice (Bus).

Topologie počítačových sítí

Co mi doma parazitně nefungovalo, a před čím jsem se snažil čtenáře varovat, bylo zapojení do hvězdy (Star) či stromu (Tree). Proto jsem si doma vnější a vnitřní síť zapojil jako dvě nezávislé sítě, na dva piny mikrokontroléru. Stejně tak mi zlobilo zapojení s dlouhými odbočkami od hlavní linie k jednotlivým čidlům. Proto pokud jdete do parazitně napájené 1-Wire sběrnice, pro jistotu se držte přímé topologie (Line), anebo s co nejkratšími přípojkami k čidlům (Bus).

Zároveň mám ale od kolegů a diskutérů pod článkem pozitivní zprávy o topologii Star i Tree v třídrátové verzi (tj. normálně napájené přes VCC) 1-Wire sběrnice. Takže máte-li k dispozici alespoň tři vodiče, nemusíte si zřejmě s tou topologií tak lámat hlavu. Prostě to zapojíte jak to vyjde, a kdyby to zlobilo, pořád je možné ustoupit od Star/Tree k Bus/Line.

Výsledek, ke kterému zhruba směřujeme

Pro stavbu digitálního termostatu navrhuji použít platformu Arduino, neboť ještě nedávno nabízela nejlepší poměr výkon/cena, nejlépe podporovala 1-Wire a další sběrnice, displeje, dotykové vrstvy a další potřebné věci. Dalším důvodem je, že jsem se s Arduinem poprvé pořádně potkal právě v roce stavby termostatu, a tak dle pravidla „držíte-li v ruce kladivo, všechny problémy vám naráz připadají jako hřebíky“ jsem měl pocit, že Arduino je na termostat to pravé ořechové.

Dnes (jaro 2015) se situace prudce mění díky přílivu superlevných ARM mikrokontrolérů a celých počítačů, takže je docela pravděpodobné, že by bylo lepší nová řešení stavět na nově dostupných součástkách, nicméně tento článek odráží dvouletou historii mého termostatu a popisuje skutečně osvědčené řešení na bázi Arduina (dvě zimy mi bezchybně topí a celoročně poskytuje teplotní grafy). Bez vytáček prozradím, kde jsem narazil na limity platformy a naznačím možná lepší řešení – proto níže uvedené součástky zatím raději neobjednávejte, dokud si nebudete jistí tím, že přiznaná omezení nejsou pro vás nepřekonatelnou překážkou.

Klasické Arduino UNO jako zástupce platformy

Mikrokontrolér ATMEGA328p, který je srdcem mnoha Arduin, je z dnešního pohledu vpravdě minimalistický – nabízí 8bitový procesor (dnes frčí 64bitové), 32 kB flash paměti pro program (tj. milionkrát méně než běžný mobilní telefon), 2 kB RAM pro proměnné (opět milionkrát méně než dnes běžný smartphone), ale na druhou stranu je mimořádně cenově dostupný (za méně než padesátikorunu), nabízí až 22 GPIO (programovatelných vstupně-výstupních) pinů, širokou podporu přídavného hardware (displeje atd.) a především mohutnou podporu komunity. A navíc na daný úkol téměř v pohodě dostačuje.

Pravda je, že by se hodilo víc flash paměti pro program, jak uvidíme v příštím dílu popisujícím softwarovou výbavu. Arduino sice nabízí i typ MEGA s mikrokontrolérem ATMEGA1280 se 128 kB flash paměti (případně MEGA2560 s 256 kB). Ten je ale řádově dražší a navíc docela velký do krabičky na obývákové zdi. Cenově rozumným krokem by byl skok až na ARM, ale nemám to v praxi ještě vyzkoušeno (přestože se mi už dva různé ARMy po 80 Kč od Vánoc krčí v rohu šuplíku), takže článek se bude dál držet popisu stávajícího funkčního termostatu a nechám na odvaze/úvaze každého čtenáře postavit termostat s lepším procesorem.

Na Arduino můžete nasadit mnoho rozšíření, např. síťový shield

Arduino je platforma, která umožňuje stavebnicovým způsobem zkompletovat mnohá zařízení bez potřeby pájení. V úvodu seriálu jsem zmínil, že by šlo termostat postavit i bez páječky. Skutečně je možné koupit Arduino UNO (či Arduino MEGA), síťový „shield“ (zažitý název pro HW rozšíření Arduina, který se mu zasune na záda jako štít) a shield s displejem a bylo by téměř vystaráno. Pro otestování vhodnosti platformy a odladění software by to sice bylo ideální, 5+ cm vysoký sendvič by ale nebyl zrovna vhodný pro zabudování do krabičky. Proto v dalším textu budu popisovat „produkční variantu“ termostatu, kterou jsem se snažil miniaturizovat. Ta se už bez pájení neobejde.

Arduino Mega s nasazeným displej shieldem

Co tedy budeme na stavbu internetového pokojového termostatu potřebovat? Tak především samotný mikrokontrolér. Místo klasického Arduino UNO, které je poměrně velké a neskladné, jsem pro finální realizaci použil jeho zmenšenou verzi zvanou Pro Mini, dostupnou už za padesátikorunu. Na své desce obsahuje vše potřebné včetně regulátoru napětí, takže funguje od 5 do 12 V.

Pro Mini, čínský klon taiwanské kopie (nebo naopak?)

Dále musíme termostatu zařídit konektivitu do LAN, na což použijeme ethernetový modul. Asijské tržnice dávají na výběr ze dvou nejběžnějších řešení – jedno s čipem 28J60 a druhé s W5100. Pro tento projekt určitě použijeme modul s čipem Wiznet W5100, protože obsahuje TCP/IP implementaci přímo ve svém hardware a tak jsou obslužné rutiny v Arduinu mnohem kratší. Navíc se po internetech říká, že řešení s W5100 jsou výrazně stabilnější než s 28J60, a to je u termostatu důležitá vlastnost – přece jen by bylo hloupé přijít večer z práce do vymrzlého domu jen proto, že zase vytuhla komunikace přes ethernet.

Klasický Ethernet shield pro Arduino

Místo klasického ethernet shieldu pro Arduino Uno použijeme jiný, co nejmenší, velikostí se hodící k Arduino Pro Mini. Čip má stejný (Wiznet W5100) a dá se koupit už za 150 Kč.

Nahoře nový malý modul ethernetu z AliExpress, pod ním TFT displej ze šuplíkových zásob

Další klíčovou součástkou je displej. Na tržišti se mi před lety podařilo koupit poměrně levný (tuším kolem stokoruny) plně barevný TFT LCD displej s pěkným rozlišením 220×176 bodů a dotykovou vrstvou. Měl ale nešikovně vyvedené kontakty na tenké vlající fólii, křivě připájené unaveným čínským dítětem. Celé to hrozilo utržením, tak jsem mu musel vytisknout na 3D tiskárně jakési plastové lože, abych ho trochu stabilizoval.

Displej s dotykovou vrstvou, který jsem použil na termostat

Dneska jsou displeje rozumně na jedné desce včetně konektoru, a také s jemnějším rastrem – běžně 320×240 bodů. Až si budete kupovat svůj, zaměřte se na to, aby měl SPI komunikační rozhraní. Většina displejů má datové rozhraní paralelní, na což je poté potřeba vyhradit 16 i více GPIO pinů mikrokontroléru, které by nám pak mohly chybět jinde (pokud tedy vámi zvolený mikrokontrolér nebude mít třeba 40 GPIO – pak by nebyl problém 20 obětovat jen na displej). Displeji připojenému přes SPI rozhraní stačí 5–6 pinů, přičemž tři z nich se ještě sdílí s ethernetem, takže Arduinu zbyde dostatek pinů na další hrátky.

Displej ze šuplíkových zásob zezadu ukazuje piny pro SPI rozhraní, slot na SD kartu je bonus navíc

Když se podaří koupit displej přímo s dotykovou vrstvou, je vyhráno. Uživatelské ovládání termostatu pak může být stejné jako na chytrém telefonu či tabletu, na což jsou lidé dnes nejvíce zvyklí. Navíc není potřeba řešit žádná mechanická tlačítka či jiné ovládací prvky, a krabička i celý hardware se tím zjednoduší. Pokud se nepodaří koupit displej s dotykovou vrstvou, stále není prohráno. Je možné koupit dotykovou vrstvu zvlášť, třeba z Nintenda DS (taky na tržnici, za 60 Kč), a tu nalepit přes displej, nebo také bokem od něj, pokud ji použijeme třeba jako ovládací kříž plus posuvník (který pod průhlednou dotykovou vrstvu můžeme vytisknout na papír). Dotyková vrstva se k mikrokontroléru připojuje dalšími čtyřmi piny: dva stačí digitální, ale další dva musejí být analogové, tak na to pozor při plánování rozvržení jednotlivých GPIO pinů.

Modul zálohovaných hodin reálného času, který jsem v termostatu nepoužil

Další logicky očekávanou součástkou v termostatu by byly zálohované hodiny reálného času, aby při případných restartech mikrokontroléru (třeba po upgrade řídicího programu), anebo dokonce po výpadcích napájení nebylo nutné nastavovat čas znovu. Na tržnicích jsou dostupné velmi levné (20 korun) a velmi přesné moduly hodin reálného času (vyhledávat frázi DS3231), ale v mém termostatu jsem se rozhodl pro jiné řešení. Protože si potrpím na opravdu přesný čas, využil jsem toho, že termostat má konektivitu do sítě, a naprogramoval jsem mu čtení času NTP protokolem. Termostat si tak synchronizuje svůj čas každých pět minut s domácím serverem, kde mi běží NTP démon, a díky tomu mám nejen na setiny sekundy přesný čas, ale navíc automatickou změnu času z letního na zimní a naopak (tuto změnu jsem vlastně musel naprogramovat bokem, to NTP bohužel nezařídí, ale doplnil jsem to k té NTP synchronizaci).

Teď už máme všechny hlavní součásti termostatu pohromadě. Zbývá doplnit pár nutných drobností. Jelikož jsem se rozhodl provozovat mikrokontrolér na 5 V (což je u většiny původních Arduin standardní napájecí napětí), musel jsem zapojení doplnit o zdroj napětí 3,3 V pro obvody, které jsou mladší než Arduino a tak už jsou určené pro modernější 3,3 V napájení (v mém případě jak ten malý ethernetový modul, tak i displej). Použil jsem běžný lineární regulátor LM1117, který z 5 V vyrobí 3,3 V. Další nutná součástka je převodník logických úrovní z 5V TTL na 3,3V CMOS na datových linkách mezi Arduinem a displejem. Na to jsem použil integrovaný obvod CD4050. Ethernetový modul s W5100 převod logických úrovní naštěstí nepotřebuje – přestože je napájen nižším napětím 3,3 V, jeho datové vstupy jsou tzv. 5V tolerantní, tj. snesou i vyšší než napájecí napětí.

Je zřejmé, že kdybych si na začátku koupil pomalejší Arduino, které umí běžet na 3,3 V, ušetřil bych si ten převodník logických úrovní, ale zas bych čelil jiným výzvám (např. parazitní 1-Wire sběrnice bude na 3,3 V nejspíš ještě zranitelnější než na 5 V). Až si budete kupovat displej, pozorně zkoumejte, vyžaduje-li také 3,3 V napájení i konverzi napěťových úrovní datových vstupů či ne. Mám doma různé 4 displeje a u každého je tomu zcela jinak. Pokud by se vám podařilo pořídit displej s 5V tolerantními vstupy, převodník by nebyl potřeba. A naopak – pokud si pořídíte mikrokontrolér ochotný běžet na 3,3 V (například Arduino Pro Mini na 8 MHz, či většina ARM mikrokontrolérů) a i displej jede na 3,3 V, je lepší provozovat celý termostat na 3,3 V a opět si ušetřit ten převodník logických úrovní na datových linkách.

Všechny potřebné součástky (bez displeje): čidla teploty, převodník úrovní, regulátor napětí, čidlo vlhkosti DHT11, mikrokontrolér a modul ethernetu, z pod kterého čouhá fotorezistor

Mechanická konstrukce je opět sendvič o rozměrech 6×8 cm, kdy vepředu celou plochu zabírá displej, ke kterému je zezadu připojena deska se součástkami na obou stranách. Výsledné zapojení termostatu bylo realizováno na univerzální desce, což na fotkách nevypadá úplně dobře. Nutno ale říci, že v průběhu stavby se to mimořádně osvědčilo, jelikož bylo možné operativně měnit zapojení, když jsem narazil například na problémy s resetem ethernet modulu po startu mikrokontroléru. Proto také vlastně neexistuje žádné regulérní schéma celého termostatu, neboť to vznikalo tak nějak živelně a z hlavy se přenášelo rovnou do ohnutých a připájených drátků. Dlužno dodat, že i přes diskutabilní vzhled celého zapojení je výsledek zcela robustní a stabilní. Samozřejmě s nabytými zkušenostmi bych dnes volil postup schéma → návrh plošného spoje → výroba plošného spoje → osazení plošného spoje → paráda, ale takto je možno postupovat jedině poté, co si celé zapojení nejdřív odzkoušíte a odladíte bokem na nepájivém kontaktním poli. To by ale vyžadovalo mít i Arduino UNO, jeho ethernet shield a displej shield, které jsem neměl a proto jsem tento krok přeskočil a vyvíjel rovnou finální verzi na plošném spoji.

pohled na desku z opačné strany, než bude displej

Díky dostatku volných GPIO pinů bylo možné nejen jednoduše připojit vedle výše popsaných HW rozšíření i dvě 1-Wire sběrnice (vnitřní a vnější), ale navíc jsem přidal na další pin i jiné čidlo teploty+vlhkosti DHT11. Záměrem bylo měřit kontrolně teplotu přímo v místě termostatu (tj. 150 cm nad zemí, jako to mají komerční termostaty) a především mě zajímala vlhkost, která je důležitým parametrem ovlivňujícím nejen tepelnou pohodu, ale i kvalitu života v bytě. A protože ještě zbývaly volné piny a Arduino pořád mělo čas dělat něco navíc, doplnil jsem zapojení ještě o další vymoženost – fotorezistor monitorující úroveň okolního světla. Termostat tak může řídit intenzitu podsvícení TFT LCD, aby za slunečného dne zářil na max, zatímco v noci při sledování TV displej termostatu pohasne a nikoho neruší. Na to je tam ten očividně dodatečně dobastlený MOSFET 3310GH, který řídí proud LED podsvícením displeje díky PWM signálu z Arduina.

kompletní sendvič, dole už je i displej

A málem jsem zapomněl na to nejdůležitější – spínání samotného kotle! Na to jsem po delší úvaze použil modul samostatného relé (opět z tržnice za sympatickou cenu tří desetikorun), které jsem umístil k plynovému kotli na jeho řídicí vstupy, kde si kotel nechává spínat přímo živé napětí 230 V. Modul relé má na sobě tranzistor (a velmi často mívá dokonce i optický oddělovač), takže jsem ho připojil přímo ke GPIO pinu Arduina zcela bez obav. Jak jsem psal už dříve, mám velmi neSmart kotel Protherm Medvěd, který buďto jen topí na max, nebo netopí vůbec. Proto mi stačí ovládat jen jediné relé jedním výstupem mikrokontroléru.

krabička ve sklepě, která ukrývá relé pro spínání kotle

K propojení mezi termostatem v obýváku a relé ve sklepě jsem s výhodou využil CAT5 síťový kabel i s RJ45 koncovkami. Kromě signálu pro sepnutí kotle jsem po sousedních vodičích poslal do sklepa i 1-Wire sběrnici a opačným směrem pak termostat ze sklepa napájím. A abych měl 99,999% SLA uptime, nenapájím termostat přímo z elektrické sítě, ale přes moji DC-DC UPS, což není nic jiného než doma vyrobený akupack/powerbanka (kterých se dnes prodávají v každém supermarketu přehršle a za rozumný peníz).

Ručně udělaná „powerbanka“

Díky tomu termostat jede i při výpadku elektřiny a dál měří teploty a spíná kotel (který sice bez elektřiny netopí, ale to by případně vyřešila UPS pro jeho elektroniku zapalování a oběhové čerpadlo).

Výsledné zapojení všech pinů Arduina je tedy následující:

  • 0 – TX sériového portu – v termostatu nepoužito
  • 1 – RX sériového portu – v termostatu nepoužito
  • 2 – vnitřní 1-Wire sběrnice s pull-up rezistorem 2k2
  • 3 – vnější 1-Wire sběrnice s pull-up rezistorem 1k
  • 4 – čidlo vlhkosti DHT11
  • 5 – řídí intenzitu podsvícení displeje PWM signálem přes MOSFET
  • 6 – spíná relé pro topení v kotli
  • 7 – D/C pin displeje
  • 8 – RESET pin displeje
  • 9 – CS pin displeje
  • 10 – SS signál pro ethernet
  • 11 – SPI sběrnice: MOSI (mikrokontrolér zapisuje)
  • 12 – SPI sběrnice: MISO (mikrokontrolér čte)
  • 13 – SPI sběrnice: SCK (takt)
  • A0 – ovládání X dotykové vrstvy
  • A1 – ovládání Y dotykové vrstvy
  • A2 – čtení X dotykové vrstvy
  • A3 – čtení Y dotykové vrstvy
  • A4 – I2C sběrnice – v termostatu nepoužito
  • A5 – I2C sběrnice – v termostatu nepoužito
  • A6 – v termostatu nepoužito
  • A7 – čte napětí z napěťového děliče s fotorezistorem

Tímto je více méně dáno celé schéma zapojení, které nakreslené bohužel nemám. Jednoduše by se dalo říct, že piny Arduina č. 10–13 vedou k modulu ethernetu, piny 7–9 a 11–13 vedou do displeje přes převodník logických úrovní CD4050, piny A0-A3 vedou k dotykové vrstvě (součástí rozhraní mého displeje), pin 4 je připájený k DHT11 na desce, pin 5 vede na gate P-MOSFETu a ostatní piny jsou vyvedeny na různé vstupně-výstupní konektory na desce. Jak vidno, Arduinu ještě zbývá pět volných vstupů (2 digitální + 3 analogové) nebo čtyři digitální výstupy, takže kdyby měl termostat ovládat víc spotřebičů (nebo chytřejší kotel), není problém.

Dalším, velmi důležitým úkolem, bylo uzavřít termostatické hnízdo plné drátků do nějaké pěkné krabičky. Jelikož jsem byl zrovna na vzestupné vlně nadšení z 3D tisku a nové 3D tiskárny, vymodeloval jsem v OpenSCADu pečlivě krabičku přesně na míru danému sendvičovému řešení. Krabička obsahuje uvnitř trojici kolejniček, kde do nejspodnější se zasouvá univerzální deska s Arduinem a dalšími obvody, do prostřední kolejničky se zasouvá displej a do nejhořejší kolejničky se zboku zasouvá samotný přední kryt displeje. Je to poměrně složitá konstrukce, která ale přesně pasuje a mechanicky všechno nádherně drží.

Vizualizace krabičky pro termostat v OpenSCADu

Vytištění této krabičky se ukázalo být úkolem pro mimořádně trpělivé. Zkoušel jsem to pořád dokola několik dní v kuse, postupně ladil různé parametry tisku, vyplýtval na to větší než malé množství plastu, elektřiny a nervů. 3D tisk na RepRap Air je skutečně neopakovatelný zážitek – i v tom smyslu, že málokdy se podaří zopakovat výsledek z minula.

3D tisk je ještě potřeba trošku „vychytat“

Nakonec se to ale povedlo myslím dostatečně dobře na to, abych mohl výsledek přišroubovat na zeď obývacího pokoje a zvědavým dotazům návštěv odpovídat bez uzardění a téměř s hrdostí. Čtenářům bych nicméně po této anabázi asi spíš doporučil navštívit web zaměřený na prodej plastových konstrukčních krabiček a najít si tam nějakou vhodnou velikost, do které se výsledná konstrukce s rezervou vejde.

Příště si popíšeme software, který dnes postavený hardware oživí.

root_podpora

P.S. Pokud někoho mimořádně zajímá ten lepidlem přilepený IO zezadu na RJ45 transformátoru mého ethernetového modulu, tak se jedná o dodatečnou opravu chyby na ethernetové desce. Ta chyba v podstatě znemožňuje sdílení SPI sběrnice s jiným zařízením (protože Wiznet W5100 pořád drží MISO datovou linku, i když s ním zrovna nikdo nemluví). Protože jsem původně plánoval z displeje i číst, musel jsem strašným hackem opravit tu chybu v zapojení ethernetu – přeškrábal jsem cestičku na plošném spoji k signálu SEN W5100 a s pomocí hradla v IO 4011 znegoval signál od CSC (čip select). Popis problému a jeho řešení je v Aplikačních poznámkách k W5100, které teď zmizely z Internetu, takže na ně nemůžu odkázat. Je pravděpodobné, že u dnešních W5100 modulů už není potřeba takto hackovat.

P.P.S. Ano, v roce 2013 jsem na Wiznet přilepil malý hliníkový chladič. Když jsem v roce 2015 termostat rozdělal, našel jsem chladič napůl sjetý dolů a připravený zkratovat vnitřnosti – tak jsem ho zahodil. Ten čip W5100 sice na dotek docela hřeje, ale ustojí to i bez chladiče.

Byl pro vás článek přínosný?

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.