Fűtésvezérlő

A hőmérséklet szabályozására a fűtési szezonban legegyszerűbb esetben egy termosztátot használunk, ami megfelelő helyre van elhelyezve a lakásban és amikor szükséges, akkor bekapcsolja a fűtést, ha meg nincs rá szükség, akkor kikapcsolja. Ezzel azt érjük el, hogy közel állandó hőmérséklet lesz a lakásban és nem fűtjük túl, azaz nem fűtünk feleslegesen, pazarolva a drága energiát. Ez lehet egy egyszerű mechanikus termosztát, vagy valamilyen időprogrammal ellátott drágább készülék.

Ha nem lehet optimálisan elhelyezni egy darab termosztátot, akkor lehetőségünk van radiátor-termosztátok felszerelésére, amelyek minden helyiségben egyedileg beállíthatók és ezzel biztosítani tudjuk, hogy mindenhol olyan legyen a hőmérséklet, amilyet szeretnénk.

Bonyolultabb esetben több körös fűtési rendszerünk van, mindegyikhez külön keringető szivattyúval, amely fűtési körönként más-más (vagy éppen azonos) hőmérséklet beállítását teszi lehetővé, illetve akár le is kapcsolhatunk olyan köröket, ahol épp nincs szükség a fűtésre – mert mondjuk nem használjuk azokat a helyiségeket, és csak temperáló fűtést akarunk biztosítani. Ez általában persze nagyobb épületeknél fordul elő, ahol az energiamegtakarítás már az egyik fő szempont. Ja, és az sem mellékes, hogy az adott fűtési körben lévő termosztátokat helyben ne lehessen babrálni, nehogy valaki szórakozásból vagy véletlenül feltekerje a hőmérsékletet negyvenkét fokra. Na ezzel kezdődött.

Az alap rendszer a következő:

Több fűtési kör vezérlésére szolgáló termosztát. A hőmérők vezetékes kapcsolattal csatlakoznak a központhoz, a központ pedig szintén vezetékkel kapcsolódhat egy számítógéphez. 8 fűtési kört lehet vele vezérelni. A célhőmérsékletet csak a központból lehet beállítani, a végpontoknál nincs állítási lehetőség. Időprogramok futtatására is van mód, hogy a napszaknak és az igényeknek megfelelően változtatni lehessen a célhőmérsékletet. Továbbá letapadásgátló időzítést is be lehet állítani, azaz ha egy adott fűtési körhöz tartozó keringető szivattyú hosszú ideig nem kapcsol be – mert nincs rá szükség – akkor a rendszer meghatározott időközönként automatikusan bekapcsolja azt egy rövid időre, mintegy megjáratja kicsit. A rendszer számítógép nélkül, önállóan is működőképes, a számítógépen csak beprogramozzuk a kívánt paramétereket, a központ pedig a memóriájába eltárolja azokat.

Nyilván ehhez hozzátartozik, hogy a kazán is szabályozható, azaz csak akkor működik, amikor szükséges, nehogy olyan helyzet álljon elő, amikor minden szivattyú áll, mert már mindenhol elértük a célhőmérsékletet, de a kazán tovább fűt, mert akkor felforralná a vizet vagy valami még rosszabb, szóval ha mondjuk fatüzelésű a kazán – ami csak korlátozottan szabályozható – akkor biztosítani kell egy olyan ágat, ami fel tudja venni a felesleges hőt a kazántól, mondjuk egy megfelelő méretű puffertartály jó megoldás lehet erre a célra, vagy egy, a többitől függetlenül működő további fűtési kör, amely mondjuk egy csőtermosztáttal a kazán hőmérsékletét veszi figyelembe és nem a hozzátartozó helyiség hőmérsékletét nézi.

Felmerülhet a kérdés, hogy minek kell vezetékes rendszer, miért nem vezeték nélküli kommunikáció van a hőmérők és a központ, illetve a központ és a számítógép között? A mai világban, ugye. Azért, mert ez a legmegbízhatóbb. Senki-semmi nem fogja akár véletlenül leárnyékolni a hőmérőket, megakadályozva ezzel a kommunikációt. Továbbá így nem kell a hőmérőknek helyi tápellátást biztosítani, a központból is meg lehet táplálni őket. Na. A továbbiakban a technológiai részletek következnek, ennek elolvasását csak saját felelősségre javaslom 🙂

