středa 18. března 2015

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.

8 komentářů:

  1. Zdravím,
    Chystám se na něco podobného, daly by se od vás získat podklady ke stavbě tohoto zařízení - soupis komponent, blokové schéma a případně zdroják - pro inspiraci?

    OdpovědětSmazat
  2. Dobrý den,

    rád bych se zeptal na to samé, plánuji u rodiču postavit něco podobného, bylo by tedy taky možné pro inspiraci také získat některé podklady. Děkuji

    OdpovědětSmazat
    Odpovědi
    1. Ano, chystám to jako článek pro Root.cz. Dám na G+ a možná i sem vědět, až vyjde.

      Smazat
  3. Zdravím nebylo by lepší použít NodeMcu za 3 dolary? Má to mít 4mb paměti a wifi již integrované, šlo by to na to předělat?

    OdpovědětSmazat
    Odpovědi
    1. odpověď je na www.teploty.info - WiFi teploměr s termostatem, v provozu už skoro rok.

      Smazat
  4. Dobrý den,
    pomocí čidel DALLAS měřím teploty asi na 25 místech v rodinném domku. Jsou ovládána pomocí procesoru PIC fy Microchip. Rozvod je telefonním SYKFY kabelem - 2 páry. Funguje to na vzdálenost asi 30m, dále ne. Čidla jsou napájena,tedy přivádím i +5V na každé čidlo.

    OdpovědětSmazat
  5. Dobrá práce ;-) Doporučuji použít display Nextion, viz Ebay. O grafiku se postará sám a Arduino se může věnovat měření a počítání. Mám s tím výborné zkušenosti.

    OdpovědětSmazat