České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů
Bakalářská práce
Programovatelný termostat k bojleru Jan Šesták
Vedoucí práce: Ing. Martin Novotný
Studijní program: Elektrotechnika a informatika, strukturovaný bakalářský
Obor: Výpočetní technika Květen 2010
Poděkování Děkuji panu Ing. Martinu Novotnému, za pomoc a rady při řešení a tvorbě mé bakalářské práce.
Prohlášení: Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 27.5. 2010
Abstract This bachelor thesis is dealing with realization of programmable boiler thermo regulator, which allows to control heating of water according to weekly temperature curve, and realization of PC program for communication with thermo regulator via serial interface. Thermo regulator is programmed in C language and implemented into microcontroller ATmega32. PC program includes graphic user interface and it is programmed in Java language.
Abstrakt Tato bakalářská práce se zabývá realizací programovatelného termostatu k bojleru, který umožňuje ovládání ohřevu teplé vody podle týdenní otopové křivky, a realizací počítačového programu umožňujícího ovládání termostatu přes sériovou linku. Termostat je naprogramován v jazyce C a implementován do jednočipového mikropočítače ATmega32. Navrhovaný počítačový program obsahuje grafické uživatelské prostředí a je naprogramován v jazyce Java.
Obsah 1.
Úvod..................................................................................................................... 1 1.1. Cíl práce ....................................................................................................... 1 2. Analýza a návrh řešení......................................................................................... 3 2.1. Volba implementační platformy .................................................................. 4 2.1.1. Základní deska MB-ATmega32L ........................................................ 5 2.1.2. Modul LCD displeje a tlačítek ............................................................. 5 2.2. Použití programovacího jazyka.................................................................... 5 2.3. Vývojové prostředí....................................................................................... 5 2.4. Teplotní čidlo ............................................................................................... 6 2.5. Ovládání bojleru........................................................................................... 6 2.6. Návrh řešení termostatu ............................................................................... 7 2.6.1. Měření času. ......................................................................................... 7 2.6.2. Sériové rozhraní. .................................................................................. 7 2.6.3. Tlačítka. ............................................................................................... 7 2.6.4. Otopová křivka..................................................................................... 7 2.6.5. Teplotní čidlo. ...................................................................................... 8 2.6.6. Ovládání obvodu bojleru...................................................................... 8 2.6.7. Nastavení hodnot. ................................................................................ 8 2.7. Návrh komunikace mezi PC a přípravkem .................................................. 8 2.8. Návrh programu pro komunikaci s PC ...................................................... 10 3. Implementace ..................................................................................................... 13 3.1. Návrh programu termostatu ....................................................................... 13 3.1.1. Integrace částí programu.................................................................... 13 3.1.2. Teplotní čidlo ..................................................................................... 14 3.1.2.1. ROM příkazy ............................................................................. 15 3.1.2.2. Funkční příkazy ......................................................................... 16 3.1.2.3. Realizace komunikace................................................................ 17 3.1.3. Modul s LCD displejem a tlačítky ..................................................... 19 3.1.4. Sériové rozhraní RS232 ..................................................................... 19 3.1.5. Otopová křivka................................................................................... 20 3.1.6. Implementace ovládání ...................................................................... 22 3.2. Návrh programu pro PC............................................................................. 22 3.3. Návrh sestavení výsledného přípravku ...................................................... 24 3.3.1. Deska s ovládáním obvodu s bojlerem. ............................................. 26 4. Testování............................................................................................................ 27 4.1.1.1. Testování čítače reálného času................................................... 29 4.1.1.2. Testování teplotního čidla.......................................................... 29 4.1.1.3. Testování programu pro komunikaci ......................................... 29 4.1.1.4. Testování zápisu a čtení dat z EEPROM paměti ....................... 30 4.1.1.5. Testování komunikace mezi termostatem a PC ......................... 30 4.1.1.6. Testování ovládání obvodu bojleru............................................ 30 5. Práce do budoucna ............................................................................................. 31 5.1. Realizace desky pro spínání elektrického obvodu ..................................... 31 5.2. Záložní napájení......................................................................................... 31 5.3. Doplnit termostat o port USB .................................................................... 31
5.4. Monitorování ústředního topení .................................................................32 5.5. Vylepšení programu pro PC .......................................................................32 6. Závěr...................................................................................................................33 7. Návod k používání termostatu............................................................................35 7.1. Instalace termostatu ....................................................................................36 7.2. Ovládání termostatu ...................................................................................36 8. Program pro komunikaci s PC............................................................................39 8.1. Ovládání programu.....................................................................................39 9. Literatura ............................................................................................................43 10. Obsah přiloženého CD ...................................................................................45
Seznam obrázků 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 3.5 3.6 3.7 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 7.1 7.2 7.3 7.4 8.1 8.2 8.3 8.4
Základní deska MB-ATmega32L Modul LCD displeje s tlačítky Příklad příkazu Zapiš data Příklad příkazu Zjisti data Příklad komunikace s teplotním čidlem Úvodní okno programu Okno zobrazující informaci o teplotě Okno pro vzdálené ovládání termostatu Přehled – okno zobrazující nastavení otopové křivky Schéma zapojení přípravku Schéma desky ovládání elektrického obvodu Záznam příkazu WRITE SCRATCHPAD z osciloskopu Schéma příkazu WRITE SCRATCHPAD Záznam příkazu COPY SCRATCHPAD z osciloskopu Schéma příkazu COPY SCRATCHPAD Záznam příkazu CONVERT z osciloskopu Schéma příkazu CONVERT Záznam příkazu READ SCRATCHPAD z osciloskopu Schéma příkazu READ SCRATCHPAD Schéma ovládání elektrického obvodu Schéma zapojení přípravku Tlačítka termostatu Schéma přepínání módů termostatu Úvodní okno programu pro PC Okno zobrazující teplotu vody Okno pro vzdálené ovládání termostatu Okno, které slouží k zobrazení hodnot otopové křivky
3 4 9 9 14 22 22 23 23 25 25 27 27 27 28 28 28 28 29 35 35 36 36 39 39 40 40
Seznam tabulek Tabulka 1.1: Stručný seznam vývojových desek dostupných na trhu Tabulka 2.2: Typy příkazů komunikace po RS232 Tabulka 3.1: Možné příkazy komunikace s teplotním čidlem Tabulka 3.2: Převod teploty
3 9 16 18
1. Úvod Jako téma bakalářské práce jsem si vybral „Programovatelný termostat k bojleru“. K tomuto rozhodnutí mne vedla myšlenka, jak ušetřit energii při ohřevu teplé vody na chatě, kde není k ovládání bojleru používán systém HDO (hromadné dálkové ovládání). Hlavní výhodou nasazení programovatelného termostatu je možnost zadání maximální teploty ohřevu pro týdenní časovou smyčku, čímž lze minimalizovat náklady za elektrickou energii. Na trhu se sice vyskytuje velké množství programovatelných termostatů, bohužel všechny slouží k ovládání topení v obytných prostorách, což znamená, že jsou všechny navrhovány pro práci v teplotním rozsahu maximálně 50°C. Tato teplota je ovšem pro ohřev vody nedostačující.
1.1. Cíl práce Cílem této práce je návrh a implementace zařízení – programovatelného termostatu. Toto zařízení umožňuje zadat týdenní otopovou křivku a podle této křivky ovládat ohřev vody, pomocí spínání elektrického obvodu bojleru. Zařízení obsahuje displej, tlačítka, teplotní čidlo, vývody pro spínání silového obvodu a konektor pro připojení k PC pomocí sériového rozhraní RS232. Na displeji jsou zobrazeny informace o aktuálním dění programovatelného termostatu – v základním módu displej zobrazuje informace o čase, teplotě ohřívané vody a požadované teplotě. Pomocí tlačítek je možné procházet nastavení termostatu a případně změnit nastavení hodin nebo požadované teploty. Jelikož zařízení umožňuje komunikaci s PC po sériovém rozhraní, je součástí tohoto projektu také implementace programu, který nám umožňuje ovládat přípravek z prostředí počítače. Tento program obsahuje grafické rozhraní a k jeho ovládání postačují základní dovednosti uživatele.
1
2
2. Analýza a návrh řešení Tabulka 1.1: Stručný seznam vývojových desek dostupných na trhu
Čip
Název
Cena /Kč
AVR Butterfy
ATmega169
800
MB-ATmega16
ATmega16
1050
MB-ATmega32
ATmega32
1100
MB-ATmega128
ATmega128
1500
PVK 40
PIC16F877
2950
TestPack-78K0S
µPD78F9177AY
2350
Obrázek 2.1: Základní deska MB-ATmega32L
3
Obrázek 2.2: Modul LCD displeje s tlačítky
2.1. Volba implementační platformy Při vybírání přípravku pro implementaci se naskytlo několik možností. Zvolit jednočipový mikropočítač nebo programovatelné hradlové pole FPGA? Implementace pomocí FPGA při použití pouze hardwarových prvků by nám přinesla vysokou rychlost zpracování dat problému, kterou při tomto návrhu ale nedokážeme využít. Navíc by byl tento způsob návrhu zbytečně složitý. Další možností by bylo do FPGA integrovat CPU jádro, tento způsob implementace by byl již lepší, ale při porovnání pořizovacích cen součástek tohoto řešení a cen s použitím jednočipového mikropočítače, bylo i toto řešení vyhodnoceno jako nevýhodné. Výběr přípravku proto směřoval na jednočipové mikropočítače. Na trhu lze najít mnoho čipů různých firem (Intel, Microchip, Atmel, Texas Instrument, …). Pro názornost jsem vybral některé modely a uvedl je v tabulce 2.1. Při výběru jsem zohlednil předchozí zkušenosti s mikropočítači, které jsem získal během studia v předmětech Strojový kód a data (X36SKD), kde jsem se seznámil s modulem AVR Butterfly (Atmel, čip ATmega169), a Mikropočítače (X34MPC), kde byl k dispozici modul PVK 40 (Microchip, čip PIC 18F452). I proto jsem se rozhodoval mezi dvěma největšími výrobci Microchip a Atmel, obě firmy vyrábějí čipy podobných vlastností, které se liší pouze v detailech, z finančního hlediska není mezi modely těchto firem žádný velký rozdíl. Nakonec jsem se rozhodl pro desku s čipem firmy Atmel, kterou jsem našel při procházení již vyrobených vývojových desek. Tato deska navrhnutá firmou PK-Design, lze si ji prohlédnout na obrázku 2.1, je osazena čipem ATmega32A. Výhody této desky jsou přítomnost sériového portu (RS232), 32 I/O výstupů na dvou portech (2x10) a možnost programovat a ladit přes sběrnice ISP a JTAG. Desku je potřeba doplnit modulem s LCD displejem a tlačítky, který lze vidět na obrázku 2.2. Při výběru jsem zvažoval i volbu výroby vlastní desky, kterou jsem nakonec zavrhl kvůli časové náročnosti návrhu desky (seznámení s návrhovým prostředím, různými technikami i způsoby návrhů, stanovení parametrů všech potřebných a efektivních součástek - stabilizátor napětí, převodníky TTL úrovní, registry, rezistory, kondenzátory apod.) a neefektivnosti tohoto řešení, jelikož se zatím jedná pouze o výrobu prototypu. Kdyby byl o takovýto výrobek větší zájem, výroba desky by se již dala zvažovat.
4
2.1.1. Základní deska MB-ATmega32L Na této desce, kterou je možné vidět na obrázku 2.1, je osazen čip ATmega32A, který obsahuje 8-bitový RISC procesor, sériové rozhraní, AD převodník, 32 I/O vývodů, tři paměti (32 kB Flash, 1kB EEPROM a 2kB SRAM) a jeden 16–bitový a dva 8–bitové čítače (každý čítač má svoji vlastní děličku pro nastavení frekvence). Čip nám umožňuje připojit k jednomu 8–bitovému čítači vnější oscilátor a použít ho jako čítač reálného času. K dispozici je také odpojitelné sériové rozhraní, u něhož se čip sám stará o přijímání a odesílání dat. Nevýhoda čipu je, že pokud chceme použít např. vnější oscilátor nebo sériové rozhraní, přicházíme o I/O vývody. Deska dále obsahuje dva konektory pro připojení dalších modulů (CON1, CON2), sériové rozhraní, konektory JTAG a ISP, dva oscilátory a šest konektorů nastavení (JP1 – JP6). Konektory CON1 a CON2 jsou typu MLV20 (2x10). Obsahují v každé řadě piny VCC, P0-P7, GND. Sériové rozhraní se skládá z konektoru Canon 9 a obvodu MAX3232. Na desce lze najít dva oscilátory – hlavní (14,7456 MHz, lze ho snadno nahradit jiným modelem a změnit tím frekvenci čipu) a vedlejší oscilátor (32,768 kHz, který se hodí pro čítač reálného času). JTAG a ISP konektory slouží k programování a ladění přípravku. Konektor JP6 nám umožňuje pomocí propojky výběr napájecího napětí pro mikropočítač a periferie mezi 3,3V a 5V. Pořizovací cena této desky je 1130 Kč.
2.1.2. Modul LCD displeje a tlačítek Tento modul, který je možné vidět na obrázku 2.2, se připojuje k základní desce pomocí kabelu a obsahuje osm tlačítek, piezoelektrický měnič pro generování zvukových signálů, LCD displej 2x16 znaků (BC1602AYPLEH) a trimr pro nastavení kontrastu displeje. Modul lze připojit k základní desce pomocí paralelního rozhraní (14 vodičů) nebo sériového rozhraní (7 vodičů). Při použití dvaceti žilového vodiče je automaticky nastaveno paralelní rozhraní. Sériové rozhraní je povoleno jen v případě, že na pin SDS (1) portu není připojeno +5V a propojka JP1 je rozpojena. Jinak je vždy zakázáno. Pořizovací cena modulu je 570 Kč (deska s tlačítky 390 Kč, LCD displej 180 Kč).
2.2. Použití programovacího jazyka Přípravek je možno programovat použitím programovacího jazyka C nebo pomocí asembleru. Pro řešení svého projektu jsem se rozhodl pro použití jazyka C, tento způsob jsem zvolil kvůli snadnější reakci na případné budoucí problémy a vylepšení, ale také pro případný přechod na jiný druh mikropočítače. Pro realizaci programu pro PC jsem zvolil programovací jazyk Java. Tento jazyk jsem si vybral kvůli znalostem grafického uživatelského prostředí a možnosti přechodu na jiný operační systém.
2.3. Vývojové prostředí Pro implementaci termostatu v přípravku se nejvíce hodí program AVR Studio 4. Toto prostředí je vhodné zejména kvůli možnosti programování přípravku přímo z programu a kvůli testování částí zdrojového kódu. Tento program má totiž přístup k registrům, které jsou v čipu k dispozici. Při použití programovacího jazyka C je potřeba ještě překladač WinAVR.
5
Pro programování přípravku lze použít také program AVR ISP PROG společnosti PK-Design. Tento program nám umožňuje číst, kontrolovat a přepisovat obsah pamětí Flash a EEPROM přípravku. Obsah pamětí je možné pro další použití exportovat do souboru. Pomocí tohoto programu je možné ještě poupravit nastavení přípravku (např. uzamčení pamětí, povolení rozhraní JTAG …). Pro implementaci programu pro PC v programovacím jazyku Java je potřeba mít v systému nainstalovanou verzi Java SE JDK. Pro psaní kódu používám vývojové prostředí NetBeans IDE. K vývoji projektu byly použity aktuální verze programů, které byly uvolněny před zahájením projektu – AVR Strudio 4 , WinAVR 20100110, AVR ISP PROG v. 6.51, Java SE JDK 6u16, Netbeans 6.8.
2.4. Teplotní čidlo Pro termostat k ohřevu vody je potřeba čidlo s teplotním rozsahem 0 – 100 °C. Pří výběru teplotního čidla se naskytly možnosti použití čidla s digitálním výstupem nebo s analogovým výstupem a použití AD převodníku. Jako lepší varianta bylo vyhodnoceno čidlo s digitálním výstupem. Čidla s digitálním výstupem se vyrábějí v následujících provedeních: jednodrátová sběrnice 2 I C sběrnice (1 datová linka, 1 pro hodinový signál) převodník teplota/střída (generuje PWM signál) Pro svůj návrh jsem si vybral teplotní čidlo firmy Dallas Semiconductor (člen společnosti Maxim), které komunikuje přes 1-drátovou sběrnici a má 3 vývody (VDD, zem, data). Toto čidlo je možné napájet klasicky nebo parasitně. Parasitně znamená, že je čidlo napájeno přes datovou linku. Výhodou tohoto zapojení je potřeba pouze dvou vodičů, nevýhody zapojení jsou: potřeba držet datovou sběrnici ve stavu log 1 pomocí pull-up rezistoru s relativně malým odporem, při teplotní konverzi (měření teploty) a ukládání do EEPROM paměti čidla může být odebírán větší proud, nevhodnost pro teploty nad 100°C. Pro tento termostat nejsou tyty nevýhody až tak důležité. Při klasickém napájení čidla jsou sice potřeba tři vodiče, ale není tolik zatěžována datová sběrnice. Během teplotní konverze můžeme kontrolovat stav čidla čtecím pulsem, kdy čidlo vysílá 0, dokud pracuje, nebo 1, pokud čeká na další příkazy. Čidlo umí měřit teplotu v 9-12 bitovém režimu přesnosti, tedy 1-4 bity pro desetinnou část. Pro návrh termostatu pro ohřev vody stačí přesnost na 1°C, proto je dostačující 9 bitový režim přesnosti. Další velkou výhodou tohoto čidla je možnost adresace čidla pomocí 64 bitového unikátního sériového kódu uloženého na čipu, tato adresace umožňuje použití více teplotních čidel na sběrnici. Toto řešení by se dalo použít v případě kombinovaného bojleru (voda je ohřívána pomocí elektrické spirály nebo pomocí ústředního topení), kde by byla kromě teploty vody monitorována také teplota vody ústředního topení – pokud by se topilo v ústředním topení, byl by vypnut elektrický ohřev. Toto řešení nebude zatím implementováno.
2.5. Ovládání bojleru Při návrhu této části musíme zohlednit elektrické parametry navrhovaného termostatu a ovládaného bojleru. Vývojová deska má výstupní napětí U=5V
6
a maximální proud, který lze odebírat z výstupu mikropočítače, je Imax=20mA. Pro bojler známe napájecí napětí UB=230V a výkon PB=2000W, spínaný proud (IB=PB/UB) by tedy měl dosahovat hodnot kolem 8,7 A, proto musí být spínání dimenzováno minimálně na 10A, lepší variantou je dimenzovat na 16A kvůli zamezení překročení maximálních povolených hodnot spínacího prvku a minimalizovaní možnosti vzniku požáru. Při návrhu spínání obvodu s bojlerem je nutno si uvědomit, že se jedná o spínání síťového napětí s hodnotou 230V, proto je potřeba zamezit přístupu k živým částem tohoto obvodu, aby nedošlo k úrazu elektrickým proudem. Pro kontrolu spínacího zařízení je vhodné přidat kontrolku, která by informovala o sepnutí kontaktů.
2.6. Návrh řešení termostatu 2.6.1. Měření času. Programovatelný termostat by měl pracovat samostatně, přičemž musí každou vteřinu provést inkrementaci času a překreslení displeje. Tento proces je možné uskutečnit použitím přerušení vyvolaného při přetečení čítače reálného času (TIMER2/COUNTER OVERFLOW) nebo pomocí přerušení vyvolaného při shodě hodnoty čítače s požadovanou hodnotou (TIMER2/COUNTER COMPARE MATCH). Poslední variantou je kontrolovat hodnotu čítače ve smyčce hlavního programu, tato varianta je ale nevhodná, protože nemusí dojít k inkrementaci času při provádění časově náročné operace. Jelikož je vstupem čítače oscilátor s frekvencí 32,768 kHz a při nastavení děličky na 128 dojde k inkrementaci čítače 256x za sekundu, tedy čítač dosáhne maxima pravidelně po jedné sekundě, je vhodné použít přerušení vyvolaného při přetečení čítače.
2.6.2. Sériové rozhraní. Dalším vstupem termostatu je sériové rozhraní, u kterého je potřeba zajistit co nejrychlejší příjem dat a uvolnění přijímacího registru pro další data. K těmto účelům by se nechalo opět využít přerušení (USART RX Complete). V obsluze tohoto přerušení je potřeba zkontrolovat platnost dat (např. kontrola parity) a uložit je pro další zpracování na „zásobník“. Při zpracování dat ze „zásobníku“ by již nebyla data, která jsme přijali od počítače ohrožena dalšími přenosy. Dále by se přepisu dat nechalo zabránit pozastavením vysílače v počítači, než dojde k potvrzení dat od termostatu.
2.6.3. Tlačítka. Posledním vstupem termostatu jsou tlačítka, ty jsou sekvenčně testována – pokud je tlačítko stisknuto, je nastaven jeho bit (8 tlačítek = 8 bitů), poté vybereme operaci pro právě stisknuté tlačítko.
2.6.4. Otopová křivka. Ukládání hodnot otopové křivky – tyto hodnoty jsou uloženy do paměti EEPROM. Teplota je uložena jako celé číslo a nabývá kladných hodnot do 100°C, proto ji lze zapsat pomocí jednoho bytu a v paměti zabírá pouze jednu adresu. Zatím je navrženo rozlišení s krokem jedna hodina, které zabere 168 bytů paměti
7
(7dní * 24hodin = 168 hodnot), toto rozlišení se mi zdá prozatím dostačující, ale nevylučuji možnost nastavovat kratší úseky (např. 30 nebo 15 minutové). Jelikož paměť EEPROM má kapacitu 1 kB, maximální možné rozlišení v případě týdenního cyklu je nastavovat teplotu pro 10 minutové intervaly (7* 24* 6 = 1008).
2.6.5. Teplotní čidlo. K přípravku bude prozatím připojeno pouze jedno teplotní čidlo, které bude měřit teplotu v bojleru. Kontrola teploty v ústředním topení zatím nebude implementována, bude to možné vylepšení do budoucna.
2.6.6. Ovládání obvodu bojleru. Přípravek spíná topení podle hodnot otopové křivky uložené v paměti, dále by mohl umožnit sepnout nebo vypnout topení nezávisle na hodnotách v programovatelném termostatu. V tomto případě by byla maximální teplota ohřevu stanovena klasickým termostatem bojleru, který také zaručuje vypnutí tělesa při selhání přípravku. Existují dvě možnosti, jak to vyřešit. Jedna z nich je nastavení vyhrazené hodnoty v přípravku, která by umožňovala nastavit tři typy topení (zapnuto, vypnuto, měřit maximální teplotu podle otopové křivky). Druhá možnost je přidat dva vypínače, které by ovládaly vstupy relé. Varianta s přidáním vypínačů je uživatelsky příjemnější, protože nepožaduje změnu nastavení přípravku, ani není potřeba znalost ovládání termostatu pomocí tlačítek. Nevýhoda této volby je, že neumožňuje volbu ovládání z prostředí počítače.
2.6.7. Nastavení hodnot. Na termostatu bude možné provádět nastavení hodin (den, hodiny a minuty) a otopové křivky (nejprve nastavíme interval, ve kterém budeme požadovat novou hodnotu, den a hodina začátku, den a hodina konce, dále nastavíme požadovanou teplotu). Další funkcí je procházení teplotní křivky po jednotlivých hodinách. Pro pohyb nastavení slouží šipky, výběr příkazu bude navržen jako menu nebo jen jako přepínání kontextu. Při nastavování údajů bude pozice aktuálně nastavované hodnoty označena blikajícím kursorem. Více informací k ovládání přípravku je v uživatelské příručce k termostatu v příloze.
2.7. Návrh komunikace mezi PC a přípravkem Tato komunikace je zprostředkována pomocí sériového rozhraní RS232. Tento způsob komunikace nám umožňuje posílat data (5-8 bitů) a paritní bit (0-1 bit). Data jsou posílána nejnižším bitem napřed, po posledním datovém bitu může následovat bit paritní, který nám umožňuje provést kontrolu přenášených dat. Rychlost přenosu je potřeba zvolit tak, aby bylo možné data vysílat v krátkém časovém intervalu, ale také aby bylo umožněno přenášení dat i na větší vzdálenosti a zamezení znehodnocení dat vnějšími rušivými jevy při vyšších rychlostech. Dále je potřeba při volbě rychlosti zvážit počet sekvenčně vysílaných dat a jejich načítání nebo ukládání. Při použití pozastavování vysílače na straně počítače, který čeká na potvrzení každého bytu, nepotřebujeme mít na straně přípravku zaručenu velkou rychlost zpracování dat ani vysokou rychlost přenosu. Nejvíce dat je posíláno pouze z termostatu do počítače, kdy dojde při příkazu zjisti data (zjisti nastavení otopové
8
křivky) k odeslání 168 hodnot otopové křivky načítaných z paměti přípravku a jednoho potvrzení. To znamená, že přenos hodnot nepotřebuje vysokou rychlost. Tabulka 2.2: Typy příkazů komunikace po RS232
Počet vysílaných bajtů ve směru Příkaz
Číslo příkazu
Zápis v hex PC ⇒ termostat
termostat ⇒ PC
Zjisti data
237
0xED
2
169
Zapiš data
222
0xDE
5
4
Zjisti teplotu
203
0xCB
2
2
Zapiš čas
188
0xBC
5
4
OK
253
0xFD
1
0
Chyba
254
0xFE
1
1
Příkaz 0xDE
DATA1 0x25
DATA0 0x03 Potvrzení 0xDE
Potvrzení 0x03
DATA2 0x3C Potvrzení 0x25
OK 0xFD Potvrzení 0x3C
Obrázek 2.3: Příklad příkazu Zapiš data
Příkaz 0xED
OK 0xFD Potvrzení 0xED
BYTE0 0
BYTE 167
Obrázek 2.4: Příklad příkazu Zjisti data
Dalším důležitým prvkem komunikace je bezpečnost. Při přenosu dat může dojít k jejich znehodnocení (chyba na straně přijímače nebo vysílače, rušení okolí), a proto je potřeba umožnit detekci chyb. Jelikož při zadávání hodnot z počítače je použito potvrzování a pravděpodobnost vzniku chyby není velká, lze data zabezpečit paritním bitem, který nám umožňuje detekci lichého počtu chyb a je vypočítán z přenášených dat. Máme na výběr lichou nebo sudou paritu, kdy počet jedniček i s paritním bitem je lichý, respektive sudý. Komunikace má zatím definovány jen čtyři příkazy, jež začínají vždy na straně počítače, který odešle hodnotu příkazu a čeká na jeho potvrzení. Pokud za příkazem následují další data, jsou vysílána postupně a vždy se čeká na příjem potvrzení a kontrolu správnosti, protože se jedná o důležité hodnoty pro nastavení termostatu (otopová křivka, hodiny).
9
V tabulce 2.2 jsou uvedeny možné příkazy komunikace a zápis příkazu v desítkové a šestnáctkové soustavě. Poslední dva sloupce zobrazují počet bytů, které lze při provádění příkazu zachytit na sběrnicích. Pro názornost, jak by mohla komunikace vypadat, přikládám obrázky 2.3 a 2.4, na kterých je zachycena posloupnost údajů. První řádek znázorňuje přenos od počítače k termostatu, druhý naopak přenos od termostatu k počítači. Příkazem „Zjisti data“ vyšle počítač přípravku žádost o poslání informací o nastavení otopové křiky, proto je přenášeno směrem k počítači tolik hodnot (1 příkaz + 168 hodnot této křivky). „Zapiš data“ slouží k nastavení otopové křivky podle hodnot poslaných z programu v počítači. Po příkazu „Zjisti teplotu“ odešle přípravek počítači aktuální teplotu vody v bojleru. Příkaz „Zapiš čas“ slouží k nastavení časových údajů termostatu podle hodnot na počítači. Příkaz „OK“ je vysílán počítačem a znamená, že i poslední potvrzená hodnota byla správná a může dojít k vykonání příkazu, který byl nyní potvrzen. Příkaz „Chyba“ lze zachytit, jak na trase od termostatu k počítači, tak naopak. Tento příkaz dává druhé straně najevo, že přijatá data jsou špatná (nesedí parita, přijatý příkaz není stejný, jako jsme posílali apod.).
2.8. Návrh programu pro komunikaci s PC Pro komunikaci s termostatem je potřeba vytvořit program, který by tuto komunikaci zprostředkoval i lidem, kteří mají pouze základní znalosti práce s PC. Proto je implementace orientována do jazyku Java, který umožňuje jednoduchou tvorbu grafického prostředí, jež by mělo při použití prvků knihovny Swing [7] vypadat na různých operačních systémech stejně. Jelikož způsob ovládání periferních zařízené (v tomto případě sériového portu) pod operačními systémy Windows a Linux (např. Ubuntu) není shodný, je potřeba vytvořit dvě aplikace, nebo jednu aplikaci umožňující výběr prostředí. Problém vzniká například při použití převaděčů USB na RS232 – v systému Windows vzniká virtuální port, který se chová stejně jako sériový, ale na systému Linux jsou odkazy na tento port umístěny mezi odkazy na USB zařízení. Proto se v této práci zaměřím pouze na vývoj programu pod operačním systémem Windows, který je nejvíce používaným systémem. Komunikaci s porty v tomto programovacím jazyce umožňuje použití doplňkových knihoven. Na internetu jsou k nalezení knihovny „Comm“ a „RXTX“. Která varianta je lepší, se ukáže až v samotném návrhu a testování programu. Program bude nejlepší rozdělit do různých částí, oddělit základní parametry programu (výběr portu pro komunikaci) a jednotlivých ovládacích prvků (nastavení hodnot v paměti přípravku, zobrazení nastavených a naměřených hodnot z přípravku, změna času…). Přijímač a vysílač bude nejvýhodnější navrhnout jako vlákna. Tato varianta umožňuje příjem dat i v době, kdy běží vysílač, a měla by zamezit zmeškání dat nebo chybnému čtení. Pro základní nastavení programu, tedy výběr příslušného portu, se jako nejjednodušší možnost pro uživatele nabízí výběr portu ze seznamu, jelikož se jedná o výběr 1 z N, tak se zdá nejvýhodnější varianta použití Check Box okénka.
10
Ovládání lze umístit na jeden formulář, který by mohl obsahovat všechny možnosti – nastavení hodnot pro zadávání otopové křivky, ovládací prvky. Formulář zadávání tedy bude obsahovat pět políček pro nastavení hodnot a čtyři tlačítka pro jednotlivé příkazy. Při stisknutí tlačítka „zadat čas“ by došlo k odeslání dat (aktuální hodnoty počítače – den, hodiny, minuty). Při výběru nastavení otopové křivky by se vypočetly hodnoty, které by byly následně poslány přípravku. Při výběru příkazů „Zjisti teplotu“ nebo „Zjisti nastavení křivky“ („Zjisti data“) by se otevřely nové formuláře. Pro teplotu může být jednoduchý, protože zobrazuje informaci pouze o teplotě. Formulář, který vypisuje aktuální informace o otopové křivce, je složitější, protože zde musí zobrazit 168 údajů. Pokud by byly nastaveny kratší intervaly, vzrost by počet údajů a také doba potřebná k přenesení údajů od přípravku do počítače, kterou lze snížit zvýšením rychlosti přenosu.
11
12
3. Implementace Kapitolu implementace programovatelného termostatu lze rozdělit do tří částí: návrh programu termostatu, implementace programu pro PC a sestavení výsledného přípravku.
3.1. Návrh programu termostatu V této kapitole se zabývám vývojem softwarové části termostatu. Návrh programu je prováděn v programovacím jazyce C, ze kterého vývojové prostředí vytvoří kód v asembleru a program (hexadecimální zápis) pro nahrání do přípravku. Při nahrávání je pak změněn obsah pamětí Flash a EEPROM čipu podle námi zvolených parametrů. Kapitolu bych rozdělil na více části, ve kterých se budu věnovat pouze určitému problému (ovládání teplotního čidla, komunikace po RS232, ovládání modulu s displejem a tlačítky, přerušení…). Nejprve bych shrnul celkový program v podkapitole Integrace částí a poté bych se věnoval jednotlivým částem v dalších podkapitolách.
3.1.1. Integrace částí programu V této podkapitole bych chtěl shrnout výsledný návrh programu, který je nahrán do čipu ovládací desky. Konečný program zahrnuje všechny body návrhu a implementuje je v nejvýhodnější formě pro programovatelný termostat. Při zapnutí přípravku dojde k inicializaci a základnímu nastavení jednotlivých periférií (modul s tlačítky a LCD displejem, teplotní čidlo, komunikace po RS232 a přerušení). Zbytek programu je procházen v nekonečné smyčce, při každém jejím průchodu je zkontrolován „zásobník“ pro ukládání příkazů a dat přijatých po sériové lince. Pokud jsou zde uložena data, které je již možné zpracovat, provede se obsluha tohoto příkazu. V ostatních případech se tato operace přeskočí a přečteme stavy tlačítek. Pokud je nějaké tlačítko stisknuto, dojde k jeho obsluze a piezoelektrický měnič vygeneruje zvukový signál. Vedlo této smyčky program obsahuje dvě přerušení. Jedná se o přerušení vyvolané osmi bitovým čítačem a přerušení signalizující přijatá data ze sériové linky. Přerušení sériové linky. Pokud je vyvoláno přerušení ze sériové linky, dojde ke kontrole těchto dat, a pokud nebyla zjištěna žádná chyba, dojde k uložení dat na „zásobník“. Označení „zásobník“ může být zavádějící, protože se nejedná o systémový zásobník, ale o pole velikosti pěti bytů, do kterého jsou ukládána přijatá data. Jelikož příkazy od počítače jsou maximální délky čtyř bytů, je toto řešení dostačující.
13
Přerušení čítače reálného času. Druhé přerušení, která má vyšší prioritu, je přerušení vyvolané maximální hodnotou osmi bitového čítače reálného času, ke kterému je připojen krystal o frekvenci 32,768 kHz. Čítač má děličku hodinového signálu nastavenou na hodnotu 128, která nám zaručuje dosažení maximální hodnoty 1x za sekundu, a proto je vhodný k použití jako čítač reálného času. Při obsluze tohoto přerušení je provedena inkrementace času, pokud je termostat v normální módu (zobrazení informací), dojde také k překreslení LCD displeje. Každou minutu dojde k přečtení teploty a jednou za určitý interval (např. 15 minut) dojde k přečtení požadované teploty z paměti. Jednou za minutu dojde také k porovnání požadované teploty s naměřenou teplotou, podle kterého dojde k sepnutí nebo rozepnutí ovládacího obvodu relé, připojeného k pinu PD5.
3.1.2. Teplotní čidlo RESET PULS
PRESENC PULS
ROM příkaz
Funkční příkaz
Obrázek 3.1: Příklad komunikace s teplotním čidlem
Pro svoji práci jsem si vybral model DS18B20, který na trh dodává firma Dallas Semiconductor. Čidlo je dostupné ve třech typech provedení pouzder 8-pin SO (150mil), 8-pin µSOP a 3-pin TO-92. Pro svoji práci jsem si vybral provedení TO-92, které se svými rozměry hodí k připájení na kabel. Ostatní modely jsou určeny hlavně pro osazení na deskách plošných spojů. Pouzdro TO-92 má tři vývody – VDD, DQ a GND. Vývod DQ slouží pro čidlo jako vstup i výstup. Datová sběrnice (DQ) je potřeba připojit k napájení (VDD) pomocí pull-up rezistoru (R=4,7 kΩ). Toto teplotní čidlo je možné napájet dvěma způsoby, parasitně (napájeno přes datovou sběrnici DQ, VDD musí být přizemněno) nebo klasickým způsobem. Pro návrh svého obvodu jsem si vybral klasický způsob napájení. Jsou sice potřeba tři vodiče, ale nemůže dojít k výpadku napájení při zápisu do EEPROM paměti nebo při konverzi teploty a není kladen důraz na rychlost nastavení log 1 na sběrnici. Čidlo umí měřit teplotu od -45 °C do 125°C, pro interval od -10°C po 85°C je zaručena minimální přesnost ± 0,5°C. Čidlo je možné nastavit na 9-12 bitový režim měření, tedy 1–4 bity pro desetinnou část. Pro programovatelný termostat ohřevu vody nám plně vystačuje přesnost na celé stupně, větší přesnost nemá význam, protože požadované hodnoty jsou v paměti uloženy jako 8 bitová čísla. Doba měření teploty pro 12 bitový režim je 750 ms. Za každý ubraný bit dostaneme poloviční časový úsek potřebný k převodu teploty. Proto je v práci používáno čidlo v 9 bitovém režimu a hodnota teploty, používaná v termostatu, je pouze její 8 bitová celá část. Další výhodou DS18B20 je možnost použít více čidel na jedné sběrnici a možnost nastavit registry alarmu. Čidlo při každé teplotní konverzi kontroluje, zda je teplota mezi hodnotami v registrech, pokud není, nastaví se alarm flag. Toto řešení umožňuje ovládacímu zařízení monitorovat, zda na některém čidle nedošlo k překročení maximální nebo minimální hodnoty pro měřenou oblast, aniž by znalo aktuální teploty této oblasti. Jelikož jsou pro realizaci termostatu použita maximálně dvě teplotní čidla, u kterých potřebujeme znát měřenou teplotu, není třeba kontrolu alarmu přidávat.
14
Komunikace s teplotním čidlem probíhá přes 1-drátovou sběrnici, tento způsob nepatří mezi standardní komunikační rozhraní, ale není těžký na implementaci. Komunikace začíná vždy reset pulsem, na který zařízení odpovídá přítomnostním pulsem. Přenos dat je vždy zahájen nejnižším platným bitem. Příkazy lze rozdělit na ROM příkazy (výběr zařízení na sběrnici) a funkční příkazy. Pro názornost přikládám ukázku komunikace, viz obrázek 2.5. Komunikace začíná vždy reset pulsem, následuje presenční puls, který nás informuje, zda je nějaké zařízení k dispozici. Po tomto pulsu je možné vyslat ROM příkaz, který adresuje čidla připojené k této jednodrátové sběrnici, po dokončení adresace je vyslán funkční příkaz, podle kterého čidlo provede určitou operaci. Příkazy jsou rozebrány v následujícím textu. Čidlo obsahuje „Scratchpad“ paměť (9 bytů), která obsahuje tato data – 2 byty teplota, 2 byty registry alarmu, 1 byte nastavení režimu konverze, 3 byty pro vnitřní funkce čidla a 1 byty CRC. V následujícím textu jsou rozepsány jednotlivé příkazy, které umožňují komunikaci s teplotním čidlem. Dělí se na ROM příkazy, která umožňují získat identifikační čísla a podle nich adresovat jednotlivá zařízení na sběrnici, a na funkční příkazy, které určují činnost teplotního čidla. 3.1.2.1. ROM příkazy Používají se k získání identifikačních čísel a k adresaci zařízení na sběrnici. SEARCH ROM Příkaz se využívá po inicializaci a slouží k získání 64 bitových identifikačních klíčů všech zařízení na sběrnici. Musí být proveden tolikrát, kolik je použito zařízení. Tento příkaz je složitější na implementaci. READ ROM Obdoba předchozího příkazu, ale slouží k získání identifikačního čísla pouze jednoho zařízení. To znamená, že nesmí být přítomno více zařízení, jinak by došlo ke kolizi dat. MATCH ROM Tento příkaz, následovaný 64 bitovým identifikačním číslem, slouží k výběru zařízení s tímto identifikačním číslem. Ostatní zařízení nebudou odpovídat, dokud nebude proveden reset. Tento příkaz je nutné použít, pokud chceme číst teplotu ze sběrnice, kde je přítomno více zařízení. SKIP ROM Příkaz vybere všechny zařízení na sběrnici. Je vhodné ho použít, pokud máme pouze jedno teplotní čidlo, nebo pokud chceme provést měření na všech čidlech. Jestliže po tomto příkazu bude následovat čtení dat a na sběrnici bude více zařízení, může dojít ke kolizi dat. ALARM SEARCH Slouží ke kontrole, zda nemá některé zařízení nastaven alarm flag. Ten je nastaven, pokud při předchozím měření byla hodnota teploty mimo meze nastavené v registrech čidla.
15
Tabulka 3.1: Možné příkazy komunikace s teplotním čidlem
Typ příkazu
Název příkazu
Zápis příkazu
ROM příkazy SEARCH ROM READ ROM MATCH ROM SKIP ROM ALARM SEARCH
0xF0 0x33 0x55 0xCC 0xEC
CONVERT WRITE SCRATCHPAD READ SCRATCHPAD COPY SCRATCHPAD RECALL E2 READ POWER SUPPLY
0x44 0x4E 0xBE 0x48 0xB8 0xB4
Funkční příkazy
3.1.2.2. Funkční příkazy Určují činnost teplotního čidla. CONVERT Po tomto příkazu následuje měření teploty, výsledná hodnota je uložena ve 2 bytech „scratchpad“ paměti čidla. Je-li čidlo napájeno klasickým způsoben, je možné kontrolovat stav konverze čtecími pulsy, kdy čidlo vysílá 0 během procesu a 1, pokud již byla konverze dokončena. WRITE SCRATCHPAD Po tomto příkazu jsou poslány další 3 byty nastavení. Byty jsou přijímány a zapsány do „scratchpad“ paměti (na pozice 2-4). Příkaz umožňuje nastavit režim konverze a spodní a horní registry alarmu. READ SCRATCHPAD Tento příkaz požaduje od čidla obsah „scratchpad“ paměti a využívá se pro předávání teploty. Poté ovládací zařízení může číst všech 9 bytů paměti čidla. Ovládací zařízení ukončí čtení resetem, pokud nechce všech 9 bytů. Data začínají nejnižším bitem. COPY SCRATCHPAD Čidlo uloží obsah nastavení režimu konverze a registry pro alarm ze Scratchpad paměti do EEPROM paměti. RECALL E2 Opak příkazu COPY SCRATCHPAD, nastavení je obnoveno z paměti EEPROM. READ POWER SUPPLY Tento příkaz umožňuje ovládacímu zařízení zjistit, zda jsou na sběrnici přítomna zařízení napájená pomocí parasitního režimu. Při čtení stavu sběrnice vysílají zařízení napájená tímto způsobem hodnotu log 0.
16
Implementace ovládání teplotního čidla je v souboru cidlo.c (hlavičkový soubor cidlo.h). Pro správný způsob komunikace je potřeba nejdříve nastavit pin, ke kterému je poté potřeba připojit sběrnici. Jelikož sběrnice pracuje na principu otevřeného kolektoru, kde hodnota log 0 je nastavena pomocí otevření tranzistoru a přizemnění sběrnice a hodnota log 1 je nastavena pomocí pull-up rezistoru, rozhodl jsem se na přípravku nastavovat log 0 jako výstup a log 1 přepnutím na vstup. Pin je nastaven jako výstupní, pouze pokud je na výstupu nastavena log 0. Pro ukázku přikládám část programu ovládání teplotního čidla, která slouží ke změně vstupu a výstupu pro I/O vývod PD4. unsigned char pinP=0x10; void zapis_0(){ DDRD|=pinP; PORTD&=~pinP; }
//nastaví pin jako výstup //nastaví hodnotu log 0
void zapis_1(){ DDRD&= ~pinP; }
//nastaví pin jako vstup
3.1.2.3. Realizace komunikace Každý příkaz začíná reset pulsem, kdy na sběrnici nastavíme hodnotu log 0 po dobu minimálně 480µs. Na tento puls reaguje čidlo po 15 – 60µs presenčním pulsem, log 0 po dobu 60 - 240µs. Po uplynutí 860µs od začátku komunikace lze začít posílat příkaz ROM, který vybere čidla na sběrnici, po výběru zařízení je možné vyslat funkční příkaz, který určí následující operaci teplotního čidla. Zápis bitu s hodnotou 0 provedeme tak, že na sběrnici nastavíme log 0 na dobu 60 – 120µs, bit s hodnotou 1 je zapsán nastavením log 0 na dobu 1µs, po této době se sběrnice přes pull-up rezistor nabije do stavu log 1. Čtení hodnot probíhá nastavením log 0 na dobu 1µs, poté musíme vyčkat, aby se případně stihla sběrnice nabít přes pull-up rezistor, a pak teprve přečíst hodnotu, která je platná maximálně 15µs od začátku čtení. Časový úsek pro zápis i čtení musí trvat minimálně 60µs a mezi jednotlivými úseky musíme vyčkat minimálně 1µs. Pro názornost přikládám ukázku čtení a zápisu 1B (8 bitů). Protože data jsou vysílána od nejnižšího platného bitu po nejvyšší, přijímá funkce aktuální hodnotu jako nejvyšší bit a poté provede posun doprava. void write_byte (char prikaz){ for (i=0; i<8; i++){ bit=prikaz & 0x01; prikaz=prikaz>>1; _delay_loop_2(WAIT_1US); zapis_0(); _delay_loop_2(WAIT_1US); if (bit == 0) _delay_loop_2(WAIT_80US); zapis_1(); }else{ zapis_1() _delay_loop_2(WAIT_80US); }}}
17
// funkce která vysílá byte //výběr nejnižšího bitu //posuv příkazu o 1 bit vpravo //vyčká 1µs mezi úseky //nastaví hodnotu 0 na sběrnici //opět vyčká 1µs //vyčkáme 80µs //nastavíme hodnotu 1 //nastavíme hodnotu 1; //vyčkáme 80µs
Tabulka 3.2: Převod teploty bit 7 23
bit 6 22
bit 15
bit 14
char precti(){ char tmp=pinP; tmp&=PIND; tmp = tmp << 7; return tmp; }
bit 5 21
bit 4 20
bit 3 2-1
bit 2 2-2
bit 1 2-3
bit 0 2-4
bit 13 bit 12 znaménko
bit 11
bit 10 26
bit 9 25
bit 8 24
//funkce přečte bit //nastavení, který bit chceme číst //načteme hodnotu tohoto bitu (použijeme logický součin) //posuneme vlevo, aby byl bit nejvyšším //předá hodnotu
char read_byte (void){ byte = 0x00; for (i=0; i<8; i++){ zapis_0(); _delay_loop_2(WAIT_1US); zapis_1(); _delay_loop_2(WAIT_10US); byte=byte>>1; byte|=precti(); _delay_loop_2(WAIT_50US); } return byte; }
// funkce která čte byte //smazání proměnné //nastavení nuly //vyčká 1µs //zapíše 1 //vyčká 10µs //posun o 1bit doprava //přečte aktuální hodnotu //vyčká 50 µs
Při zapnutí přípravku musí dojít k inicializaci čidla – nastavení 9 bitového režimu a registrů alarmu, i když nejsou využity. Nastavení je provedeno v metodě write_scratch(), ve které jsou odeslány 4B (0x4E, 0x00, 0x60, 0x1F). Byty jsou v následujícím pořadí: příkaz, spodní a horní registry alarmu a nastavení pro 9 bitový režim. Následně jsou informace zkopírovány do paměti EEPROM, kdyby došlo k výpadku napětí čidla. void init_cidlo () { zapis_1(); reset_pulse(); byte = read_presence(); skip_rom(); write_scratch(); _delay_loop_2(WAIT_80US); reset_pulse(); byte = read_presence(); skip_rom(); copy_scratch(); }
//nastaví jako výstup //reset puls //přečte přítomnostní puls //vybere všechny zařízení na sběrnici //nastavení čidla //vyčkat 80µs
//uloží nastavení do EEPROM paměti
Čtení teploty probíhá načtením obsahu „scratchpad“ paměti. Pro získání teploty jsou důležité pouze první dva byty. Převod na dekadickou hodnotu probíhá podle schématu popsaného v tabulce 3.2. Následující kód je použit pro načítání teploty a převod na dekadickou hodnotu.
18
char read_temp (){ reset_pulse(); byte = read_presence(); if(byte==0x10){return 0x00;} skip_rom(); read_scratch(); char tmp1=read_byte(); _delay_loop_2(WAIT_50US); tmp1=tmp1>>4; char tmp2=read_byte(); _delay_loop_2(WAIT_50US); tmp2=tmp2<<4; bity tmp1=tmp1+tmp2; for(i=0;i<7;i++){ read_byte(); _delay_loop_2(WAIT_50US); } return tmp1; }
//čtení teploty //čtení přítomnostního pulsu //kontrola přítomnosti čidla //příkaz čtení obsahu scratch paměti //čtení prvního bytu //vyčkat 50µs //posuv o 4 bity vpravo => pouze 4 nejvyšší bity //čtení druhého bytu //opět vyčkat 50µs //posuv o 4 bity vlevo => použití pouze 4 nejnižší //sloučení hodnot ve výslednou teplotu //přečte zbylé položky scratchpad paměti //mezi čtením vyčká vždy 50µs
3.1.3. Modul s LCD displejem a tlačítky Modul lze připojit k desce pomocí sériového nebo paralelního rozhraní, v tomto návrhu využívám pouze paralelní rozhraní (připojení pomocí 20 žilového plochého kabelu), které sice potřebuje více vodičů, ale umožňuje jednodušší ovládání. Modul obsahuje piezoelektrický měnič pro generování zvukových signálů, který je využit při stisku tlačítka. Dále deska obsahuje dvouřádkový LCD displej, který umožňuje na každém řádku zobrazit 16 znaků. Jedná se o displej se žlutozeleným pozadím a evropským znakovým fontem. Na modulu je k dispozici také osm tlačítek, které nám umožní základní ovládání programovatelného termostatu. Modul je potřeba připojit k portu CON1 vývojové desky, port CON2 není možné použít k připojení, protože nejsou k dispozici všechny I/O vývody čipu ovládací desky, které jsou využity k jiným účelům. Pro ovládání modulu jsem použil zdrojové kódy umístěné na stránkách výrobce desky firmy PK-Design [5], které jsem poupravil do výsledné podoby. Tyto zdrojové kódy jsou uloženy v souboru modul_tlacitka.c (hlavičkový soubor modul_tlacitka.h). Ovládání LCD displeje je uloženo v souboru lcd.c (hlavičkový soubor lcd.h). Zdrojové kódy pro ovládání LCD displeje byly také k dispozici, ale rozhodl jsem se je poupravit podle dokumentace k displeji [6]. Pokud porovnáme funkce s dostupným kódem k ovládání LCD displeje, je řešení velmi podobné. Způsobeno je to tím, že není možné napsat tyto funkce jinak, pokud vyžadujeme identickou funkčnost.
3.1.4. Sériové rozhraní RS232 Rozhodl jsem se vyrobit přípravek, který by byl schopný komunikovat s počítačem, program v PC by umožnil například vzdálené ovládání. Pro připojení k počítači je na základní desce připraven odpojitelný sériový port. Tento port sdílí dva I/O vývody čipu portu D, které jsou jinak vyvedeny na portu CON2 (PD0, PD1). Čip osazený na desce podporuje sériovou komunikaci a stará se za nás o vysílání a přijímání dat v požadované formě a rychlosti.
19
Při realizaci jsem se rozhodl použít standardní velikost datového bloku 8 bitů, které jsou zabezpečeny pomocí jednoho paritního bitu. Lze použít sudou nebo lichou paritu. Při návrhu jsem se rozhodl použít lichou paritu (součet jedniček datových bitů i s paritním bitem je liché číslo). Paritní bit nám umožňuje detekci lichého počtu chyb. Rychlost přenosu dat jsem zvolil 9600 BAUD (znaků za sekundu). Při zapnutí termostatu je potřeba nastavit parametry pro sériové rozhraní čipu USART (Universální synchronní a asynchronní přijímač a vysílač). Nastavení tohoto rozhraní je uloženo v registrech UCSRB, UCSRC, UBBRL a UBBRH. V registru UCSRB je možné nastavovat přerušení, povolit přijímač a vysílač, jeden bit velikosti datové části a také jsou zde 2 bity pro posílání a příjem devátých datových bitů. V tomto registru je potřeba povolit přerušení při dokončení příjmu (7) a odeslání (6) dat, povolit přijímač (4) i vysílač (3). V registru UCSRC lze nastavit, zda používáme synchronní nebo asynchronní operace, paritu, počet stop bitů, počet datových bitů a polaritu hodin (při užití synchronního módu). Pro přístup k tomuto registru musí být nejvyšší bit 1, protože registr sdílí adresu s registrem UBBRH. Nastavíme asynchronní mód, lichou paritu, 1 stop bit a 8 datových bitů. Nakonec je potřeba nastavit rychlost přenosu dat, což provedeme zapsáním hodnoty UBBR do registrů UBBRL a UBBRH. Hodnotu UBBR pro asynchronní normální mód vypočteme podle vzorce: f OSC f OSC BAUD = ⇒ UBBR = −1 16(UBBR + 1) 16 BAUD 14,7456 ⋅ 10 6 UBBR = − 1 = 95 16 ⋅ 9600 void init_RS232(){ //nastavení děličky UBRR UBRRH = 0x00; UBRRL = 0x5F;
//95
UCSRB = 0xD8; UCSRC = 0xA6; }
Příjem a zápis dat jsou prováděny přes registr UDR, ve kterém je uloženo 8 bitů dat, samotné vysílání a přijímání jednotlivých bitů je zajištěno zařízením USART na čipu. Výstup tohoto zařízení je připojen k na I/O vývody portu D PD0 a PD1. Při přijetí dat dojde k vyvolání přerušení, v obsluze tohoto přerušení dojde ke kontrole dat, kontrola parity, kontrola datového okna (zda není stop bit roven log 0) a zda nedošlo k přepisu přijatých dat. Pokud byla zjištěna chyba, vyšle termostat „Error“ (hodnota 0xFE), v ostatních případech vyšle potvrzení (stejnou hodnotu, která byla přijata) a uloží tento byte na zásobník. Komunikace v plné rychlosti probíhá pouze při odesílání hodnot otopové křivky nastavených v přípravku.
3.1.5. Otopová křivka Hodnoty otopové křivky jsou uloženy v EEPROM paměti na čipu, aktuální požadovaná teplota je uložena v proměnné (tj. v SRAM paměti) a je pravidelně načítána. Programovatelný termostat lze rozdělit maximálně na 10 minutové
20
intervaly (1008 hodnot), pro které lze nastavit různou teplotu. Pro realizaci prototypu je zatím navržen hodinový interval pro týdenní časovou smyčku. Tato volba vyžaduje 168 B paměti EEPROM. Nastavení hodnot otopové křivky je možné vysláním příkazu z počítače, nebo pomocí tlačítek termostatu. Při správném zadání údajů (kontrola, zda nejsou zadány stejné údaje pro začátek i konec intervalu) je zavolána funkce, která se stará o zápis do paměti. Funkce umí zkontrolovat, zda není konec intervalu v týdnu dříve než začátek, pokud je požadované zadání, dojde k rozdělení na dva cykly, první se postará o zápis dat do konce týdne, druhý se postará o zápis od začátku týdne do zvoleného datumu. V opačném případě je použit pouze jeden cyklus, kde je inkrementován ukazatel na již zapsaná data. V cyklu se volá funkce s parametry adresa a hodnota, která nastaví na adresu požadovanou hodnotu teploty. Pří přístupu k paměti musíme vždy vyčkat na dokončení předchozí operace s pamětí. Poté je potřeba nastavit adresu (registry EEARL a EEARH), při zápisu případně data. Operace čtení začne, pokud je nastavena připravenost zařízení číst (bit EERE registru EECR). Při zápisu je potřeba nejprve nastavit, že je zařízení připraveno na zápis (bit EEME) a poté teprve zahájit proces zápisu (bit EEWE). Ukázka zdrojového kódu pro práci s paměti (tyto metody se nachází v souboru ovladani.c). unsigned char get_ee(unsigned char adr){ while(EECR & (1 << EEWE)); EEARH = 0x00; data) EEARL = adr; EECR |= 0x01; return EEDR; }
//čekám na dokončení předchozích operací //nastavení vrchních bitů adresy (nejsou zde //nastavení spodních bitů adresy //nastavím 0bit, že jsem připraven číst //EEDR EEPROM data registr
void set_ee(unsigned char adr, unsigned char temp){ while(EECR & (1 << EEWE)); //čekám na dokončení předchozích operací EEARH = 0x00; //nastavení adresy EEARL = adr; EEDR=temp; //EEDR nastavení dat do EEPROM data registru EECR |= 0x04; //nastavím 2 bit, že jsem připraven zapisovat EECR |= 0x02; //nastavím 1 bit na 1, můžu zapisovat } void zapisData(){ if(tOd < tDo){ while(tOd
//začátek menší než konec //zápis dat
//začátek větší než konec //smyčka od začátku intervalu do konce týdne //zápis dat //smyčka od začátku týdne po konec intervalu //zápis dat //zneplatnění posledních načtených dat; //nastaví normální mód displeje
21
3.1.6. Implementace ovládání Termostat umožňuje čtyři základní módy, jež lze zvolit pomocí tlačítek, a čtyři rozšiřující módy, ve kterých se přípravek nachází při komunikaci s počítačem. Základní módy umožňují nastavení času, nastavení otopové křivky, procházení hodnot a zobrazení informací o aktuálním dění. Při implementaci přepínání módů byla zvažována možnost použití menu, které by bylo přehledné a při použití více položek určitě i výhodnější. Jelikož termostat umí pouze tyto čtyři módy, vystačuje zatím přepínání pomocí tlačítek F1 a F2. Při nastavování otopové křivky je na prvním řádku zobrazen název operace a spodní řádek slouží k zobrazení aktuálně nastavovaných hodnot, řádek je rozdělen na sloupce podle počtu proměnných, které lze měnit. Hodnota, která je právě vybrána, je zdůrazněna pomocí kursoru displeje. Pro pohyb mezi sloupci jsou použita tlačítka vlevo a vpravo, pro pohyb mezi řádky tlačítka Enter a ESC. Procházení otopové křivky je pomocí tlačítek – vlevo a vpravo znamená změnu o hodinu, nahoru a dolu znamená změnu o 24 hodin (celý den). Při každém stisku směrových tlačítek dojde k nahrání hodnoty z paměti EEPROM. Nastavení změny času bylo nejdříve implementováno pouze v jednom kroku, toto řešení je sice jednodušší na implementaci, ale mohlo by snadno dojít ke změně údajů při nechtěném stisku tlačítka. Proto je toto řešení rozděleno do dvou kroků, přičemž v prvním nastavíme hodnoty (den, hodiny a minuty). Nastavení těchto hodnot probíhá na jednom řádku. Při stisku tlačítka Enter je nyní zobrazen potvrzovací dialog, při opětovném stisku tlačítka Enter dojde teprve k přednastavení údajů o čase.
3.2. Návrh programu pro PC
Obrázek 3.2: Úvodní okno programu
Obrázek 3.3: Okno zobrazující informaci o teplotě
22
Obrázek 3.4: Okno pro vzdálené ovládání termostatu
Obrázek 3.5: Přehled – okno zobrazující nastavení otopové křivky
Program je navrhován v programovacím jazyku Java a je určen pro operační systém Windows. Umožňuje komunikaci s programovatelným termostatem přes sériový port, tuto komunikaci umožňuje použitá knihovna RXTX, která nám umožňuje přístup k portům počítače. Při běhu programu musí být tato knihovna ve stejné složce jako spouštěný program. Výhodou tohoto programu je pro uživatele grafické uživatelské rozhraní, které umožňuje jednoduché ovládání pomocí základních komponent. Po spuštění programu se zobrazí úvodní obrazovka (viz. obrázek 3.2), kde je potřeba provést důležité nastavení programu a vybrat port, ke kterému je připojen kabel od přípravku. Výběr probíhá z komponenty CheckBox, která po rozkliknutí zobrazí seznam aktuálně dostupných portů v PC. Zde vzniká problém pro uživatele, kteří neznají označení těchto portů a nemusejí vědět, který port vybrat. Program
23
zatím neumožňuje automatickou detekci, proto je jediným možným řešením procházení jednotlivých portů. Při výběru portu dojde k uzavření úvodního okna. Po uzavření úvodního okna se otevře nám okno sloužící k ovládání programovatelného termostatu (obrázek 3.4), které zobrazuje informace o aktuálním datu, čase, ale také dni. Okno obsahuje tři pole (Spinner), ve kterých je hodnota vybírána pomocí šipek, na okraji této komponenty. Dvě slouží pro nastavení hodin, třetí k nastavení požadované teploty. Dále jsou v okně umístěny dvě komponenty CheckBox, které umožňují vybrat den. K ovládání je zde pět tlačítek. Tlačítko „Nastavit“ vyšle příkaz s daty (začátek, konec, teplota) k programovatelnému termostatu, který podle těchto hodnot nastaví otopovou křivku. Tlačítko „Nastav čas“ odešle termostatu příkaz následovaný daty (den, hodiny, minuty). Tlačítko „Zjisti aktuální teplotu“ vyšle požadavek na teplotu naměřenou přípravkem. Tlačítko „Zjisti nastavení teploty“ vyšle příkaz zjisti data, který umožňuje programu získat nastavení otopové křivky. Zobrazení aktuální teploty je provedeno na nově zobrazeném okně (obrázek 3.3), které obsahuje jedno tlačítko, při stisku tohoto tlačítka dojde k uzavření tohoto okna. Zobrazení nastavení otopové křivky je složitější, protože je potřeba zobrazit všechny údaje, při rozlišení teplot pro hodinové intervaly je potřeba zobrazit 168 údajů. Proto je toto okno (obrázek 3.5) navržené jako tabulka, kde sloupce slouží pro jednotlivé dny a řádky pro hodinové intervaly. Při stisku tlačítka dojde k uzavření tohoto okna a otevře se opět okno Ovládání. K zobrazení aktuálních časových údajů je spuštěno vlákno, které se probudí každou sekundu a provede překreslení okna Ovládání. Přijímač a vysílač jsou navrženy rovněž jako vlákna, je to kvůli možnosti uspání vysílače, než dojde k potvrzení dat ze strany termostatu, ale také kvůli možnosti paralelního běhu vysílače a přijímače, jehož prostřednictvím můžeme minimalizovat možnost zmeškání dat na straně přijímače. Při vytváření příkazu a dat pro termostat, jsou předána vysílači data požadované délky (1-4 byty), při tvorbě přijímače je předán parametr – počet očekávaných čtecích cyklů, protože očekáváme data různých délek (2 nebo 169 bytů). Přijímač je tedy ukončen přijetím posledního datového bytu. Možná by bylo výhodnější použití ukončovacího příkazu např. přijetím hodnoty příkazu OK. Knihovna pro práci s porty RXTX umožňuje zjistit všechny porty (sériové a paralelní) v počítači. Získat na tyto porty ukazatele a kontrolovat, zda není port již vlastněn jiným programem. Knihovna umožňuje nastavit vlastnosti spojení (rychlost přenosu, počet davových bitů, paritu a počet stop bitů). Zápis a čtení je umožněno pomocí proudů InputStream a OutputStream, které lze snadno získat od portu. Na konci programu je pro správné ukončení komunikace nutné tyto proudy i porty uzavřít.
3.3. Návrh sestavení výsledného přípravku Výsledný přípravek se skládá ze čtyř hlavních částí – základní deska, modul LCD displeje s tlačítky, teplotní čidlo a deska s ovládáním obvodu s bojlerem. Zatím nedošlo k realizaci tohoto návrhu, protože ještě nebyla vyrobena deska s ovládáním obvodu bojleru, u které je kladen důraz na bezpečnost, kvůli nebezpečí úrazu elektrickým proudem. Jelikož se však počítá s použitím přípravku na chatě, bude návrh určitě dokončen, otestován a poté nasazen.
24
VCC
MB_ATmega32L
RS232
DS18B20 GND
DQ
VDD
CON2
VDD GND
R
VCC
GND
CON1
GND
Ovládaní bojleru
Modul LCD a tlačítek
20 OUT1
CON
OUT2
IN
Obrázek 3.6: Schéma zapojení přípravku
VCC
S1
R3
R4 OUT2
S2 D1
D2
R2
K
OUT2 R1 IN
T
GND
Obrázek 3.7: Schéma desky ovládání elektrického obvodu
Použité součástky: R1 – RRU 470R, ochranný odpor vstupu desky MB-ATmega32L (470 Ω) R2 – RRU 680R, odpor pro nastavení proudu báze (680 Ω) R2 – RRU 270R, předřadný odpor LED diody (270 Ω) R2 – RRU 27R, předřadný odpor spínacího relé (33 Ω) D1 – L-53GD, zelená LED dioda D2 – ochranná dioda např. 1N4007 (1000V; 1A) S1,S2 – kolébkové spínače T – spínací tranzistor např. BC546B (65V; 0,1A; 0,5W) K – polovodičové relé, např. relé Finder řady 45.71 IN – vstup od desky MB-ATmega32L VCC a GND – napájení desky OUT1 a OUT2 – svorky pro připojení elektrického obvodu s bojlerem
25
3.3.1. Deska s ovládáním obvodu s bojlerem. Tato deska bude vytvořena podle schématu na obrázku 3.7. Deska bude připojena pomocí konektoru přímo ke zdroji napájení, vstup IN bude propojen se základní deskou MB_ATmega32L a k výstupům OUT1 a OUT2 bude připojen elektrický obvod bojleru. Deska umožňuje spínání elektrického obvodu bojleru podle vstupu IN nebo sepnutí, respektive vypnutí, nezávisle na hodnotě vstupu IN. K tomu je deska vybavena dvěma vypínači, přičemž pomocí vypínače S1 je možné vypnout přívod elektrické energie. Pokud je spínač S1 sepnutý, je obvod ovládán pomocí vstupu IN nebo trvale sepnut spínačem S2 (v tomto případě je relé K trvale sepnuto a topení je ovládáno termostatem v bojleru). Spínání obvodu bojleru zajišťuje polovodičové relé, které umožňuje spínání síťového napětí 230 V a proudu kolem 8,7 A. Jelikož je potřeba zamezit překročení maximálních povolených hodnot spínacího prvku a minimalizovat možnosti vzniku požáru je relé dimenzováno na 16A. K tomu se hodí relé firmy Finder řady 45.71 [8], které je možné spínat napětím 6V, protože toto relé má maximální napětí na cívce 7,2V je zapojeno v sérii s ochranným odporem R4 s hodnotou 27Ω. Jelikož při vypnutí tranzistoru a rozepnutí relé se cívka relé brání změnám proudu indukcí napětí na kolektoru tranzistoru, je umístěna paralelně s relé ochranná dioda D2, která brání překmitu napětí a tím chrání spínací tranzistor před zničením průrazným napětím. Lze použít diody 1N4007 (1000V, 1A), 1N4937 (600V, 1A) nebo BA159 (1000V, 1A), které jsou na trhu dobře dostupné. Zelená LED dioda D1, která slouží pro kontrolu stavu spínacího zařízení a má úbytek napětí 2,2 – 2,5 V při proudu 20mA, je připojena přes rezistor R3 s hodnotou 270 Ω, který chrání diodu před průrazem. Spínací tranzistor T typu NPN je potřeba zvolit s ohledem na spínání induktivní zátěže, kdy potřebujeme větší hodnotu průrazného napětí, aby nedošlo k průrazu tranzistoru při vypnutí obvodu. Lze vybrat například tranzistor BC546B (65V; 0,1A; 0,5W) nebo 2N4401 (60V, 0,6A, 0,35W). Ovládání spínání tranzistoru je pomocí výstupu základní desky MB-ATmega32L (U=5V, Imax=20mA), které je připojeno pomocí ochranného odporu R1 s hodnotou 470 Ω, který snižuje maximální proud. Další možností, jak sepnout tranzistor je sepnutí spínače S2, který je k bázi transistoru připojen přes rezistor R2 s hodnotou 680 Ω. Při návrhu této desky je potřeba dbát na bezpečnost a zamezit přístupu k živým částem síťového napětí 230V přivedeného na kontakty polovodičového relé.
26
4. Testování
Obrázek 4.1: Záznam příkazu WRITE SCRATCHPAD z osciloskopu
RESET PULS
PRESENC PULS
SKIP ROM 0xCC
WRITE SC 0x4E
BYTE0 0x00
BYTE1 0x60
BYTE2 0x1F
Obrázek 4.2: Schéma příkazu WRITE SCRATCHPAD
Obrázek 4.3: Záznam příkazu COPY SCRATCHPAD z osciloskopu
27
RESET PULS
PRESENC PULS
SKIP ROM 0xCC
COPY SC 0x48
Obrázek 4.4: Schéma příkazu COPY SCRATCHPAD
Obrázek 4.5: Záznam příkazu CONVERT z osciloskopu
RESET PULS
PRESENC PULS
SKIP ROM 0xCC
CONVERT 0x44
Obrázek 4.6: Schéma příkazu CONVERT
Obrázek 4.7: Záznam příkazu READ SCRATCHPAD z osciloskopu
28
RESET PULS
PRESENC PULS
SKIP ROM 0xCC
READ SC 0xBE
BYTE0
BYTE8
Obrázek 4.8: Schéma příkazu READ SCRATCHPAD
Testování návrhu přípravku probíhalo krokováním jednotlivých částí programu v návrhovém prostředí AVR Studio 4, při kterém bylo možné zjistit a odstranit základní nedostatky (např. špatně zadané hodnoty, registry …). Pokud nebyla zjištěna žádná viditelná chyba, byl program nahrán do přípravku, kde byla zkoumána správná funkčnost v reálném čase. 4.1.1.1. Testování čítače reálného času Toto testování bylo provedeno spuštěním přípravku na dobu několika dní, na začátku testování byl čas nastaven podle referenčních hodin. Následně byly hodnoty zobrazené na LCD displeji porovnány s časem na referenčních hodinách. Při tomto testu, který běžel asi tři dny nedošlo k žádné odchylce. Jelikož při ohřevu vody není důležitá přesnost na vteřiny, byly výsledky tohoto testu vyhodnoceny jako dostačující. 4.1.1.2. Testování teplotního čidla Testování teplotního čidla probíhalo pomocí osciloskopu Agilent DSO6104A, při tomto testování byly nejdříve odstraněny chyby komunikace, kdy došlo k prohození pořadí bitů nebo ke čtení registru PORT (výstupní) místo PIN (vstupní). Dále došlo ke zkoumání délek jednotlivých intervalů komunikace, které odpovídaly požadavkům komunikace, určené výrobcem. Na obrázcích 4.5 a 4.6 je zachycen průběh příkazu, po kterém čidlo vykoná teplotní konverzi. Na obrázcích 4.3 a 4.4 je zachycen průběh příkazu, po kterém čidlo zkopíruje hodnoty nastavení ve Scratchpad paměti do paměti EEPROM. Na obrázcích 4.1 a 4.2 je zachycen průběh příkazu, kdy dochází k nastavení registrů alarmu a režimu přesnosti čidla (byte0 – spodní hodnota alarmu, byte1 – vrchní hodnota alarmu, byte2 – režim přesnosti). Na obrázcích 4.7 a 4.8 je zachycen průběh čtení obsahu Scratchpad paměti čidla, kde jsou uloženy hodnoty naměřené teploty. Scratchpad paměť obsahuje 9 bytů (2 byty teplota, 2 byty registry alarmu, 1 byte nastavení, 3 byty hodnot teplotního čidla, 1 byty CRC). Na obrázku 4.7 je vidět čtení pouze prvních tří bytů Scratchpad paměti. 4.1.1.3. Testování programu pro komunikaci U tohoto programu bylo potřeba otestovat správnost přenášení dat při požadované rychlosti 9600 BAUD a formátu 8 datových bitů a použití liché parity. Při tvorbě byl program testován proti druhému počítači, na kterém běžel program HyperTerminál. Přenášeny byly hodnoty pro písmena dle ASCII tabulky, toto řešení bylo zvoleno kvůli jednoduché kontrole dat, kdy na straně přijímače byl vypisován text. Při tomto testování byl program doladěn do finální podoby.
29
4.1.1.4. Testování zápisu a čtení dat z EEPROM paměti K tomuto testování došlo zápisem různých dat do EEPROM paměti pomocí funkce „nastavení otopové křivky“ nebo pomocí programu AVR ISP prog., který umožňuje nahrát data v hexadecimální formě a uložit je do paměti čipu. Poté byly hodnoty kontrolovány pomocí funkce „procházení hodnot otopové křivky“, ale také načítáním požadované teploty při klasickém režimu termostatu, kdy je tato hodnota načítána podle aktuálních časových údajů (den a hodina). Posledními testy paměti čipu, bylo nastavení hodnot otopové křivky využitím funkce „nastavení otopové křivky“ a následně načtením obsahu paměti pomocí programu AVR ISP prog., ve kterém jsou hodnoty paměti uloženy na jednotlivých adresách (den*24+hodina). 4.1.1.5. Testování komunikace mezi termostatem a PC Toto testování bylo možné provést až po dokončení testů – zápis a čtení dat z EEPROM paměti, teplotní čidlo, program pro komunikaci, protože tato komunikace využívá na straně termostatu funkce, které bylo potřeba otestovat v předchozích testech. Při tomto testování došlo k doladění programu pro PC a k vyzkoušení ovládání přípravku pomocí příkazu přijatých přes RS232. 4.1.1.6. Testování ovládání obvodu bojleru Jelikož ještě nebyl dokončen návrh desky pro ovládání silové části, je potřeba provést toto testování po dokončení této desky. Zatím byl otestován pouze výstup základní desky, který bude připojen k této desce. Pokud je požadovaná teplota menší než naměřená teplota vody, nachází se výstup v log 1, tento stav signalizuje připojená LED dioda.
30
5. Práce do budoucna V této kapitole jsou zmíněna možná vylepšení do budoucna, kterými by bylo možné termostat či program umožňující komunikaci přes sériový port doplnit.
5.1. Realizace desky pro spínání elektrického obvodu Deska má sloužit k ovládání silového obvodu s bojlerem. U této desky je hlavní důraz na bezpečnost, tedy zamezení přístupu ke kontaktům silového napětí, aby nemohlo dojít k úrazu elektrickým proudem. Návrh této desky je v poslední fázi příprav, a deska by měla být dokončena a otestována v nejkratším možném intervalu. Po otestování bude deska připojena ke zdroji napětí a pomocí jednoho vodiče k základní desce a programovatelný termostat bude nasazen k ovládání ohřevu vody na chatě.
5.2. Záložní napájení Jelikož je programovatelný termostat napájen zdrojem (230VAC / 7,5VDC), který dodává energii pouze při zapojení do elektrické sítě, dojde při výpadku sítě k vypnutí programovatelného termostatu a ztrátě hodnot uložených v SRAM paměti čipu. Při zapnutí přípravku jsou všechny hodnoty uložené v SRAM paměti nastaveny na počáteční hodnoty. Tím dojde ke ztrátě časových údajů, pokud tedy dojde k opětovnému sepnutí např. ve středu v 15:15, termostat začne na hodnotě pondělí 0:00. Tím dojde k ovládání bojleru podle jiných hodnot, než jsou požadovány. Způsob, jak tomu zamezit, je přidat baterie, které by napájely termostat v době, kdy není k dispozici zdroj elektrické energie zapojený do zásuvky. Baterie by byly využity hlavně pro napájení mikropočítače, protože měřit teplotu každou minutu nebo spínat polovodičové relé v době, kdy není k dispozici elektrická energie pro ohřev vody, je zbytečné a docházelo by pouze k rychlejšímu vybíjení baterií.
5.3. Doplnit termostat o port USB Jelikož dnes většina notebooků a nových počítačů neobsahuje sériové porty je omezena možnost komunikace termostatu s těmito počítači. Možností, jak uskutečnit tuto komunikaci s termostatem, je rozšířit termostat o USB port a přidat implementaci ovládání komunikace nebo zakoupit redukci z USB na sériový port.
31
5.4. Monitorování ústředního topení K ohřevu vody je použit kombinovaný bojler, který umožňuje ohřev vody pomocí elektrické spirály nebo prostřednictvím ústředního topení, které je finančně i časově výhodnější. Termostat by bylo možné doplnit o teplotní čidlo, které by v závislosti na teplotě vody v ústředním topení vyhodnotilo, zda umožnit či neumožnit ohřev vody pomocí elektrické spirály. Dále by termostat mohl také při překročení určité minimální teploty spínat elektrické čerpadlo ústředního topení.
5.5. Vylepšení programu pro PC Program pro PC, umožňující komunikaci přes sériový port, je zatím navržen pouze pro operační systém Windows. Další možné vylepšení tohoto programu jsou autodetekce portu připojeného k programovatelnému termostatu a realizace programu umožňujícího komunikaci na jiném operačním systému např. Linux Ubuntu.
32
6. Závěr Zadáním bakalářské práce bylo vytvořit programovatelný termostat k bojleru, který umožňuje zadávání otopové křivky pomocí tlačítek nebo sériového portu. Zařízení programovatelný termostat jsem navrhl a implementoval na desce s čipem ATmega32, k této desce jsou připojeny modul s LCD displejem a tlačítky, teplotní čidlo DS18B20 a ovládací deska silového obvodu (tato deska zatím nebyla realizována, byl dokončen pouze návrh komponent a jejich zapojení). Program pro počítač umožňující komunikaci s termostatem přes sériový port je navržen pro operační systém Microsoft Windows a je implementován v programovací jazyku Java. Pro běh programu jsou nutné knihovny RXTX umožňující přístup k sériovým portům. Jako vývojové prostředí bylo použito Netbeans 6.8 a Java SE JDK 6u16. Vlastní implementace termostatu probíhala v programovacím jazyce C. Tento jazyk byl zvolen, aby bylo snadné přejít na jiný typ vývojové desky (např. změnit výrobce čipu), tento přechod nám umožňuje právě jazyk C, protože by mělo stačit pozměnit pouze malé části zdrojového kódu nikoliv jeho celé přepsání, jako tomu může být u assembleru. Jako vývojové prostředí bylo použito AVR Studio 4, které umožňuje testování zdrojového kódu a naprogramování čipu vývojové desky. Pro překlad zdrojového kódu z jazyka C je potřeba použít programem WinAVR (20100110), který si spouští samotné AVR Studio.
33
34
7. Návod k používání termostatu VCC
S1
R4
R3
OUT2
S2 D1
D2
R2
K
OUT2 R1 IN
T
GND
Obrázek 7.1: Schéma ovládání elektrického obvodu
VCC
RS232
DS18B20 GND
DQ
VDD
VDD GND
R
VCC
IN
MB_ATmega32L CON2
GND
Ovládaní bojleru
GND
CON1
20 OUT1
Modul LCD a tlačítek CON
OUT2
Obrázek 7.2: Schéma zapojení přípravku
Programovatelný termostat slouží k ovládání ohřevu vody v bojleru. Termostat pracuje ve třech režimech „Zapnuto“, „Vypnuto“ a „Měřit maximální teplotu podle otopové křivky“. K výběru režimu slouží dva spínače. Spínač S1 slouží ke spínání
35
přívodu napětí, v rozepnutém stavu tedy nastavuje režim „Vypnuto“. Spínač S2 v sepnutém stavu nastavuje režim „Zapnuto“, kdy je maximální teplota ohřevu vody řízena hlavním termostatem bojleru. V ostatních případech je maximální teplota vody v bojleru řízena hodnotami otopové křivky uložené v paměti.
7.1. Instalace termostatu Programovatelný termostat je potřeba zapojit podle obrázku 7.2. Modul LCD displeje a tlačítek se připojuje pomocí dvaceti žilového plochého kabelu k portu CON1. Napájení teplotního čidla je potřeba připojit k vývodům napájení na desce (červený drát je kladné napětí VDD, modrý drát slouží jako zem). Datový vodič je třeba připojit na port CON2 k pinu PD4. Vstup ovládání bojleru IN je potřeba připojit na port CON2 pin PD5. K výstupům OUT1 a OUT2 je třeba připojit přívod bojleru. K portu RS232 je možné připojit sériový kabel od počítače. Teplotní čidlo se umístí na vhodné místo u zařízení, které chceme ovládat. Přesná pozice se může lišit dle zařízení.
7.2. Ovládání termostatu
ESC
Výběr módu termostatu
ENTER
Ovládací šipky
Obrázek 7.3: Tlačítka termostatu
Nastavení otopové křivky
F1
F1
Procházení hodnot otopové křivky
F2
F2
F1 F2
Nastavení času
Normální
Obrázek 7.4: Schéma přepínání módů termostatu
Pomocí kláves F1 a F2 je možné přepínat mezi jednotlivými módy („normální“, „nastavení otopové křivky“, „procházení hodnot otopové křivky“, „nastavení času“). Jednotlivé kroky přepínání jsou zobrazeny na obrázku 7.4.
36
Termostat v „normálním“ módu, zobrazuje na displeji na prvním řádku čas, stav zda topí (T) nebo netopí (N), na druhém řádku je jako první naměřená teplota (T), za ní následuje požadovaná hodnota (P) otopové křivky uložená v paměti. Mód „nastavení otopové křivky“ umožňuje uložit nové hodnoty otopové křivky, které jsou nastaveny ve třech krocích. 1. Nastavení začátku požadovaného intervalu 2. Nastavení konce požadovaného intervalu 3. Nastavení požadované teploty K přepínání jednotlivých kroků slouží klávesy ENTER a ESC. V posledním kroku při stisku klávesy ENTER dojde k porovnání počáteční a koncové hodnoty intervalu. Pokud jsou různé dojde k uložení hodnot a automatickému návratu do „normálního“ módu, jinak není provedena žádná akce. Mód „procházení hodnot otopové křivky“ slouží pro kontrolu zadaných údajů otopové křivky v paměti termostatu, stiskem kláves NAHORU a DOLU dochází k přepínání dnů, klávesy VLEVO a VPRAVO umožňují procházení po jednotlivých hodinách. Mód „nastavení času“ slouží pro změnu času nastaveného v přípravku, nastavení pomocí šipek a potvrzení pomocí klávesy ENTER.
37
38
8. Program pro komunikaci s PC Tento program slouží pro ovládání programovatelného termostatu přes sériové rozhranní. Program podporuje stejné ovládání, které je možné provádět pomocí tlačítek termostatu. Program je napsán v programovacím jazyku Java a pro komunikaci se sériovým portem využívá knihovnu RXTX. Pro spuštění programu je potřeba mít nainstalovanou Javu na počítači, dostupná na stránkách java.com, knihovny RXTX musí být uloženy ve stejném adresáři jako výsledný program. Obsah adresáře tedy musí být výsledný program Termostat.jar a knihovna rxtxSerial.dll a adresář lib, který obsahuje knihovny RXTXcomm.jar, AbsoluteLayout.jar a beansbinding-1.2.1.jar. Pokud chybí některá z knihoven je běh programu vážně ohrožen.
8.1. Ovládání programu
Výběr portu
Obrázek 8.1: Úvodní okno programu pro PC
Obrázek 8.2: Okno zobrazující teplotu vody
39
Obrázek 8.3: Okno pro vzdálené ovládání termostatu
Obrázek 8.4: Okno, které slouží k zobrazení hodnot otopové křivky
Po spuštění programu se na monitoru zobrazí uvítací okno, shodné s obrázkem 8.1, v tomto okně je potřeba z nabídky portů vybrat ten, ke kterému je připojen programovatelný termostat. Po dokončení výběru stiskneme tlačítko „Vybrat“, které uzavře toto okno a spustí okno Ovládání, které je zobrazeno na obrázku 8.3.
40
Okno pro ovládání umožňuje základní ovládání programovatelného termostatu, tedy nastavit otopovou křivku, zjistit nastavení otopové křivky uložené v termostatu, zjistit aktuální naměřenou teplotu a změnit nastavení času programovatelného termostatu. Při stisku tlačítka „Nastavit“ dojde k nastavení hodnot otopové křivky podle údajů nastavených na formuláři – začátek a konec intervalu a požadovaná teplota. Při stisku tlačítka „Nastavit Čas“ dojde k nastavení času programovatelného termostatu podle údajů v počítači, které je možné vidět v hodní části programu. Tlačítko „Zjisti aktuální teplotu“ otevře okno, obrázek 8.2, které obsahuje informaci o poslední naměřené hodnotě teploty. Při stisku tlačítka „Zjisti nastavení teploty“ dojde k přenosu nastavení otopové křivky uložené v termostatu do počítače, následně dojde k otevření okna „Přehled“, obrázek 8.4, které obsahuje hodnoty otopové křivky uložené v tabulce, sloupečky znázorňují dny, řádky obsahují hodnoty pro jednotlivé hodiny.
41
42
9. Literatura [1] Maxim: DS18B20 Programmable Resolution 1-wire Digital Thermomether [online] http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf [2] Atmel: 8-bit AVR Microcontroller with 32k Bytes Programmable Flash ATmega32A http://atmel.com/dyn/resources/prod_documents/doc8155.pdf [3] PK-Design: Základová deska MB-ATmega16/32(L) v3.0 http://www.pk-design.net/Datasheets/Zakladova_deska_ATmega16_32_v30.pdf [4] PK-Design: Modul LCD displeje, 8 tlačítek a beeperu v2.0 http://www.pk-design.net/Datasheets/Modul_Disp_LCD_8_btns_bpr_v20.pdf [5] PK-Design: Modul LCD displeje, 8 tlačítek a beeperu – zdrojové kódy http://www.pk-design.net/Software/Examples/.. ../ATmega_common/gcc/LCD_8_btns_ser_or_par_test_0.zip [6] Bolymin: Specifications for LCD module http://oomlout.com/LCDD/LCDD-DATA-BC1602A.pdf [7] Knihovna Swing http://cs.wikipedia.org/wiki/Swing_(Java) [8] Finder: Relé do PS (16 A) – katalog http://www.finder.cz/comuni/pdf/S45CS.pdf
43
44
10. Obsah přiloženého CD Obsah CD je rozdělen do 3 částí – text, program, zdrojové kódy. Ve složce „text“ jsou nahrány soubory s textem bakalářské práce. Složka „program“ obsahuje přeložený počítačový program pro komunikaci s termostatem, v této složce jsou také potřebné knihovny. V poslední složce jsou nahrány zdrojové kódy, které jsou rozděleny na zdrojové programy pro počítačový program a na soubory pro přípravek, pro jednodušší procházení zdrojových kódů přikládám celé projekty.
45