Szóval kell valami vezérlő, ami összegyűjti az adatokat a hőmérőktől és a memóriájában tárolt információknak megfelelően kapcsolgatja a keringető szivattyúkat. Ez természetesen egy mikrokontroller, és mivel én legtöbbet Microchip PIC kontrollerekkel foglalkoztam, ezért ebben a készülékben is egy ilyen van. Nem beszélve arról, hogy ennek a kontrollernek ingyenes a fejlesztőkörnyezete és a fordító is ingyen van, igaz csak optimalizáló nélkül – de majd kézzel optimalizálunk, ha kell 🙂

A végpontok is tartalmaznak egy-egy kisebb kontrollert, amelyek helyben feldolgozzák a mért értékeket és RS485 buszon keresztül továbbítják a központnak az adatokat. Erre a buszos megoldásra azért volt szükség, mert a hőmérők adott esetben elég messze lehetnek a központtól, akár több száz méter vezeték is lehet közöttük. Az RS485 pedig elég stabil, akár 1200 méternyi vezeték is lehet a központ és a legtávolabbi végpont között.

Az első programokat még assembly-ben írtam, de a központ esetében hamar áttértem C-re, mert abban azért sokkal könnyebb bizonyos dolgokat kézben tartani, illetve sokkal áttekinthetőbb lesz az egész. Habár a végpontok működtető programja továbbra is assembly-ben van, mert az a program sokkal egyszerűbb, mint a központé. Na mindegy, a fanatikusok továbbra is assembly-ben programoznak, vagy egyből gépi kódban mint tudjuk 🙂

Szóval minden végpontban van egy digitális hőmérő (DS1820 típus) ami normál tápellátást kap és az adatvonalán egy 4,7K-s felhúzó-ellenállás leledzik. Ezt a hőmérőt a helyi kis kontroller lekérdezi, aztán a mért adatot eltárolja a memóriájában. Majd, ha kérés érkezik a központtól, akkor elküldi válaszként az információt az adatbuszon keresztül. Tehát ez egy aszinkron rendszer, kérés-válasz alapon működik. A központ a mester, a végpontok a szolgák. A DS1820 alapból egy 0,5 °C pontosságú hőmérő cél IC (-10 és +85 °C között), ami elég jó erre a célra, ennél pontosabb szabályzásra általában nincs is szükség egy fűtési rendszer esetében.

Ez a fajta hőmérő egyedi gyártási azonosítóval rendelkezik és 1-Wire kommunikációt használ. Az egyedi azonosító miatt elvileg több ilyen hőmérő is csatlakoztatható párhuzamosan a 1-wire buszra. Lekérdezéskor elküldjük ezt az azonosítót, ezzel megadjuk, hogy éppen melyik szenzor adataira vagyunk kíváncsiak és csak az az egy szenzor fog nekünk válaszolni. De a mi esetünkben ez nem számít, mert csak egy darab lesz használva minden végpontban. Ennek ellenére az első program még olyan volt, hogy használta ezt az azonosítót, hátha valami okból kifolyólag később mégis több hőmérőt kéne csatlakoztatni, mondjuk mert több különböző magasságban kéne megmérni a hőmérsékletet. Később aztán egyszerűsítettem a programot és kivettem ezt a részt, mert nem merült fel ennek az igénye, maga a hőmérő pedig az azonosító használata nélkül is kiolvasható – de így persze csak egy darab hőmérő használható egy 1-wire buszon. A lekérdezés nem bonyolult, csak tartani kell az időzítéseket amit a hőmérő adatlapja megad.

A végpontoknak egyedi címe van természetesen, ami egyelőre fixen be van égetve a kódba – ez persze hiba olyan szempontból, hogy a későbbi esetleges cserét megnehezíti. Ha nekiállok az új verziónak, akkor ezt olyan módon fogom orvosolni, hogy állítható legyen, mondjuk úgy, hogy három nem használt digitális I/O portlábat bemenetnek felprogramozva bekapcsoláskor beolvassa a program, hogy mi van a portlábakon, magas, avagy alacsony szint és ezzel meghatározza a saját címét. Vagy esetleg időnként ellenőrzi a címet, mert hátha valami külső elektromágneses zavar miatt esetleg átíródik egy vagy több memóriacella, akkor megváltozhat a cím. Az állítás pedig úgy történhet, hogy a portlábakat magas, vagy alacsony szintre húzom kívülről ellenállások segítségével, amiket forrpad-ekkel lehet rákötni a lábakra. Azért nem jumperekkel, mert a jumperek idővel korrodálódhatnak, ami bizonytalan érintkezést okozhatna, akkor pedig hibás címet kaphatnánk. Ugye pillanatnyilag nyolc végpontot tud kezelni a központ, így három lábbal címezhető is a végpont digitálisan. Vagyis, igazából kilenc végpontot kérdezget le a központ, de ezt majd később.

Úgyhogy a végpont kontrollere időnként lekérdezi a hőmérő szenzort, aztán a belső UART perifériáját használja az RS485 illesztő áramkörhöz, plusz egy digitális I/O portot az illesztő vezérléséhez, hogy az éppen vételi, vagy adás állapotban legyen. Folyamatosan figyeli az RS485 buszon a kommunikációt. Ha olyan üzenetet kap, ami tartalmazza a saját címét, akkor arra válaszként elküldi az utoljára kiolvasott értéket. Mivel bármikor jöhet kérdés a központtól, ezért az RS485 kommunikáció – illetve a belső UART modul megszakítást generál, mert a központ várja a választ és ilyenkor nem időzhetünk a hőmérő kiolvasásával. Tehát mindig az előző letárolt értéket küldi el a végpont, de mivel az összes végpont lekérdezése általában percenként egyszer megtörténik, így nagy eltérések nem jöhetnek létre, egy perc alatt nem számítunk arra, hogy drasztikusan megemelkedne vagy lecsökkenne a hőmérséklet egy fűtési körben és hirtelen kapcsolni kéne. Jól van, persze lehet, hogy éppen valaki szellőztet és gyorsan csökken a hőmérséklet, de akkor is erről legkésőbb egy perc múlva tudomást szerzünk.

Ja és arra az esetre, ha netán teljesen beakadna a program, a belső watchdog áramkör is aktiválva van, ami ha nem kap megfelelő időnként egy jelet, akkor a számlálója túlcsordul és reset-et generál.

A hőmérő szenzor a dobozon kívül egy pici hűtőbordára van szerelve, annak érdekében, hogy minél gyorsabban átvegye a környezeti levegő hőmérsékletét. Habár így utólag belegondolva ez majdnem felesleges, ha megfelelő szellőző csatorna van a dobozon, akkor belülre is lehet szerelni, hiszen a többi áramköri elem melegedése olyan kismértékű, hogy gyakorlatilag nem befolyásolja a külső levegő hőmérsékletének mérését. Maga a doboz pedig csavarral vagy tartófüllel rögzíthető a falra.

A dobozon belül négy vezetéket kell bekötnünk, kettő az RS485 kommunikációé, kettő pedig a központtól jövő tápellátásé, ez polaritás-védett, ha véletlenül fordítva kötnénk be a vezetékeket, akkor a végpont egyszerűen nem fog működni, de nem megy tönkre. Az RS485 vonalak védelmére szupresszor diódák vannak beépítve, ezek szépen kiszűrik a túlfeszültség-tüskéket, ami egy hosszabb vezetéken egy épületben bármikor és bármi miatt előfordulhat.

A kapcsolási rajz nem bonyolult, a tápkör egy polaritásvédő diódával kezdődik, aztán a zavarszűrő kondenzátor után következik egy 78L05 stabilizátor IC, aminek a kimenetén van még egy zavarszűrő és egy pufferkondenzátor. A központ felől a tápvezetéken 12V jön, így még viszonylag hosszú vezeték esetén sem kell – elvileg – attól tartani, hogy nem lesz elegendő tartalék feszültség a helyi 5V előállításához. Az RS485 kör mindegyik ágán van egy 5,5V-os szupresszordióda a már említett túlfeszültségek ellen aztán meg is érkezünk egy LTC485 típusú vonalillesztőhöz. Itt kezdetben SN75176 típusú IC-ket használtam, azonban ezek sokkal érzékenyebbek az esetleges zavarokra és emiatt hajlamosabbak tönkremenni, azonkívül az áramfelvételük is sokkal nagyobb, mint az LTC485-é. A kontroller egy PIC16F628A típusú mikrovezérlő, aminek a 2K programmemóriája bőven elegendő a rövidke kis működtető program tárolásához, továbbá EEPROM-ot is tartalmaz, ahova letárolhatjuk mondjuk a gyártási számot, meg még néhány byte-ot ha kell.

Minden alkatrész normál tokozású, azaz átmenő lábas (habár manapság ez már inkább a retró besorolást érdemelné), így a nyomtatott áramköri lap is egyoldalas lett. Talán majd áttervezem az egészet SMD-re, mert akkor sokkal kisebb lesz. Meg amúgy az áramköri elemek terhelése sem indokolja, hogy ne SMD legyen.

Van még egy kilencedik végpont, ami egy óra IC-t tartalmaz, ezt később építettem kiegészítésként, mert a PIC18F6520-nak nincs ilyen perifériája és amikor felmerült, hogy kellene időprogramokat is futtatni, akkor kellett egy pontos időmérő. A vezérlő dobozába is beletehettem volna talán, de csak nehezen fért volna el, ezért végül ez is külső egység lett. Ebben van még egy CR2032 gombelem is, amely áramszünet esetén biztosítja, hogy az óra-IC tovább ketyegjen.

A központ tehát szép sorban lekérdezi a végpontokat, aztán az órát is és a memóriájában eltárolt idő és célhőmérséklet adatoknak megfelelően kapcsolja a keringető szivattyúkat. Naponta négy időintervallumot és célhőmérsékletet adhatunk meg. Ha valami miatt az óra-végpont meghibásodik, vagy nem válaszol, akkor mindig az első helyen megadott hőmérsékletet veszi figyelembe a rendszer. Egyébként a számítógépen futó programban beállíthatunk egy időzítőt, amely mindig azonos időközönként lekérdezi a központot és az aktuális dátumot, időt, mért értékeket és a keringető szivattyúk állapotát – hogy épp működtek-e a központ szerint, vagy sem – letárolja egy helyi txt fájlba, amit később kielemezhetünk. A számítógépes kommunikáció itt is elsőbbséget élvez, ha a számítógép felől bármilyen adat, vagy utasítás érkezik, az megszakítást okoz és azonnal választ generál. Ezen kívül az LCD kijelzőre minden végpont lekérdezés után kiírja a beolvasott adatokat, valamint LED-ek is jelzik, hogy melyik fűtési kör aktív. Az előlapon található három nyomógombbal pedig beléphetünk egy belső menürendszerbe, ahol változtathatunk a tárolt értékeken.

A központ egy polaritásvédő Graetz-híddal kezdődik (így ha valaki a táp-adaptert véletlenül fordított polaritással kötné be, akkor is működni fog), aztán a szűrőkondenzátor után következik két sorba kötött stabilizátor, egy 12V-os és egy 5V-os. Előbbi a külső egységek és a kapcsoló relék megtáplálásához, utóbbi a belső 5V-ot állítja elő. Az RS485 vonal illesztése hasonló a végpontokéhoz, a túlfeszültség tüskéket szupresszor diódák vágják le, a vonalillesztést pedig egy LTC485 típusú IC végzi. A központi vezérlő maga egy PIC18F6520 típusú kontroller, aminek két UART perifériája van, továbbá belső memória és EEPROM bőven. Az egyik UART interfész felel az RS 485 vonali kommunikációért, a másik pedig egy MAX232 soros porti illesztő IC-n keresztül tartja a kapcsolatot a számítógéppel. Ha készítek új verziót, ezt is áttervezem úgy, hogy inkább egy USB illesztő legyen az RS232 helyett, mert manapság már nincs a számítógépeken (pláne a laptopokon) RS232 és általában csak egy külső USB/UART átalakítóval tud működni ez a kommunikáció. Vagy elcsábulok és hallgatva az új idők szavára Bluetooth vagy Wifi illesztőt teszek bele.

A keringető szivattyúkat 12V-os tekercsfeszültségű relék vezérlik, amiket tranzisztorok kapcsolnak a kontroller kimeneteiről. Az érintkezők 230V/8A terhelést bírnak. Annyiban különleges a vezérlő, hogy fordított módon is használható, mivel a relék váltóérintkezősek, ezért hűtés vezérlésére is felhasználható. Ilyen esetben akkor kapcsolja be a hűtést, amikor a célhőmérsékletet elértük és addig hűt, amíg 1 fokkal alacsonyabb nem lesz a hőmérséklet 🙂 Az előlapon található egy 4×16 karakteres LCD kijelző, valamint három nyomógomb amelyekkel közvetlenül is beállítható minden paraméter, számítógép csatlakoztatása nélkül.

A központ és a végpontok közötti összeköttetést CAT-5-ös hálózati kábel biztosítja, mivel ez eleve tartalmaz négy darab csavart érpárat, így az RS485 busz impedancia illesztése is megoldott. Egy érpáron megy a kommunikáció, a maradék hármon pedig (ki hitte volna) megy a 12V-os tápfeszültség. Az egész rendszer külső 15V-os adapterről kap tápot, ami időnként cserére szorul, mert 24 órában télen-nyáron működik. Nyáron azért kell csak működtetni, hogy a keringető szivattyúk letapadását megakadályozzuk, de ha valaki nem felejti el néhány naponta kicsit kézzel megjáratni a szivattyúkat, akkor akár ki is lehet kapcsolni. Kivéve, ha a hűtést is ezzel a készülékkel szabályozzuk 🙂

Mindkét kontroller programját a Microchip saját fejlesztő környeztetében, MPLAB-ban írtam, a kis kontrollerét assembly-ben, a nagyobbikét C-ben, habár a C-fordító általam használt verziója nem tud optimalizálni, de mivel elég memória állt rendelkezésre, ezért így is simán elfért a bináris kód.

Ma már triviális, hogy egy programozó keretrendszer tudja a színkiemelést, de eredetileg az MPLAB számozott verzióiban egy darabig a kód úgy nézett ki, mintha egy kicsit fejlettebb Notepad-et használnánk, szóval simán fekete-fehér volt minden. Aztán váltottam az MPLAB-X-re és ezzel bejöttek a színek assembly-re is, ezzel pedig sokkal áttekinthetőbbé vált a kód és könnyebb lett a fejlesztés. C-ben pedig tényleg flow-érzés kódot írni benne.

A számítógépes programot QT keretrendszerben, C++-ban írtam, ez a fejlesztőkörnyezet nagyon megtetszett annak idején, mert képes kereszt-platformos fordításra, azaz képes ugyanazt a forráskódot (persze bizonyos megkötésekkel) lefordítani Windows és Linux rendszerre is, sőt MAC-re is. Mondjuk ez utóbbit nem próbáltam, de ki tudja, mikor lesz rá igény 🙂 De nem csak emiatt tetszett a program, hanem annyira interaktív volt, amilyennel még nem találkoztam, a változók és függvények kezelése, valamint a súgó képességei valóban forradalmiak voltak a program megjelenése idején. Na és elég széles támogatás van mögötte, sokan használják, nagy a közösség (az azóta eltelt időben kissé változtak a dolgok, ma már a profi része fizetős).

Lehetne még bővíteni mind a vasat, mind a programot, hogy még több kört tudjon vezérelni, illetve szükség esetén különleges kiegészítők is beépíthetők, mint páratartalom mérő, szélmérő, vagy mondjuk akku-töltöttség figyelő, hiszen megyünk az elektromos fűtések és napelemes rendszerek irányába. És persze nincs olyan program, amit ne lehetne tovább optimalizálni, szinte biztos, hogy ma már másként írnék meg bizonyos függvényeket. Az első verzió 2010 környékén született meg. Talán, ha ma állnék neki, akkor már telefonos alkalmazást is készítenék hozzá, mert hát ugye. Vagy valamilyen Webes megoldáson is elgondolkoznék, hiszen a mai kontrollerek képességeivel szinte már kézenfekvő, hogy ebbe az irányba fejlesszünk.

A teljes készlet

A központi vezérlő

A központ elektronikája

Végpont

A végpont elektronikája

A számítógépen futó program főablaka