85
UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO Alen Abraham MODULARNI SISTEM ZA AVTOMATIZACIJO HIŠE Diplomsko delo Maribor, junij 2015

MODULARNI SISTEM ZA AVTOMATIZACIJO - core.ac.uk · Srce RPi-ja (modela B) je procesor ARM, ki ga najdemo tudi v telefonih Apple iPhone 3G in bralniku Kindle 2.1 Procesor je 32-bitni

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

UNIVERZA V MARIBORU

FAKULTETA ZA ELEKTROTEHNIKO,

RAČUNALNIŠTVO IN INFORMATIKO

Alen Abraham

MODULARNI SISTEM ZA AVTOMATIZACIJO

HIŠE

Diplomsko delo

Maribor, junij 2015

MODULARNI SISTEM ZA AVTOMATIZACIJO

HIŠE

Diplomsko delo

Študent: Alen Abraham

Študijski program: Visokošolski študijski program Elektrotehnika

Smer: Elektronika

Mentor: doc. dr. Mitja Solar, univ. dipl. inž. el.

Lektorica: Neva Harc, mag. prof. slov., mag. kult. in antr.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

i

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

ii

Zahvala

Zahvaljujem se mentorju, doc. dr. Mitji

Solarju, univ. dipl. inž. el., za pomoč in

strokovno vodenje pri izvedbi

diplomskega dela. Zahvaljujem se tudi

ge. Nevi Harc za lektoriranje.

Zahvaljujem se svoji družini, da so mi

omogočili študij in mi bili v tem času v

pomoč ter oporo. Hvala tudi punci Iris za

moralno in vso ostalo pomoč pri študiju

ter izdelavi naloge.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

iii

Modularni sistem za avtomatizacijo hiše

Ključne besede: brezžično, krmiljenje, Raspberry Pi, modul, avtomatizacija

UDK: [004.4+621.38.049.75]:681.586(043.2)

Povzetek

V diplomskem delu smo se ukvarjali z izdelavo sistema, ki nam je s pomočjo spletne

aplikacije omogočil poljubno dodajanje in nastavljanje najrazličnejših modulov oz. enot

sistema avtomatizacije hiše. Realizirali smo takšen sistem, da smo dosegli meritev

poljubnega števila senzorjev temperature in svetlobe prek brezžičnega lastnega protokola.

Izdelali smo še podobne enote za vklop in izklop poljubnih tokokrogov s pomočjo releja ter

enote za krmiljenje oz. vrtenje nizkonapetostnih motorjev, ki smo jih potrebovali za

odpiranje in zapiranje radiatorskih ventilov ter premikanje sobnih žaluzij oz. rolet.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

iv

Modular system for home automatisation

Key words: wireless, control, Raspberry Pi, module, avtomotisation

UDK: [004.4+621.38.049.75]:681.586(043.2)

Abstract:

The graduation thesis discusses designing a system that enables arbitrary addition and

setting of various modules or units of the home automation system respectively by using a

web application. Such a system was created, which enabled measuring any number of

temperature and light sensors by using its own wireless protocol. Similar units for

switching on and off any circuits by using a relay and control units or rotation of low

voltage motors, which were needed to open and close heater control valves as well as

rolling shutter or roller blinds, were also created.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

v

KAZALO VSEBINE

1 Uvod .......................................................................................................................... 1

2 Opis uporabljene strojne opreme ............................................................................... 2

2.1 Raspberry Pi ....................................................................................................... 2

2.2 Mikrokrmilnik ....................................................................................................... 4

2.3 Temperaturni senzor ........................................................................................... 5

2.4 Brezžični modul nRF24L01+ ............................................................................... 8

3 Načrtovanje programske opreme centralne enote .....................................................14

3.1 Priprava računalnika RPi ...................................................................................14

3.2 Izdelava spletne strani .......................................................................................15

3.3 Zagon programov ob določenem času – Crontab ..............................................19

3.4 Princip delovanja programov za komunikacijo s sprejemno-oddajnimi moduli ....20

4 Sprejemno-oddajna enota za različne senzorje in krmiljenje tokokrogov ...................23

4.1 Načrtovanje strojne opreme ...............................................................................23

4.2 Izdelava tiskanega vezja ....................................................................................24

4.3 Načrtovanje programske kode za sprejemno-oddajne module ...........................28

4.4 Načrtovanje programske kode za centralno enoto – RPi ...................................29

5 Sprejemno-oddajna enota za krmiljenje nizkonapetostnih motorjev ..........................30

5.1 Načrtovanje strojne opreme ...............................................................................30

5.2 Izdelava tiskanega vezja ....................................................................................32

5.3 Načrtovanje programske kode za sprejemno-oddajne module ...........................35

5.4 Načrtovnaje programske kode za centralno enoto – RPi ...................................37

6 Analiza delovanja sistema ........................................................................................39

6.1 Analiza delovanja sprejemno-oddajne enote za merjenje temperature ter vklop in

izklop tokokroga ...........................................................................................................39

6.2 Delovanje sprejemno-oddajne enote za krmiljenje nizkonapetostnih motorjev za

regulacijo elektronskih ventilov .....................................................................................41

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

vi

7 Sklep ........................................................................................................................ 46

8 Literatura .................................................................................................................. 47

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

vii

Kazalo slik

Slika 2.1: Raspberry Pi ..................................................................................................... 2

Slika 2.2: GPIO pini .......................................................................................................... 4

Slika 2.3: Arduino UNO s kablom ICSP............................................................................. 5

Slika 2.4: Organizacija pomnilnika senzorja DS18B20 ...................................................... 6

Slika 2.5: Modul nRF24L01+ ............................................................................................. 8

Slika 2.6: Diagram prehajanja stanj brezžičnega modula nRF24L01+............................... 9

Slika 2.7: Diagram poteka pošiljanja in prejemanja podatkov ...........................................13

Slika 3.1: Putty prijavno okno ...........................................................................................14

Slika 3.2: Putty konzola ....................................................................................................14

Slika 3.3: Prikaz zasnove programske in strojne opreme za RPi ......................................15

Slika 3.4: Phpmyadmin, urejanje podatkovnih baz MySQL ..............................................16

Slika 3.5: Nastavitev statičnega IP naslova ......................................................................17

Slika 3.6: Izgled spletne aplikacije »Senzorji«, »Luči« in »Moduli«...................................18

Slika 3.7: Izgled spletne aplikacije....................................................................................19

Slika 3.8: Cron datoteka ...................................................................................................20

Slika 3.9: Komunikacija med centralno enoto in moduli/enotami ......................................21

Slika 3.10: Diagram poteka programske kode za RPi ......................................................22

Slika 4.1: Blokovni diagram strojne opreme za merjenje temperature ..............................23

Slika 4.2: Shematski prikaz vezja za merjenje temperature in krmiljenje releja ................25

Slika 4.3: Shematski prikaz vezja z dodatnimi prostimi pini in konektor za merilnik

temperature .....................................................................................................................26

Slika 4.4: Shematski prikaz napajanja iz USB priključka ..................................................26

Slika 4.6: Shematski prikaz vezja za vklop-izklop tokokroga ............................................27

Slika 4.7: 3D Izgled tiskane ploščice – PCB za merjenje temperature ..............................27

Slika 4.8: Diagram poteka za merjenje temperature na oddaljenem senzorju ..................28

Slika 5.1: Blokovni diagram za krmiljenje ventila ..............................................................30

Slika 5.2: H-bridge ...........................................................................................................31

Slika 5.3: Vezalni načrt krmiljenja ventila .........................................................................32

Slika 5.4: Shematski prikaz vezja »H-bridge« ..................................................................33

Slika 5.5: Shematski prikaz dodatnih stikal za ugotavljanje skrajne lege ..........................33

Slika 4.5: Shematski prikaz stikalnega – boost usmernika ...............................................34

Slika 5.6: Izgled tiskanine v 3D modelu ............................................................................34

Slika 5.7: Diagram poteka za krmiljenje nizkonapetostnih motorjev .................................35

Slika 5.8: Diagram poteka podprograma za krmiljenje motorja .........................................36

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

viii

Slika 5.9: Prikaz delovanja regulacije .............................................................................. 38

Slika 6.1: Prikaz delovanja modula prek serijskega vmesnika ......................................... 39

Slika 6.2: Prikaz delovanja programa RPi ........................................................................ 40

Slika 6.3: Prikaz delovanja modula za krmiljenje ventila .................................................. 44

Slika 6.4: Prikaz delovanja programa na RPi za krmiljenje ventila ................................... 45

Kazalo tabel

Tabela 2.1: Časovna tabela za pretvorbo poljubne resolucije senzorja .............................. 6

Tabela 2.2: Konfiguracijski register, ki hrani podatke o resoluciji senzorja DS18B20 ......... 6

Tabela 2.3: Tabela normalnih načinov delovanja brezžičnega modula nRF24L01+ ......... 11

Tabela 2.4: Izhodna moč RF ojačevalnika modula nRF24L01+ ....................................... 12

Tabela 5.1: Tabela dovoljenih stanj za vezje H-Bridge .................................................... 31

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

ix

Seznam uporabljenih kratic in simbolov

kbps (tudi kb/s) – kilobyte per second (slov.: kilobitov na sekundo)

Mbps (tudi mb/s) – megabyte per second (slov.: megabitov na sekundo)

RPi – Raspberry Pi računalnik

MHz – megaherci, enota za frekvenco

SoC – System on a Chip [2, str. 18]

GPU – Graphical Process Unit (slov.: grafična procesna enota)

RAM – Random Acess Memory (slov.: delovni pomnilnik, pomnilnik z naključnim

dostopom)

USB – Universal Serial Bus (slov.: univerzalno serijsko vodilo)

HDMI – High-Definition Multimedia Interface

DVI – Digital Visual Interface

NTSC – National Television System Committee

PAL – Phase Alternating Line

GPIO – General Purpose Input Output

PWM – Pulse Width Modulation (slov.: pulznoširinska modulacija)

DSI – Display Serial Interface (slov.: zaslonski vmesnik)

CSI – Camera Serial Interface (slov.: vmesnik za kamero)

ICSP – In Circuit Serial Programmer

PCB – Printed Circit Board (slov.: tiskanina oz. tiskana ploščica)

SSH – Secure Shell (slov.: protokol za upravljanje računalnika na daljavo)

LAMP – Linux Apache MySQL PHP

HTML – Hyper Text Markup Language

PHP – Hypertext preprocessor – Personal Home Page Tools

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

1

1 UVOD

V današnjem času je vse več zanimanja za »pametne« elektronske naprave, ki

sodobnemu človeku omogočajo in olajšajo dostop do spletnih vsebin. Brezžično krmiljenje

omogoča integracijo s spletnimi stranmi, ki so predvidene za nastavljanje željenih

vrednosti krmiljene veličine. Prednost brezžičnih naprav je, da so mobilnejše, dostopne

kadarkoli in kjerkoli v dosegu brezžičnega delovanja in jih lahko upravljamo z različnimi

napravami, kot so: pametni mobilni telefon, računalnik, tablični računalnik oz. vsaka

naprava, ki omogoča brezžično komunikacijo.

Diplomsko delo obravnava sistem brezžično krmiljenih različnih enot za avtomatizacijo

hiše, ki jih bomo zaradi obsežnosti predstavili v dveh kategorijah. V prvi katagoriji smo

združili sprejemno-oddajne enote, namenjene najrazličnejšim meritvam ter sprejemno-

oddajne enote za vklop in izklop tokokrogov s pomočjo releja. V našem primeru smo se

osredotočili predvsem na meritev temperature, vendar smo omenjene sprejemno-oddajne

enote zasnovali tako, da jih lahko z minimalnimi spremembami v programski kodi

uporabljamo še za meritev nekaterih drugih, električnih in neelektričnih veličin.

Programsko smo dodelali tudi zmožnost vklopa tokokroga za določen čas, s čimer smo

naš sistem razširili še na nekatera druga področja, kot je recimo odpiranje vhodnih vrat,

kjer ostane rele odprt za približno dve sekundi. V tretji kategoriji pa smo obravnavali

sprejemno-oddajne enote za krmiljenje nizkonapetostnih motorjev v poljubno smer. S temi

enotami smo izdelali brezžično krmiljen radiatorski ventil, ki ima možnost razširitve še na

druga področja uporabe.

V prvem delu diplomskega dela je opisana uporabljena strojna oprema, ki nam na kratko

prikaže posamezne elektronske sklope, ki so bili uporabljeni v našem diplomskem delu.

To so računalnik Raspberry Pi, mikrokrmilnik, senzor temperature in brezžični modul. V

drugem delu smo na kratko opisali pripravo računalnika Raspberry Pi za delovanje in

prikaz spletne strani. Nato smo opisali še strojno in programsko opremo za vsak

sprejemno-oddajni modul posebej.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

2

2 OPIS UPORABLJENE STROJNE OPREME

2.1 Raspberry Pi

Raspberry Pi (v nadaljevanju RPi) je računalnik (slika 2.1) v velikosti kreditne kartice in

tehta le nekaj gramov. Njegova prednost je v majhnosti in zmožnostih, ki jih ponuja za

razvijalce programske in strojne opreme. Na uradni spletni strani fundacije Raspberry Pi

(na naslovu: http://www.raspberrypi.org/ [8. 9. 2014]) lahko zasledimo, da so trenutno na

voljo že tri različice računalnika, sami pa lahko izberemo najbolj primernega za svojo

uporabo. Osnovni model »A« vsebuje en USB konektor in ima za 256 MB delovnega

pomnilnika, ki si ga deli z grafičnim procesorjem. Zmogljivejši model »B« ima vgrajena dva

USB konektorja in 512 MB delovnega pomnilnika ter konektor-RJ45 za povezavo v splet

oz. omrežje. Pojavil se je tudi najnovejši model »B+«, ki ima razširjen delovni pomnilnik na

1 GB, z novim 4-jedrnim procesorjem pa omogoča večopravilnost pri frekvenci 1 GHz. Na

računalniku RPi teče operacijski sistem Linux in to ga naredi primernega za razvijanje

najrazličnejše programske opreme. Z ustreznimi ukazi in nameščenimi orodji za delo s

splošnonamenskimi vhodno-izhodnimi pini omogoča programiranje v različnih

programskih jezikih, kot so: Python, C/C++, Ruby, Java, Perl ipd. Tako komunicira s

poljubno strojno opremo.

GPIO – splošnonameski

vhodno/izhodni priključki

RCA video izhod

USB 2.0

Mrežni konektorHDMI izhodBroadcom

BCM2835, ARM11

(CPU, GPU, RAM)

CSI konektor

DSI konektor

Reža za SD

spominsko

kartico (spodaj)

Audio izhod

Indikacijske LED

diode

Napajalni USB

mikro B konektor

Slika 2.1: Raspberry Pi

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

3

Opis posameznih sestavnih delov RPi

Srce RPi-ja (modela B) je procesor ARM, ki ga najdemo tudi v telefonih Apple iPhone 3G

in bralniku Kindle 2.1 Procesor je 32-bitni in deluje pri frekvenci 700 MHz, ki jo lahko z

ustreznim hlajenjem povečamo na 1 GHz. Na samem procesorju je tudi grafični procesor

– GPU in delovni pomnilnik – RAM. Takemu zaključnemu sistemu, kjer najdemo vse tri

enote na enem čipu, pravimo tudi SoC [2, str. 18].

USB vodilo – omogoča priklop tipkovnice in miške ter nekaterih drugih zunanjih perifernih

in drugih enot, ki morajo biti kompatibilne s procesorsko arhitekturo in s potrebnimi

gonilniki za operacijski sistem Linux.

HDMI konektor – služi kot digitalni video in audio izhod. Podprtih je 14 različnih resolucij

za prikaz na ekranu. Z adapterjem HDMI na DVI lahko naredimo RPi še bolj uporaben, saj

lahko priklopimo tudi starejši računalniški monitor [2, str. 20]. Prednost HDMI vodila na

računalniku RPi je tudi ta, da z distribucijo Linuxa »Raspbmc« lahko naredimo domači

hišni kino, ki nam omogoča sprotno prenašanje video vsebin na USB ključ ali SD kartico

ter gledanje video vsebin v popolni resoluciji.2 Omogoča tudi sprotno3 prenašanje video in

TV vsebin s spleta.

Kompozitni video izhod – zagotavlja kompozitni NTSC ali PAL video signal, ki ga lahko

razširimo tudi na zastareli SCART konektor. Hkrati ne smemo in ne moremo uporabljati

oba video izhoda (HDMI in kompozitni video izhod), ker si delita skupni priključek na čipih

računalnika.

Analogni audio izhod – je standardni 3,5 mm analogni audio konektor, namenjen za

bremena z visoko impedanco. To pomeni, da na slušalkah ali zvočnikih brez napajanja ne

dobimo dovolj dobrega zvoka, zato je priporočena uporaba zvočnikov z napajanjem ali pa

se raje poslužujemo HDMI vodila [2, str. 20].

GPIO – računalnik RPi ponuja vmesnik na nižji ravni, namenjen neposredni povezavi

različnih čipov in elektronskih vezij neposredno na priključne pine mikroprocesorja. Pini so

v dveh linijah (2 x 13 pinov) in vključujejo vodila SPI, I2C, serijski UART, napajanje 3,3 V in

5 V ter analogne in digitalne vhodno-izhodne priključne pine. Ti pini niso »plug and play«

in jih je potrebno ustrezno zaščititi ter skrbno uporabljati, saj so povezani neposredno s

1 Bralnik Amazon Kindle, branje knjih v digitalni obliki

2 Angl.: Full HD, Full High Definition.

3 Angl.: Stream.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

4

procesorjem, ki ga lahko ob nepravilni uporabi trajno poškodujemo. Pini uporabljajo le 3,3

V logiko in niso kompatibilni z 5 V. Na sliki 2.2 je prikazana uporaba posameznih

priključnih pinov RPi-ja [5].

Slika 2.2: GPIO pini4

DSI konektor – omogoča priklop LCD-ja ali OLED zaslona direktno na RPi prek

ploščatega kabla.

CSI konektor – omogoča priklop modula s kamero direktno na RPi prek ploščatega

kabla.

2.2 Mikrokrmilnik

Pri izbiri mikrokrmilnika smo se osredotočili predvsem na prijazno programsko okolje, ki

ga ponuja proizvajalec razvojnih plošč Arduino. Naša razvojna ploščica se je imenovala

Arduino UNO (slika 2.3), na njej pa imamo mikrokrmilnik proizvajalca Atmel, tipa:

Atmega328P-AU. Mikrokrmilnik ima 14 digitalnih vhodno/izhodnih pinov, od teh jih 6

omogoča PWM modulacijo. Deluje s taktom 16 MHz, omogoča zaporedno (Rx, Tx) in SPI

komunikacijo in ima 6 analognih 10-bitnih vhodov [6].

Omeniti velja tudi, da smo uporabili en konektor za programiranje in istočasno za

priključitev brezžičnega modula, saj smo na račun tega prihranili na uporabi prostora

tiskanine PCB.

4 Dostopno na: http://docs.biicode.com/raspberrypi/rpi-howto.html#raspberry-pi-gpio-pin-layout [7. 9. 2014].

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

5

Kabel za programiranje

mikrokrmilnikov prek ICSP vodila

Slika 2.3: Arduino UNO s kablom ICSP

2.3 Temperaturni senzor

Za temperaturni senzor smo izbrali digitalni senzor temperature DS18B20, proizvajalca

Maxim Integrated,5 ki na svojem izhodnem priključku daje digitalno vrednost izmerjene

temperature od 9 do 12 bitov. Vgrajeno ima tudi funkcijo neizbrisljivega in uporabniško

nastavljivega alarmiranja spodnje in zgornje temperaturne meje. Komuniciranje poteka

prek »One-wire« vodila, ki zahteva samo en priključni pin, poleg napajalnih priključkov za

povezavo z mikrokrmilnikom ali katerim drugim računalniškim sistemom. Meri v

temperaturnem območju od –55 °C do +125 °C z natančnostjo ±0.5 °C med –10 °C in +85

°C. Senzor ima tudi zmožnost samonapajanja6 prek omenjenega vodila, tako da za svoje

delovanje ne potrebuje klasičnega napajanja.

One-wire komunikacija omogoča priključitev različnih družin polprevodnikov, kar pomeni,

da na isto vodilo lahko priključimo tudi druge tipe senzorjev ali kakšna druga digitalna

vezja, ki za svoje delovanje uporabljajo takšno vrsto vodila. Naš izbrani temperaturni

senzor ima družinsko kodo 0x28; vsak od senzorjev, priključenih na vodilo, v lastnem

notranjem pomnilniku vsebuje še svojo unikatno 64-bitno kodo. Mikrokrmilnik ima nadzor

nad podatkovnim vodilom, zato ga bomo imenovali master. Senzorje, ki samo pošiljajo

zahtevane podatke od masterja po vodilu, pa bomo imenovali slave oz. sužnji na

podatkovnem vodilu.

Notranji pomnilnik je zgrajen iz začasnega pomnilnika – SRAM in neizbrisljivega

EEPROM pomnilnika, ki hrani podatke o zgornji – TH in spodnji – TL temperaturi za

5 Prej podjetje Dallas Semiconductor.

6 Angl.: parasite power.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

6

alarmiranje ter konfiguracijski register, ki hrani podatek o željeni resoluciji senzorja.

Zasnova takega pomnilnika je prikazana na spodnji sliki Slika 2.4.

Slika 2.4: Organizacija pomnilnika senzorja DS18B20

»Byte 0« in »Byte 1« skupaj predstavljata podatek o temperaturi, vendar brez predznaka

in sta samo bralni lokaciji v pomnilniku. »Byte 2«, »Byte 3« in »Byte 4« omogočajo dostop

do EEPROM pomnilnika. Odzivni čas senzorja je največ 750 ms za pretvorbo izmerjene

temperature v 12-bitno dolgo besedo. Tabela 2.1 predstavlja odzivni čas, ki je potreben za

pretvorbo temperature za poljubno izbrano resolucijo senzorja. V tabeli Tabela 2.2 je

predstavljena struktura konfiguracijskega registra, ki hrani omenjeni podatek na petem in

šestem bitu, vsi ostali biti pa ne smejo biti prepisani, ker jih senzor uporablja za svoje

lastno delovanje.

Tabela 2.1: Časovna tabela za pretvorbo poljubne resolucije senzorja

R1 R0 Resolucija [bitov] Maksimalni čas pretvorbe [ms]

0 0 9 93,75

0 1 10 187,5

1 0 11 375

1 1 12 750

Tabela 2.2: Konfiguracijski register, ki hrani podatke o resoluciji senzorja DS18B20

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

0 R1 R0 1 1 1 1 1

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

7

Za komunikacijo s temperaturnim senzorjem smo uporabili obstoječo knjižico OneWire.h

za mikrokrmilnik, opisan v prejšnjem poglavju 2.2, saj je nanašajoč se na knjižico

najustreznejša za našo komunikacijo z senzorjem. Branje temperaturnih senzorjev poteka

v treh korakih z ukazi, ki jih s pomočjo prej omenjene knjižice lahko pošiljamo na vodilo:

inicializacija – na vodilo pošljemo »reset« signal, da se senzorji na vodilu

odzovejo;

ukazi za delo s fiksnim pomnilnikom ROM (ROM COMMANDS) – ti ukazi operirajo

z unikatnimi 64-bitnimi ROM kodami in omogočajo gospodarju – mikrokrmilniku

detektiranje vseh sužnjev na vodilu – senzorjev. Možni ukazi so: SEARCH ROM

[F0h], READ ROM [33h], MATCH ROM [55h], SKIP ROM [CCh] in ALARM

SEARCH [ECh];

funkcijski ukazi – po uspešno naslovljenih in detektiranih senzorjih iz prejšnje

točke, z naslednjimi ukazi pišemo in beremo iz začasnega pomnilnika senzorja.

Razpoložljivi ukazi so: CONVERT T [44h], WRITE SCRATCHPAD [4Eh], READ

SCRATCHPAD [BEh], COPY SCRATCHPAD [48h], RECALL E2 [B8h], READ

POWER SUPPLY [B4h].

Spodaj smo podrobneje opisali uporabljene in potrebne ukaze za branje enega senzorja:

0xCC – Skip ROM Mikrokrmilnik lahko s tem ukazom dostopa do vseh senzorjev na vodilu

brez pošiljanja ROM kode, da bi dobil odziv posameznega senzorja. S tem in naslednjim

ukazom povzročimo, da vsi senzorji istočasno pretvorijo in pripravijo podatek o

temperaturi, vendar na ta način ne smemo brati podatkov iz pomnilnika senzorjev, saj

bodo vsi senzorji hkrati na vodilo pošiljali podatke, zato je ta opcija primerna samo za en

senzor na vodilu [3, str. 11].

0x44 – Convert T S tem ukazom sprožimo notranjo pretvorbo temperature v digitalno

obliko in jo shranimo v pomnilnik EEPROM-a na senzorju. Pri napajanju, kot smo ga

uporabili, je med pretvorbo na podatkovnem pinu senzorja postavljen nizek logični nivo;

po uspešni pretvorbi, ko je podatek pripravljen za prenos, pa se na podatkovnem pinu

postavi visok logični nivo in s tem mikrokrmilniku omogočimo začetek branja 2 bajta dolge

besede [3, str. 11].

0xBE – Read Scratchpad S pošiljanjem tega kodnega ukaza mikrokrmilniku omogočimo,

da prebere vsebino celotnega EEPROM pomnilnika na senzorju, kjer se hranijo prej

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

8

pripravljeni in pretvorjeni podatki o temperaturi. Branje se začne pri LSB7 bajtu 0 in se

nadaljuje vse do 9. bajta v pomnilniku. Mikrokrmilnik lahko kadarkoli prekine bralno rutino,

če ne potrebuje ostalih podatkov v pomnilniku senzorja [3, str. 11].

2.4 Brezžični modul nRF24L01+

Za realizacijo brezžičnega prenosa smo si zamislili enega trenutno najbolj priljubljenih in

cenovno dostopnih brezžičnih modulov, proizvajalca Nordic Semiconductor, tipa

nRF24L01+ (slika 2.5). Modul se ponaša z delovanjem na frekvečnem pasu 2,4 GHz z

možnostjo različnih hitrosti prenosa podatkov: 250 kbps, 1 Mbps in 2 Mbps. Zaradi nizke

porabe energije in vgrajenega regulatorja napetosti je modul vsesplošno uporaben

predvsem na področjih, kjer je potrebno baterijsko napajanje. Deluje pri napajalni

napetosti med 1,9 V in 3,6 V. Frekvenčno področje (od 2,4 GHz do 2,525 GHz) je

razdeljeno na 126 RF8 kanalov.

Slika 2.5: Modul nRF24L01+9

Za lažje razumevanje delovanja brezžičnega modula je na spodnji sliki Slika 2.6 je

predstavljen diagram prehajanja stanj. Obstajajo trije dovoljeni načini delovanja oz.

prehajanja stanj. Ti načini so:

priporočeni način – je priporočen za normalno delovanje (prikazano z odebeljenimi

črtami in krogi),

7 Angl.: Least significant bit.

8 Radijsko frekvenčnih.

9 Slika je dostopno na: http://www.elecfreaks.com/wiki/index.php?title=2.4G_Wireless_nRF24L01p [8. 9.

2014].

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

9

možni način – ni uporabljen med normalnim delovanjem (prikazano s polnimi

črtami in krogi); večino teh načinov omogoča Shock Burst način podjetja Nordic

Semiconductor, ki ga bomo opisali posebej, in

prehodno stanje – ki je omejeno na določen čas med zagonom oscilatorja modula

in zanke PLL (prikazano s tankimi prekinjenimi črtami in krogi).

Slika 2.6: Diagram prehajanja stanj brezžičnega modula nRF24L01+

Kratek opis posameznih sklopov zgornjega diagrama

Način izklopa/nedelovanja Power Downa – omogočena je minimalna tokovna poraba

brezžičnega modula, medtem ko so vsi podatki v registru še na voljo za branje in pisanje,

vodilo SPI pa ostaja omogočeno za komunikacijo z mikrokrmilnikom. V ta način delovanja

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

10

postavimo modul z nastavitvijo PWR_UP bita v konfiguracijskem registru CONFIG na

nizki logični nivo.

Način spanja Standby – s postavitvijo PWR_UP bita v konfiguracijskem registru CONFIG

na visok logični nivo se postavi brezžični modul v »Standby-I« način. Ta način omogoča

minimizacijo povprečne tokovne porabe in hiter zagonski čas nazaj v normalno delovanje.

V normalno delovanje se postavi, ko je priključni pin CE postavljen na visok logični nivo, v

»Standby-I« način pa se vrne, ko je na CE pinu postavljen nizki logični nivo iz načina

branja RX ali pisanja TX. V prehod na »Standby-II« način delovanja mora CE pin ostati na

visokem logičnem nivoju, pomnilnik TX FIFO pa mora biti prazen. Tokovna poraba je v

tem primeru nekoliko večja kot prej, vendar ko so razpoložljivi novi podatki za prenos v

pomnilnik modula, imenovan TX FIFO, zanka PLL takoj začne s prenosom podatkovnega

paketa.

Bralni način RX – je aktivni način delovanja modula, ko je ta uporabljen kot sprejemnik. Za

prehod v stanje sprejemanja podatkovnih paketov mora imeti postavljene bite: PWR_UP,

PRIM_RX in pin CE, postavljeni na visok logični nivo. Modul v tem načinu konstantno išče

veljavne pakete za prenos v svoj pomnilnik. Ko je paket za prenos na voljo (ujemata se

naslov in CRC10), se prenese celotna vsebina na prosto lokacijo v pomnilniku RX FIFO. V

primeru, da je pomnilnik RX FIFO poln, se podatki zavržejo. Modul ostane v bralnem

načinu tako dolgo, dokler ga mikrokrmilnik ne postavi v enega od načinov delovanja:

»Standby-1« ali »power down«.

Pisalni način TX – omogoča prenos podatkov na druge brezžične module, nadzorovane s

pomočjo mikrokrmilnika. Bit PWR_UP mora biti postavljen na visok logični nivo, bit

PRIM_RX na nizek logični nivo, na priključni pin CE pa mora biti priveden visok logični

pulz za vsaj 10 µs. Modul ostane v pisalnem načinu tako dolgo, dokler vsi podatki niso

uspešno preneseni na sprejemne module. Če je priključni pin CE postavljen na nizki

logični nivo, se modul postavi nazaj v način »standy-I«, sicer status v registru TX FIFO

določa naslednje dejanje oz. nov prenos podatkov na oddaljeno enoto. Če je pomnilnik TX

FIFO prazen, se modul postavi v način delovanja »standby-II«. Spodaj je predstavljena

tabela za konfiguriranje bitov, opisanih za normalni način delovanja:

10

Angl.: Cyclic redundancy check.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

11

Tabela 2.3: Tabela normalnih načinov delovanja brezžičnega modula nRF24L01+

Način PWR_UP

register

PRIM_RX

register

CE vhodni pin Stanje FIFO

RX 1 1 1 -

TX 1 0 1 Podatki na razpolago v TX

FIFO. Izpraznijo se vsi

podatki.

TX 1 0 Visoki pulz za

najmanj 10 µs.

Podatki na razpolago v TX

FIFO. Izprazni se en nivo

podatkov.

Standby-II 1 0 1 TX FIFO je prazen.

Standby-I 1 - 0 Ni novih podatkov za

pošiljanje.

Power Down 0 - - -

Air data rate – predstavlja hitrost prenosa podatkov po zraku. Nižja hitrost pomeni boljšo

občutljivost in bolj zanesljivi prenos, medtem ko višja hitrost nekoliko zmanjšuje tokovno

porabo modula ter verjetnost »trka podatkov« med prenosom po zraku. Hitrost prenosa

podatkov smo nastavili v registru RF_SETUP in znaša 250 kbps.11 Druge možnosti za

nastavitev hitrosti prenosa podatkov so še 1 Mbps in 2 Mbps. Za pravilno delovanje

morata biti oddajna in sprejemna enota nastavljeni na isto vrednost.

RF channel frequency – frekvenca kanala je določena s širino razpoložljivega

frekvenčnega pasu, in sicer: 1 MHz za hitrost prenosa 250 kbps ter 1 Mbps in 2 MHz za

hitrost prenosa 2 Mbps. Ker je frekvenčna širina v slednjem primeru večja od resolucije

RF kanala, mora biti razmak med kanaloma širine vsaj 2 MHz, da ne prihaja do motenj

med kanali. Pri prenosu 250 kbps in 1 Mbps je pasovna širina enaka ali manjša od

resolucije RF kanala, zato pri teh prenosih ne prihaja do tovrstnih težav. Frekvenca RF

kanala se nastavi v registru RF_CH in se preračuna po naslednji enačbi (2.1):

𝐹0 = 2400 + 𝑅𝐹_𝐶𝐻 [𝑀𝐻𝑧] (2.1)

11

Kilobitov na sekundo; angl.: Kilo bits per second.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

12

PA control – brezžičnemu modulu lahko nastavimo tudi izhodno moč na antenskem

priključku. V oddajnem načinu delovanja imamo možnost nastavitve štirih različnih

programsko določenih korakov ojačanja izhodnega antenskega ojačevalnika. Ta

parameter je shranjen v registru RF_SETUP, ime bita je RF_PWR, tabela z možnimi

nastavitvami je prikazana spodaj (Tabela 2.4).

Tabela 2.4: Izhodna moč RF ojačevalnika modula nRF24L01+

SPI RF-SETUP (RF_PWR) RF output power DC current consuption

11 0 dBm 11,3 mA

10 – 6 dBm 9,0 mA

01 –12 dBm 7,5 mA

00 –18 dBm 7,0 mA

Enhanced ShockBurst™ – je aplikacijski nivo implementacije delovanja in je podoben

tistemu, kot ga ima vsak usmerjevalnik z več aplikacijskimi nivoji (angl. layers). Omogoča

avtomatsko sestavljanje podatkov in prenos potrditvenih bitov o uspešni transakciji

podatkovnega paketa med sprejemno-oddajnimi moduli. Omogoča tudi ponovno pošiljanje

podatkov v primeru neuspeha in dinamični prenos različno dolgih podatkovnih paketov.

Bistveno bolj je izkoriščena tudi tokovna poraba modula in precej zmanjšana obremenitev

mikrokrmilnika, z namenom, da modul sam poskrbi za uspešno transakcijo podatkov brez

nadzorovanja mikrokrmilnika. Omogočena je tudi možnost uporabe šestih podatkovnih

pip,12 kar pomeni, da lahko prejete podatke preberemo hkrati za šest sprejemno-oddajnih

enot. Mi smo v diplomskem delu naredili takšen sistem, da omogoča uporabo dveh »pip«,

in sicer eno za pošiljane podatkov, drugo pa za branje.

S spodnjim diagramom (Slika 2.7) smo prikazali delovanje modula za pošiljanje in

sprejemanje podatkov na centralni enoti računalnika RPi. Zaradi motenega delovanja

modula, predvsem na račun napajanja in debelih sten med notranjimi prostori v hiši, smo

implementirali zanko, kjer se v primeru neuspešnega prenosa podatka oz. neodzivanjem

sprejemno-oddajne enote ta pošlje ponovno, vse do petkrat. Po uspešno poslanem

podatku počakamo dovolj dolgo, da sprejemno-oddajna enota pripravi nove podatke, ki

nam jih pošlje nazaj na centralno enoto. Na koncu v vsakem od napisanih programov

preverimo, če smo dobili vrnjene ustrezne podatke, in sicer tako, da preverimo, če so se

glede na prejšnje prebrane podatke ti prepisali.

12

MultiCeiver™.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

13

ZAČETEK

Inicializacija modula in

nastavitev kanala

Ponovitve++;

prejsnjiPodatek = podatek;

Ponovitve <= 5

Pošljemo podatek na

oddaljeno enoto/modul za

pridobivanje podatkov

Ali je podatek poslan?

Izpis

napake na

ekranu

Na podatek čakamo (200 ms)

Ali je podatek na voljo?

Izpis

napake na

ekranu

Preberemo podatek oddaljene

enote/modula

Izpis prejetega

podatka na ekranu

KONEC

DA

NE

DA

NE

Dokler so ponovitve manjše

ali enake 5

Čakamo 200ms na podatek

Povečanje ponovitev za 1,

Prepis starih podatkov za poznejše preverjanje

Slika 2.7: Diagram poteka pošiljanja in prejemanja podatkov

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

14

3 NAČRTOVANJE PROGRAMSKE OPREME

CENTRALNE ENOTE

3.1 Priprava računalnika RPi

Na uradni spletni strani fundacije Raspberry Pi najdemo vse možne in podprte operacijske

sisteme, ki so prilagojeni za delovanje na računalniku RPi. Za začetnike je priporočena

različica Noobs, ki ima dobro urejeno grafično ozadje in je ni težko uporabljati, saj nas

vodič vodi skozi celotno namestitev željene distribucije operacijskega sistema Linux.

Sami smo izbrali priporočeno in osnovno različino Raspbian, ki temelji na operacijskem

sistemu Debian Linux. Za minimalno delovanje potrebujemo le računalnik RPi, adapter za

napajanje, ki mora konstantno zagotavljati 5 V napetosti in ima tokovno zmogljivost vsaj 1

A ter omrežni kabel za povezavo v obstoječe omrežje. Omenjena distribucija ima že

omogočen protokol SSH, tako da smo se lahko povezali na računalnik RPi z znanim IP

naslovom, uporabniškim imenom in geslom.

Ob prvem zagonu smo v nastavitvah usmerjevalnika13 preverili IP naslov računalnika RPi,

da smo se lahko povezali nanj prek programa »putty«, kot prikazuje slika 3.1. Na sliki 3.2

je prikazan izgled konzole po uspešni prijavi (uporabniško ime ob prvem zagonu je pi,

geslo pa raspberry).

Slika 3.1: Putty prijavno okno Slika 3.2: Putty konzola

13

Angl.: Router.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

15

Za delo s konzolnimi ukazi smo v prilogi A pripravili nekaj najbolj osnovnih in pogostih

ukazov.

Na sliki Slika 3.3 je prikazana programska zasnova računalnika RPi (označena z zelenim

ozadjem) in strojna zasnova (označena z vijoličnim ozadjem). Na operacijskem sistemu je

nameščen spletni strežnik Apache in ostali potrebni programi za delovanje spletne strani

oz. aplikacije za prikaz in nastavitve. Sistemski proces za zaganjanje ob določenem času

– Crontab skrbi za dovolj pogosto izvajanje programske kode, ki komunicira z brezžičnimi

moduli. Več o delovanju posameznih sklopov je zapisano v naslednjih poglavjih.

Crontab

Programska koda za branje

senzorjev

Programska koda za vklop in

izklop različnih tokokrogov

Podatkovna baza

MySQL

Spletni strežnik: Apache

PHP

Spletna stran s prilagojenim

prikazom za mobilne

naprave (HTML, JavaScript

mobile, Ajax ...)

Računalnik

Raspberry Pi

Programska koda za krmiljenje

nizkonapetostnih motorjev

Programska oprema Strojna oprema

Priključni pini GPIO

Brezžični modul

nRF24L01+

Slika 3.3: Prikaz zasnove programske in strojne opreme za RPi

3.2 Izdelava spletne strani

Za lažje nastavljanje temperature v prostoru in nekaterih potrebnih nastavitev za pravilno

delovanje radiatorskega ventila smo si zamislili spletno stran z uporabniško prijaznim

grafičnim vmesnikom. V osnovi je bila HTML koda dovolj, vendar smo želeli bolj

dinamično spletno stran z bazo podatkov in potrebna je bila namestitev nekaterih aplikacij

za delovanje spletnega strežnika. Ti aplikaciji sta Apache, ki skrbi za izvajanje PHP kode,

in podatkovna baza MySQL. Takemu spletnemu strežniku, ki je zagnan na operacijskem

sistemu Linux, pravimo tudi LAMP.

Namestitev potrebnih programskih paketov za Apache in PHP je možna s konzolnimi

ukazi:

sudo apt-get install apache2 php5 libapache2-mod-php5;

sudo service apache2 restart (ukaz za zahtevan ponovni zagon spletnega

strežnika).

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

16

Ukazi za namestitev podatkovne baze MySQL so:

sudo apt-get install mysql-server mysql-client php5-mysql;

sudo apt-get install libmysqlclient-dev (namestitev teh programskih paketov je

potrebna za dostop programskih kod C/C++, Python, Java, Perl, Ruby, PHP ipd.

do podatkovne baze).

Ukaz za namestitev spletnega urejevalnika podatkovnih baz phpmyadmin je:

sudo apt-get install phpmyadmin;

sudo nano /etc/apache2/apache2.conf (na koncu datoteke dodamo: Include

/etc/phpmyadmin/apache.conf in datoteko shranimo. Brez te vrstice na koncu

dostop prek brskalnika ni mogoč.);

sudo service apache2 restart (potreben ponovni zagon spletnega strežnika

Apache).

Izgled spletne strani za urejanje podatkovnih baz je prikazan na sliki 3.4.

Slika 3.4: Phpmyadmin, urejanje podatkovnih baz MySQL

Prednost urejanja podatkovnih baz iz spletnega vmesnika je predvsem ta, da si v tabelah

podatke lažje predstavljamo in da imamo lepši pregled nad celotno strukturo podatkovnih

baz. Zelo dobrodošla je tudi možnost testiranja SQL stavkov.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

17

Zaradi nameščenega spletnega strežnika in zaradi dostopa preko SSH protokola smo

nastavili tudi statični IP naslov. To smo storili z ukazom v konzoli: sudo nano

/etc/network/interfaces, ki nam je odprl urejevalnik besedilnih datotek, da smo lahko

preuredili datoteko za naše potrebe. Slika 3.5 prikazuje naše nastavitve, ki veljajo po

vsakem ponovnem zagonu računalnika RPi.

Slika 3.5: Nastavitev statičnega IP naslova

Za izdelovanje spletne strani nismo potrebovali posebnih orodij. Dovolj je bil že urejevalnik

v konzolnem načinu. Istočasno smo uporabljali tudi odprtokodni in brezplačni program

Notepad++, ki omogoča urejanje datotek na oddaljenem spletnem strežniku in je med

pisanjem programske kode dosti preglednejši.

Naša spletna stran/aplikacija je napisana v HTML kodi, vključili pa smo tudi PHP kodo, saj

brez nje nismo mogli izvesti branja in pisanja podatkov v podatkovno bazo MySQL. V

spletno kodo smo vključili tudi JavaScript, Jquerry Mobile in Ajax, da smo dosegli več

dinamike in omogočili pravilen prikaz na mobilnih napravah, saj so ekrani na mobilnih

napravah bistveno manjši in rokovanje bistveno drugačno, kot smo ga vajeni na

računalniku.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

18

Na sliki 3.6 so prikazane tri spletne strani. Prva stran je imenovana »Senzorji«. Na njej

prikazujemo zadnje ažurne podatke o meritvah, lahko pa tudi brišemo in dodajamo nove

enote za meritve željenih veličin. Druga spletna stran je imenovana »Luči« in prikazuje

stanje tokokrogov. S klikom oz. spremembo stanja spremenimo podatek v začasni bazi

podatkov MySQL, da ne prihaja do vedno novih prenosov podatkov med enotami. Na tretji

spletni strani, poimenovani »Moduli«, smo omogočili dodajanje poljubne oz. željene

vrednosti temperature za poljubno dnevno časovno obdobje. Prikazano je tudi zadnje oz.

trenutno stanje enote.

Slika 3.6: Izgled spletne aplikacije »Senzorji«, »Luči« in »Moduli«

S klikom na katerega izmed gumbov za dodajanje ali brisanje se odpre novo okno z vsemi

potrebnimi polji za vnos željenih podatkov. Slika 3.7 prikazuje izgled okna za dodajanje

novega senzorja. Zraven so še slika glavnega menija in slika z nekaj splošnimi

informacijami o aplikaciji.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

19

Slika 3.7: Izgled spletne aplikacije

3.3 Zagon programov ob določenem času – Crontab

»Cron jobs« je orodje, ki lahko v ozadju med sistemskimi procesi deluje avtomatsko (brez

uporabnikovega ukaza) in zaganja željene aplikacije ob določenem času. Opravila lahko

nastavimo v eni organizirani datoteki, ki spominja na tabelo.

S konzolnim ukazom: crontab –l lahko prikažemo izgled cron datoteke na zaslonu, z

ukazom: crontab –e pa jo odpremo za urejanje. Izgled naše »cron« datoteke prikazuje

Slika 3.8.

Sintaksa take datoteke je prikazana spodaj.

* * * * * ukaz, ki ga želimo izvesti (tudi program)

Mesec (od 1 do 12)

Dan v mesecu (od 1 do 31)

Ure (od 0 do 23)

Minute (od 0 do 59)

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

20

Slika 3.8: Cron datoteka

3.4 Princip delovanja programov za komunikacijo s sprejemno-

oddajnimi moduli

Komunikacija med brezžičnimi sprejemno-oddajnimi moduli in centralno enoto poteka po

prikazu na sliki Slika 3.9, in sicer v obeh smereh. Podatkovne pakete pošiljamo iz

centralne enote do modulov v sistemu, ti pa nam vrnejo željeni podatkovni paket. Gre za

najbolj preprosto komunikacijo, kjer morajo biti vsi moduli sistema ves čas v zračnem

dosegu s centralno enoto, sicer ta ne dobi željenih podatkov od brezžičnega modula.

Bistveno boljša možnost bi bila izdelava takšne komunikacije, kjer bi moduli med seboj

lahko komunicirali in pošiljali podatke naprej do drugih tarčnih modulov ter nazaj, vse do

centralne enote. Zaradi obsežnosti in že tako velike programske kompleksnosti se nismo

odločili za takšno vrsto komunikacije.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

21

Centralna enota –

računalnik RPi

ModulModul

Moduli za branje

podatkov

SENZORJEV

ModulModul

Moduli za vklop-

izklop

tokokrogov

ModulModul

Moduli za

krmiljenje

nizkonapetostnih

motorjev

Slika 3.9: Komunikacija med centralno enoto in moduli/enotami

Delovanje vseh programov na računalniku RPi, napisanih za komunikacijo z brezžičnimi

sprejemno-oddajnimi moduli, poteka po spodnjem diagramu (Slika 3.10). Programi se

med seboj razlikujejo le v pripravi podatkov, ki jih pošiljajo na oddaljeno enoto (označeno

z zeleno barvo), in v obdelavi pridobljenih podatkov, ki jih vrnejo nazaj iz oddaljenega

modula (označeno z modro barvo).

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

22

ZAČETEK

Stevec = 0;

Zadnji modul v bazi

podatkov MySQL?

NE

DA

KONEC

Branje podatkov o

modulu iz baze

podatkov MySQL

Komunikacija oz. prenos

podatkov na oz. z oddaljene enote/

modula prek brezžičnega modula

nRF24L01+

Stevec ++;

Priprava podatkov in

spremenljivk za komunikacijo z

oddaljeno enoto/modulom

Uspešno prejeti

željeni podatki?

Vpis USPEŠNO

pridobljenih

podatkov v bazo

podatkov MySQL

Vpis NAPAKE v

bazo podatkov

MySQL

DA

NE

Če ni razpoložljivih podatkov se program zaključi

Inicializacija za začetek

branja baze MySQL

Naslednja

enota/modul

Preverjanje, če so na

razpolago podatki za naslednjo

enoto/modul

Slika 3.10: Diagram poteka programske kode za RPi

Za lažje razumevanje osnovnega delovanja smo korake opisali po točkah:

1. branje osnovnih podatkov o sprejemno-oddajnem modulu iz podatkovne baze

podatkov;

2. konfiguriranje brezžičnega modula oz. nastavitev frekvenčnega kanala modula, da

se željena sprejemno-oddajna enota z istim frekvenčnim kanalom lahko odzove;

3. priprava podatkov za pošiljanje;

4. pošiljanje pripravljenih podatkov iz točke tri na sprejemno-oddajno enoto;

5. branje podatkovnega paketa od oddaljenega sprejemno-oddajnega modula;

6. analiza prejetega podatka in shranjevanje le-tega v bazo podatkov, ali vpis o

napaki v komunikaciji v primeru, da se enota ni odzvala;

7. skok nazaj na točko ena ali konec programa, če smo obdelali že vse module, ki so

bili v podatkovni bazi.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

23

4 SPREJEMNO-ODDAJNA ENOTA ZA RAZLIČNE

SENZORJE IN KRMILJENJE TOKOKROGOV

4.1 Načrtovanje strojne opreme

Naredili smo brezžični sprejemno-oddajni modul oz. enoto, namenjeno za meritev

različnih električnih veličin s pomočjo senzorjev ter za vklapljanje in izklapljanje poljubnih

električnih tokokrogov s pomočjo releja. Senzor je elektronski element, tudi naprava, ki je

zmožna neelektrično veličino pretvoriti v ustrezno električno. Prebrani podatki iz senzorja

so odvisni od notranje zgradbe čipa in so lahko analogni ali digitalni odčitki določene

neelektrične veličine. Analogne senzorje moramo pred uporabo ustrezno umeriti; paziti

moramo tudi na linearnost takih senzorjev, da ne prihaja do napačnih meritev. Digitalni

senzorji imajo bistveno več prednosti. Ena od njih je uporaba znanih protokolov za

komunikacijo z mikrokrmilnikom in omogoča priključitev več senzorjev na iste pine

mikrokrmilnika, kot jih že uporablja podobni senzor. Druga bistvena prednost je tudi ta, da

digitalni senzor daje digitalno vrednost, ki že predstavlja neelektrično oz. merjeno veličino.

V diplomskem delu smo želeli izmeriti predvsem temperaturo in jo shraniti v podatkovno

bazo na centralni enoti – RPi, zato smo izbrali digitalni senzor temperature DS18B20, ki

smo ga podrobno opisali že v poglavju 2.3. Za rele smo izbrali nizkonapetostnega, ki smo

ga lahko vklapljali z že obstoječo napajalno napetostjo 3,3 V.

Na Slika 4.1 je prikazan blokovni diagram elektronskega vezja, ki smo ga realizirali.

Mikrokrmilnik

ATmega328P-AU

Senzor temperature

DS18B20

Senzor svetlobe

Rele za vklop-izklop

tokokroga

Slika 4.1: Blokovni diagram strojne opreme za merjenje temperature

Mikrokrmilnik smo programirali z razvojno ploščico Arduino UNO prek pinov, namenjenih

za programiranje prek ICSP vodila. V prvi fazi smo na razvojno ploščico namestiti

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

24

programsko kodo, da je ta potem delovala kot programator. Nato smo na naš programirni

mikrokrmilnik namestili ustrezen program14 za osnovno delovanje, šele nato smo lahko

namestili programsko kodo, opisano v poglavju 4.3. Za zagotavljanje potrebne napetosti in

zaloge energije smo med napajanjem in maso dodali še dodatni kondenzator 100 uF.

4.2 Izdelava tiskanega vezja

Slika 4.2 vsebuje shematski prikaz realiziranega tiskanega vezja, kjer smo zaradi

obsežnosti in boljše preglednosti shemo vezja prikazali na več ločenih slikah, saj je

določen del vezja enak na vseh modulih. Mikrokrmilnik za svoje delovanje potrebuje

ustrezni oscilator oz. generator takta. Obstaja več različnih variant realizacije ure za

generiranje ustreznega takta mikrokrmilniku. Uporabili smo najbolj enostavno rešitev, to je

16 MHz kristalni (kvarčni) oscilator z dodatnima kondenzatorjema, ki sta postavljena čim

bližje mikrokrmilniku. Prav tako smo na napajalne priključke mikrokrmilnika dodali

keramični kondenzator15 v vrednosti 100 nF za zagotavljanje stabilne napetosti, ko jo

mikrokrmilnik potrebuje.

Senzor temperature (Slika 4.3) smo na tiskanini povezali na klasični način, s pomočjo

napajalnih priključkov, kjer se nismo posluževali parazitnega napajanja, saj smo ga

priključili direktno na tiskano vezje.

14

Angl.: Bootloader. 15

Imenovan tudi MLCC – Multi layer chip capacitor.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

25

Slika 4.2: Shematski prikaz vezja za merjenje temperature in krmiljenje releja

Brezžični komunikacijski modul, ki smo opisali že v poglavju 2.4, je s konektorjem

povezan na tiskano ploščico, kar omogoča enostavno zamenjavo brezžičnega modula;

prek istega konektorja na tiskanini programiramo mikrokrmilnik. Dodali smo tudi nekatere

proste pine mikrokrmilnika, da bomo pozneje sistem lažje razširili še na druge senzorje,

če bo potrebno, in ga tako boljše izkoristili. Shematski prikaz prostih pinov z blazinicami

(PAD-i) na tiskanini je viden na sliki Slika 4.3.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

26

Slika 4.3: Shematski prikaz vezja z dodatnimi prostimi pini in konektor za merilnik temperature

Za napajanje (Slika 4.4) smo uporabili stabilni vir napetosti oz. napajanje iz obstoječega

adapterja, ki ga največkrat najdemo že doma (starejše naprave, npr. mobilni telefon).

Zaželeno je, da ima adapter napetost večjo od 3,3 V do nekaj voltov in tokovno

zmogljivost vsaj 200 mA. To napetost privedemo prek mikro-USB konektorja na vezje, kjer

jo z linearnim regulatorjem napetosti znižamo na željene 3,3 V. Kondenzatorji na vhodnih

in izhodnih priključkih linearnega regulatorja so zaželeni za dodatno glajenje napetosti in

dodatno zagotavljanje tokovne zmogljivosti, ki jo potrebujemo za napajanje celotnega

vezja.

Slika 4.4: Shematski prikaz napajanja iz USB priključka

Vezje za vklop in izklop poljubnih tokokrogov (Slika 4.5) smo realizirali s pomočjo N-

kanalnega MOSFET tranzistorja, sicer bi z direktno obremenitvijo na priključnem pinu

mikrokrmilnika, ki premore največ 40 mA toka, le-tega tokovno uničili. Možnost uporabe

bipolarnega tranzistorja ni bila primerna, saj zaradi napetosti na tranzistorju UBE, ki znaša

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

27

približno 0,6 V, zmanjka potrebne napetosti za delovanje oz. preklapljanje releja.

Vzporedno z relejem je vezana tudi usmerniška dioda, ki deluje kot zaščita pri preklopu,

saj rele predstavlja induktivno breme. Vzporedno k releju smo dodali tudi LED diodo, za

vizualno predstavo, kdaj je rele vklopljen in kdaj ne. Upora R3 in R4 predstavljata vhodni

delilnik napetosti MOSFET tranzistorju, da ta deluje kot stikalo za vklop in izklop.

Slika 4.5: Shematski prikaz vezja za vklop-izklop tokokroga

Na sliki 4.3 je prikazan 3D model tiskane ploščice, in sicer zgornja stran na levi in spodnja

stran na desni.

Slika 4.6: 3D Izgled tiskane ploščice – PCB za merjenje temperature

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

28

4.3 Načrtovanje programske kode za sprejemno-oddajne module

Programska koda za branje podatkov o senzorju temperature je prikazana na diagramu

poteka (Slika 4.7). Program se ves čas ponavlja in čaka na razpoložljive podatke, ki mu jih

pošljemo iz centralne enote. Modul za merjenje temperature se odzove tako, da po

prejetem podatku iz centralne enote pokliče podprogram readTemp(), ki pridobi podatke

od senzorja na način, ki smo ga podrobneje opisali že v poglavju 2.3. Pridobljene podatke

o temperaturi s pomočjo brezžičnega modula vrnemo nazaj do centralne enote, ki

pričakuje naš odziv. Podatki so tipa integer, saj se s tem izognemo prenosu decimalnih

vrednosti po brezžičnem lastnem protokolu. Za primer neuspeha ob prvem pošiljanju

podatkov smo naredili zanko, ki pripravljeni podatek o temperaturi poskuša poslati do 5 x.

ZAČETEK

Priključitev knjižic

Inicializacija spremenljivk

Inicializacija funkcij

Bool sprejeto = false;

Sprejeto = sprejmiPaket();If sprejeto == true;

NE

DA

Inicializacija spremenljivk;

Int counter = 0;

Bool poslano = false;

Bool poslano = posljiPaket(readTemp());

Counter++;

While(poslano == false

&& counter < 5)

DANE

Int readTemp();

Inicializacija

spremenljivk za

delovanje senzorja

Inicializacija spremenljivk:

Byte i;

Byte data[12];

Int row;

reset();

write(0xCC);

write(0x$$);

delayMicroseconds(120);

reset();

write(0xCC);

write(0xBE);

For (i = 0; i < 11;

i++)

Data[i] = ds.read();

i++;

i = 0;

Temperatura = (data[1]<<8)+data[0];

Return temperatura;

KONEC PODPROGRAMA

Slika 4.7: Diagram poteka za merjenje temperature na oddaljenem senzorju

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

29

Kratki opis delovanja programske opreme po korakih:

1. zanka, ki čaka na razpoložljivi podatek iz centralne enote;

2. klic funkcije, ki pridobi podatek o temperaturi s senzorja;

3. zanka, ki pošilja podatek o temperaturi z možnostjo petih ponovitev;

4. vrnitev na prvi korak, kjer čakamo novi razpoložljivi podatek.

4.4 Načrtovanje programske kode za centralno enoto – RPi

Za pravilno pretvorbo programske kode v izvedljiv program smo potrebovali knjižice za

dostop do nekaterih priključnih pinov GPIO [7] in knjižico za delo z brezžičnimi moduli,

napisano za programski jezik C/C++ [8].

Osnovno delovanje vseh programov smo v grobem opisali že v poglavju 3.4. Po pošiljanju

podatkovnega paketa, na katerega se je oddaljena sprejemno-oddajna enota za

komunikacijo s senzorji odzvala tako, da nam je vrnila željeni podatek, smo ga ustrezno

pretvorili v številčno decimalno vrednost in ga shranili v bazo podatkov. Prejeti podatek je

tipa integer in vsebuje 12-bitno informacijo o temperaturi. Zato je potrebno prejeti podatek

pomnožiti s številko 0.0625, da dobimo dejansko decimalno vrednost temperature. To

vrednost nato shranimo v podatkovno bazo za poznejšo uporabo ali prikaz. V primeru, da

podatka o temperaturi nismo dobili od oddaljene enote, se napaka vpiše v podatkovno

bazo, da vemo, kdaj se sprejemno-oddajna enota ni odzivala.

Nekoliko se razlikuje le program za komunikacijo s sprejemno-oddajnimi moduli za vklop

in izklop tokokrogov. V tem primeru v eno številčno vrednost tipa short-integer z dolžino

šestnajst bitov zakodiramo podatek, ali gre za vklop ali izklop tokokroga in podatek o tipu

modula.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

30

5 SPREJEMNO-ODDAJNA ENOTA ZA KRMILJENJE

NIZKONAPETOSTNIH MOTORJEV

5.1 Načrtovanje strojne opreme

Bistveni sestavni deli sprejemno-oddajne enote za krmiljenje nizkonapetostnih motorjev

so brezžični modul, mikrokrmilnik, vezje za pogon in krmiljenje motorja,16 nizkonapetostni

motor ter stikala, ki detektirajo skrajno lego. Možnost detektiranja skrajnih leg s pomočjo

stikal nam je prišla prav pri krmiljenju okenskih rolet oz. žaluzij. Blokovni diagram strojne

opreme prikazuje slika 5.1. Drugi način, ki smo ga primarno uporabljali za detektiranje

skrajnih leg, je bil realiziran programsko, kjer smo merili dejanski padec napetosti na

priključkih motorja.

H-bridge

Ugotavljanje skrajne lege motorja

Nizkonapetostni

motor

Mikrokrmilnik

ATmega328P-AU

Opcijsko: ugotavljanje skrajne

lege s pomočjo stikal

Slika 5.1: Blokovni diagram za krmiljenje ventila

Vezje za pogon motorja je narejeno s pomočjo integriranega vezja, ki vsebuje dva

komplementarna MOS tranzistorja, in sicer iz dveh razlogov: prvi razlog je tokovna

omejitev izhodnih pinov mikrokrmilnika, ki ne smejo presegati 40 mA toka [6], drugi razlog

pa je priključitev induktivnega bremena, ki povzroči visoke zagonske tokove ob zagonu

motorja in lahko trajno poškoduje mikrokrmilnik.

Na sliki 5.2 je prikazan eden od načinov delovanja vezja, imenovanega H-bridge. V tabeli

5.1 so podana možna stanja na vhodnih priključkih vezja.

16

Angl.: H-bridge.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

31

Tabela 5.1: Tabela dovoljenih stanj za vezje H-Bridge

Smer A Smer B Vrtenje

0 0 STOP

0 1 vrtenje levo

1 0 vrtenje desno

1 1 prepovedano področje

Slika 5.2: H-bridge

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

32

5.2 Izdelava tiskanega vezja

Slika 5.3: Vezalni načrt krmiljenja ventila

Na sliki Slika 5.4 je prikazana shema elektronskega vezja za prej omenjeni H-bridge. Na

sredini imamo priključne kontakte za priklop motorja na letvico prek konektorja ali z

direktno povezavo prek žic z oznako P4. Blazinice (PAD-i) na tiskanini z oznakami P2 in

P3 služijo za meritev z digitalnim voltmetrom, da lahko preverimo delovanje vezja.

Povezovalni kontakti z imenoma skrajna_lega_A in skrajna_lega_B so priključeni na

analogne pine mikrokrmilnika, s katerimi detektiramo skrajne lege priključenega motorja.

V tem primeru nekoliko naraste tok na priključkih motorja, medtem ko napetost na

priključnih kontaktih motorja nekoliko pade.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

33

Slika 5.4: Shematski prikaz vezja »H-bridge«

Drugi način detektiranja skrajnih leg s pomočjo stikal (Slika 5.5) je prikazan na spodnji

vezalni shemi. Poleg tipk in pull-up upora smo proti masi vezali še kondenzator, ki

zmanjšuje pojav motenj pri pritisku na stikalo oz. tipko. Vezju smo dodali tudi možnost

priključitve temperaturnega senzorja, tipa DS18B20, ali svetlobnega senzorja, v primeru,

da bi želeli izvajati še dodatne meritve v bližini krmiljenja motorja.

Slika 5.5: Shematski prikaz dodatnih stikal za ugotavljanje skrajne lege

Vezju smo dodali tudi napajalni del, ki smo ga podrobneje opisali v poglavju 4.1. Dodatno

je bil izdelan tudi stikalni usmernik17 (Slika 5.6), ki je baterijsko napetost dvignil in držal na

3,3 V. Tak usmernik deluje z baterijsko napetostjo od 0,9 V do 3,3 V in na svojem izhodu

premore tokovno zmogljivost do 600 mA. S takšnim stikalnim usmernikom smo dosegli

optimalni izkoristek baterij, ustrezno visok nivo napetosti in tokovno zmogljivost za

napajanje celotnega vezja. Možnost uporabe stikalnega usmernika pride v poštev, ko

vezje koristimo za krmiljenje radiatorskega ventila. V tem primeru smo tiskano vezje

17

Angl.: Boost Switcher.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

34

narisali tako, da lahko del vezja z linearnim regulatorjem napetosti odlomimo, ker ga ne

potrebujemo.

Slika 5.6: Shematski prikaz stikalnega – boost usmernika

Na Slika 5.7 je prikazana tiskanina v 3D modelu z vidno zgornjo in spodnjo stranjo

tiskanine, z možnostjo, da se odlomi napajalni del vezja z zunanjim adapterjem, če nam ta

ne koristi.

Slika 5.7: Izgled tiskanine v 3D modelu

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

35

5.3 Načrtovanje programske kode za sprejemno-oddajne module

Diagram poteka (Slika 5.8) predstavlja programski del, ki se izvaja na mikrokrmilniku za

krmiljenje nizkonapetostnih motorjev.

ZAČETEK

Priključitev knjižic

Inicializacija spremenljivk

Inicializacija funkcij

Setup();

If nastavitve == false;

NE

DA

Ventil(true,999999);

Sprejeto = sprejmiPaket(); If sprejeto == true;

NEDA

If (inbox >= prejsnje stanje)

Bool sprejeto = false;

Nastavitve = true;

Cas = (inbox –

prejsnjeStanje)*200;

Ventil(false,cas);

Izpis „ODPIRANJE“

prejsnjeStanje = inbox;

Cas = (prejsnjeStanje -

inbox)*200;

Ventil(true,cas);

Izpis „ZAPIRANJE“

prejsnjeStanje = inbox;

Slika 5.8: Diagram poteka za krmiljenje nizkonapetostnih motorjev

Zaradi obsežnosti smo program opisali po točkah:

1. Inicializacija potrebnih spremenljivk;

2. inicializacija brezžičnega modula in nastavitev nekaterih nujnih podatkov za

pravilno delovanje brezžičnih modulov;

3. ob prvem vklopu motor zavrtimo v eno od skrajnih leg, da vemo, kje se nahajamo;

4. zanka, ki čaka na podatkovni paket centralne enote za novo nastavitev pozicije

motorja;

5. po prejetem podatku o »odprtosti« v odstotkih se preračuna nova pozicija in

pokliče se funkcija za vrtenje v levo ali desno ter čas za vrtenje motorja za dosego

željene lege motorja. Podprogram je podrobneje opisan z diagramom poteka

(Slika 5.9);

6. shranimo podatek o trenutni legi, da lahko potem, ko dobimo novi podatek o

odprtosti, preračunamo novo stanje;

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

36

7. skok programa nazaj na korak 4, kjer čakamo nov podatkovni paket iz centralne

enote.

Čas, ki ga potrebujemo za vrtenje iz ene skrajne lege v drugo, smo določili

ekperimentalno z meritvijo in ga uporabili v programski kodi za preračunavanje časa, ki je

potreben za premik motorja za 1 %. Spodnji diagram (Slika 4.7) prikazuje delovanje

podprograma, ki je namenjen vrtenju motorja v eno ali drugo smer za določen čas.

Ventil (boolean smer, int vrednost);

Boolean prekini = false;

If smer ==

false

Unsigned long time =

millis();

digitalWrite(vrtiLevo, HIGH);

Tok = (analogRead(tokPin1)

- analogRead(tokPin0));

If (millis() – time < 200)

DA

Izpis „ZAGON“

Else if (tok <= 960)

digitalWrite(vrtiLevo,

LOW);

Prekini = true;

While (millis() – time <

vrednost)&&(!prekini));

DA

NE

DA

NE

NE

digitalWrite(vrtiLevo,

LOW);

Unsigned long time =

millis();

digitalWrite(vrtiDesno,

HIGH);

Tok = (analogRead(tokPin0)

- analogRead(tokPin1));

If (millis() – time < 200)

DA

Izpis „ZAGON“

Else if (tok <= 960)

digitalWrite(vrstiDesno,

LOW);

Prekini = true;

While (millis() – time <

vrednost)&&(!prekini));

DA

NE

DA

NE

NE

digitalWrite(vrtDesno,

LOW);

KONEC PODPROGRAMA

Skrajna lega Skrajna lega

Izločen zagonski tok Izločen zagonski tok

Slika 5.9: Diagram poteka podprograma za krmiljenje motorja

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

37

Opis podprograma po korakih za lažjo predstavo:

1. glede na vhodni podatek podprograma se odločimo za vrtenje v eno ali v drugo

smer;

2. na analognih vhodih ves čas merimo padec napetosti na motorju. Z uporabo

časovnikov smo se izognili uporabi ukaza delay, ki za določen čas onemogoča

meritev na analognih vhodih mikrokrmilnika;

3. za časovno obdobje prvih 200 ms izločimo zagonski tok, da ne pride do neželene

prekinitve;

4. preostali preračunani čas vrtimo motor in merimo padec napetosti za primer, če

pride motor do skrajne lege;

5. konec podprograma.

5.4 Načrtovnaje programske kode za centralno enoto – RPi

Bistveni del programa za odpiranje in zapiranje radiatorskega ventila je poudarek na

regulaciji temperature v prostoru. Ker obstaja več vrst regulacij in so nekatere precej

zapletene, smo se odločili za tisto, ki po svojem delovanju spominja na PID regulator. Za

določitev odprtosti radiatorskega ventila smo potrebovali podatek o trenutni temperaturi v

prostoru in želeno temperaturo. Poleg teh dveh potrebnih podatkov smo si zamislili še dva

parametra; prvi je namenjen odmiku želene temperature, s katerim smo želeli vplivati na

končno oz. želeno temperaturo v prostoru. Z drugim parametrom pa smo določili t. i.

področje regulacije, saj smo predvidevali, da je uporaba takega radiatorskega ventila

smiselna samo v prostorih, kjer ni sobnega termostata, soba pa je vseeno malo prevroča.

Čas za ogrevanje je tako omejen z delovanjem termostata v drugi sobi, zato je zaželeno,

da je to področje regulacije čim bolj ozko in je elektronski radiatorski ventil čim več časa

odprt za hitro doseganje želene temperature. Slika 5.10 ponazarja grafični prikaz

zamišljene regulacije s pričakovanim odzivom sistema.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

38

Odprtost ventila [%]

Tem

per

atu

ra [

°C]

100 080 60 40 20

Želena temperatura

Odmik želene temperature

Področje regulacije

Trenutna odprtost ventila je 40 %

0

35

Trenutno izmerjena temperatura

Pričakovan odziv regulacije temperature v prostoru

Slika 5.10: Prikaz delovanja regulacije

Odprtost ventila je navzgor in navzdol omejena in jo na sprejemno-oddajno enoto

pošiljamo v odstotkih med 0 in 100 (rdeča črta na zgornjem diagramu).

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

39

6 ANALIZA DELOVANJA SISTEMA

6.1 Analiza delovanja sprejemno-oddajne enote za merjenje

temperature ter vklop in izklop tokokroga

Delovanje sistema smo preizkusili tako, da smo brezžični sprejemno-oddajni modul za

merjenje temperature priklopili na baterijsko napajanje. Omogočili smo konzolni prikaz

delovanja modula za merjenje temperature, da smo lahko spremljali delovanje in odziv

sistema. Slika 6.1 prikazuje, da smo podatek prejeli od centralne enote, nato pa smo

prebrano vrednost o temperaturi poslali nazaj v obliki integer, da smo se izognili prenosu

decimalnih vrednsoti. Slika 6.2 prikazuje delovanje programske kode na računalniku

Raspberry Pi, ki pridobljene podatke shrani v bazo podatkov.

Podobno in z zelo dobro odzivnostjo reagirajo tudi sprejemno-oddajne enote za vklop in

izklop tokokrogov.

Slika 6.1: Prikaz delovanja modula prek serijskega vmesnika

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

40

Slika 6.2: Prikaz delovanja programa RPi

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

41

6.2 Delovanje sprejemno-oddajne enote za krmiljenje

nizkonapetostnih motorjev za regulacijo elektronskih ventilov

Zaradi izvajanja meritev v neugodnem letnem času, smo zamišljeno regulacijo testirali s

pomočjo segrevanja žarnice v zaprti kartonski embalaži, dimenzij 20 x 20 x 50 mm. S

poskusom smo ugotovili, da je 30 sekund dovolj za dovolj pogosto izvajanje meritev, saj

so časovne konstante tako dolge, da ni bilo smiselno izvajati pogostejših meritev. Pri

ogrevanju prostorov so ti časi precej daljši ter odvisni od velikosti prostora, radiatorja in

temperature vode, ki pride do njih. Uporabili smo varčno žarnico, ki je ekvivalentna 100-

vatni klasični žarnici z volframovo žarilno nitko. Razdalja v kartonu med žarnico in

digitalnim merilcem temperature je bila približno 20 cm. Z meritvami smo pridobili odzive

na poljubno nastavljene parametre, s katerimi smo želeli dobiti odziv regulacijske proge. S

spodnjo programsko kodo smo v Excelu napisali funkcijo, ki nam je preračunavala

vrednosti – koliko mora biti odprt ventil, v našem primeru moč na žarnici v odstotkih 0–

100. Meritve smo izvajali vsakih 30 sekund in vpisovali izmerjene vrednosti temperature v

Excelovo tabelo. Nova vrednost odprtosti v odstotkih se nam je takoj preračunala in

nastavili smo jo na potenciometru elektronike za regulacijo moči na žarnici ter po

tridesetih sekundah ponovno odčitali vrednost temperature.

Public Function Calculate(zeljenaTemp As Double, izmerjenaTemp As Double)

As Double

Dim odprtost As Double

Dim zapriPri As Double

Dim podrReg As Double

Dim spodnjaMeja As Double

zapriPri = 105 'odstotki

podrReg = 2 ' stopinje celzija

' preračunavanje nove željene temperature

zeljenaTemp = zeljenaTemp * zapriPri / 100

' spodnja meja regulacije

spodnjaMeja = zeljenaTemp - podrReg

' preračunavanje odprtosti v odstotkih

odprtost = (zeljenaTemp - izmerjenaTemp) * 100 / podrReg

If odprtost <= 0 Then

odprtost = 0

ElseIf odprtost >= 100 Then

odprtost = 100

End If

' funkcija vrne preračunano vrednost

Calculate = odprtost

End Function

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

42

Izvedli smo tri različne meritve z različnimi parametri, in sicer:

Parameter za maksimalno želeno temperaturo: 95 % želene temperature, področje

regulacije: 5 °C od maksimalne želene temperature. Prikaz meritev prikazuje graf.

Iz meritev je razvidno, da je parameter za maksimalno želeno temperaturo nekoliko nizek

in želene temperature (modra črta) ne dosežemo. V naslednjem koraku smo nekoliko

zmanjšali področje regulacije, da bi prej dosegli želeno temperaturo in parameter za

maksimalno želeno temperaturo povečali na 105 %, da bi se tudi z meritvami približali

temperaturi, ki jo dejansko želimo.

Parameter za maksimalno želeno temperaturo: 105 % želene temperature,

področje regulacije: 4 °C od maksimalne želene temperature. Prikaz meritev

prikazuje graf.

0

10

20

30

40

50

60

70

80

90

100

20,0

22,0

24,0

26,0

28,0

30,0

32,0

34,0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

Od

prt

on

st [

%]

Tem

pe

ratu

ra [

°C]

Čas [mm:ss]

ŽelenatemperaturaIzmerjenatemperatura

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

43

Iz meritev smo ugotovili, da smo dosegli precej boljše rezultate, saj smo se bolj približali

želeni temperaturi. Z naslednjimi meritvami smo dodatno zmanjšali področje regulacije, da

bi dosegli hitrejše odzive.

Parameter za maksimalno želeno temperaturo: 95 % želene temperature, področje

regulacije: 2 °C od maksimalne želene temperature. Prikaz meritev prikazuje graf.

Iz vseh treh meritev lahko ugotovimo in sklepamo, da bi z nastavitvijo parametra želene

temperature na 100 % dosegli najbolj ugodno oz. skoraj idealno regulacijo, ker bi rdeča

0

10

20

30

40

50

60

70

80

90

100

20,0

22,0

24,0

26,0

28,0

30,0

32,0

34,0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

0:0

0

Od

prt

on

st [

%]

Tem

pe

ratu

ra [

°C]

Čas [mm:ss]

ŽelenatemperaturaIzmerjenatemperatura

0

10

20

30

40

50

60

70

80

90

100

20,0

22,0

24,0

26,0

28,0

30,0

32,0

34,0

0:0

0

2:0

0

4:0

0

6:0

0

8:0

0

10

:00

12

:00

14

:00

16

:00

18

:00

20

:00

22

:00

0:0

0

2:0

0

4:0

0

6:0

0

8:0

0

10

:00

12

:00

14

:00

16

:00

18

:00

20

:00

Od

prt

on

st [

%]

Tem

pe

ratu

ra [

°C]

Čas [mm:ss]

ŽelenatemperaturaIzmerjenatemperatura

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

44

krivulja, ki predstavlja izmerjeno temperaturo, bila najbližje modri krivulji, ki predstavlja

želeno temperaturo. Z ožanjem področja regulacije smo dosegli hitro odzivnost sistema,

vendar se je izkazalo, da smo zaradi počasnih meritev imeli več spreminjanja temperature

okrog želene vrednosti.

Delovanje sprejemno-oddajne enote za krmiljenje nizkonapetostnih motorjev smo

preizkušali podobno kot delovanje elektronskega vezja v prejšnjem poglavju. Potrebovali

smo nekaj časa za nastavitev ustreznih parametrov za meritev padca napetosti na

motorju in s tem smo določili, kdaj pride do ene od skrajnih leg. Slika 6.3 prikazuje, da

nam je centralna enota poslala podatek o odprtosti za 31 %, kar je predstavljalo vrtenje v

eno smer za 6200 ms.

Slika 6.3: Prikaz delovanja modula za krmiljenje ventila

Slika 6.4 prikazuje prebrane podatke iz baze podatkov za trenutni modul. Ključna podatka

za določitev odprtosti radiatorskega ventila sta nazadnje izmerjena temperatura in želena

temperatura. Potem se je preračunala ustrezna vrednost odprtosti, ki smo jo uspešno

prenesli med obema brezžičnima moduloma.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

45

Slika 6.4: Prikaz delovanja programa na RPi za krmiljenje ventila

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

46

7 SKLEP

V diplomskem delu smo se osredotočili na to, da smo celotni modularni sistem

avtomatizacije hiše zasnovali tako, da nam je omogočal dodajanje in brisanje poljubnega

števila sprejemno-oddajnih modulov. Največ poudarka je bilo na zahtevnejših modulih,

predvsem tistih za regulacijo temperature v prostoru, ki smo jih realizirali s pomočjo

elektronsko krmiljenih radiatorskih ventilov in lastno regulacijsko progo.

Iz meritev smo ugotovili, da vsak tovrsten sistem potrebuje precej nastavitev, predvsem

programskih prilagoditev za pravilno delovanje. Z razširitvijo sistema na druga področja

uporabe pa se kompleksnost zamišljenega sistema za avtomatizacijo hitro veča. Dosegli

smo, da naš sistem dobro služi svojemu namenu in da je primerljiv s precej dražjimi

podobnimi sistemi, ki jih dobimo na trgu.

Izboljšati bi se dala predvsem odzivnost sprejemno-oddajnih enot. Z dodatno

komunikacijo med sprejemno-oddajnimi enotami bi lahko dosegli precej daljše zračne

domete. Tako ne bi bilo potrebno, da so vse sprejemno-oddajne enote cel čas v dosegu

centralne enote. Z optimalnejše napisanimi programi za mikrokrmilnike pa bi lahko dosegli

še, da bi brezžični moduli bili več časa v stanju pripravljenosti in bi tako dodatno zmanjšali

tokovno porabo celotnega vezja.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

47

8 LITERATURA

[1] Nordic Semiconductor nRF24L01P Product Specification (Datasheet), Revision 1,

September 2008. Dostopno na: http://www.nordicsemi.com/eng/Products/2.4GHz-

RF/nRF24L01P/(language)/eng-GB [7. 9. 2014].

[2] Matt Richardson, Shawn Wallace, Getting Started with Raspberry Pi, First Edition.

United States of America, O'Reilly Media, Inc., 2012.

[3] Maxim integrated DS18B20 (Datasheet), REV: 042208, 2008. Dostopno na:

http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf.

[4] Hemant Sharma, Crontab – Quick Reference. Dostopno na:

http://www.adminschoice.com/crontab-quick-reference/ [8. 9. 2014].

[5] RPI Low Level peripherals, nazadnje spremenjeno: 13. avgust 2014, ob 02:50.

Dostopno na: http://elinux.org/RPi_Low-level_peripherals [8. 9. 2014].

[6] Arduino UNO specifikacije. Dostopno na: http://arduino.cc/en/Main/ArduinoBoardUno,

[8. 9. 2014].

[7] Knjižice za delo z GPIO pini. Dostopno na: http://www.airspayce.com/mikem/bcm2835/

[8. 9. 2014].

[8] Knjižice za računalnik RPi za delo z brezžičnimi moduli. Dostopno na:

https://github.com/stanleyseow/RF24 [8. 9. 2014].

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

48

Priloga A – Konzolni ukazi

sudo <ukaz> – dodamo administrativne privilegije (lahko spreminjamo sistemske

datoteke)

ls – prikaže vsebino trenutnega direktorija

cd </pot> – odpiranje mape

cd .. – gremo en direktorij višje (nazaj)

clear – pobriše konzolno okno

cp <datoteka> <ciljna pot> – kopiranje datotek/direktorijev (potrebnih nekaj atributov)

rm <datoteka ali direktorij> – brisanje datoteke ali direktorija (potrebnih nekaj atributov)

./<datoteka> – izvede se izvedljiva datoteka

python ime.py – izvede izvedljiva python datoteka

tar zxvf <datoteka> – uporablja se za odpiranje/razpakiranje zapakiranih datotek

(.zip,.7z,..), zxvf so atributi

passwd <uporabnik> – spreminjanje gesla

date – ura in datum

nano <datoteka> – urejevalnik datotek, obarva kodo (python, c/c++ ...)

su – prijavimo se kot superuser in pri ukazih nam ni potrebno pisati sudo

chmod <atributi> – prirejamo pravice (izvedljivim) datotekam

sudo shutdown -r now – ponovni zagon

ifconfig – vrne IP in nekatere druge uporabne informacije

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

49

Priloga B – Programska koda mikrokrmilnika za sporejemno-oddajno enoto za

senzor temperature DS18B20

#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" //inicializacija spremenljivk unsigned long sprejeti_podatek; unsigned long poslani_paket; bool sprejeto = false; // nastavitev SPI pinov za brezžični modul nRF24L01+ RF24 radio(9,10); // Nastavitev naslovov pip za branje in pisanje const uint64_t pipes[2] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL }; //inicializacija funkcij bool posljiPaket(unsigned long izhodni_podatek); bool sprejmiPaket(); int readTemp(); void setup(void) { Serial.begin(57600); //zagon konzolnega načina za debugiranje printf_begin(); printf("\nBranje senzorjev\n\r"); //inicializacija brezžičnega modula nRF24L01+ radio.begin(); radio.setRetries(15,15); //nastavitev ponovitev radio.openWritingPipe(pipes[0]); //nastavitev naslova za pisalnje radio.openReadingPipe(1,pipes[1]); //nastavitev naslova za branja radio.startListening(); //bralni način delovnaja modula radio.printDetails(); //izpis nastavitev na zaslon readTemp(); //prvo branje temperaturnega senzorja } void loop(void) { sprejeto = false; sprejeto = sprejmiPaket(); //neskončna zanka za sprejem paketa od centralne enote if (sprejeto) { int counter = 0; bool poslano = false; while(poslano == false && counter < 5) { poslano = posljiPaket(readTemp()); //pošiljanje odziva-temperature counter++; } radio.startListening(); //prehod v bralni način delovnaja }

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

50

} bool posljiPaket(unsigned long izhodni_podatek) { radio.stopListening(); poslani_paket = izhodni_podatek; printf("\nPosiljam %lu...", poslani_paket); bool ok = radio.write( &poslani_paket, sizeof(unsigned long) ); if (ok) { printf("poslano ok..."); radio.startListening(); return true; } else { printf("Napaka.\n\r"); return false; } } bool sprejmiPaket() { unsigned long started_waiting_at = millis(); //nastavitev časovnika bool timeout = false; while ( ! radio.available() && ! timeout ) { if (millis() - started_waiting_at > 200 ) //omejitev časovnika na 200ms timeout = true; } if ( timeout ) { printf("Napaka! Centralna enota se ne odziva...\n"); return false; } else { radio.read( &prejeti_podatek, sizeof(unsigned long) ); printf("Sprejeti podatek %lu\n",prejeti_podatek); printf("Sprejeti podatek (hex) 0x%X\n",prejeti_podatek); return true; } } int readTemp() { byte i; byte data[12]; int row; ds.reset(); ds.write(0xCC); //odzovejo se vsi senzorji ds.write(0x44); //pretvorba temperature

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

51

delayMicroseconds(120); ds.reset(); ds.write(0xCC); //odzovejo se vsi senzorji ds.write(0xBE); // Branje pripravljenih podatkov iz pomnilnika senzroja Serial.print("\n"); for ( i = 0; i < 11; i++) { data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } row=(data[1]<<8)+data[0]; //shiftanje levo zaradi decimalne vrednosti return(row); //funkcija vrne podatke o temperaturi }

Priloga C – Programska koda centralne enote za komunikacijo s sprejemno-

oddajnimi enotami za branje senzorjev (branje temperature – DS18B20)

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <string> #include <getopt.h> #include <cstdlib> #include <iostream> #include "/home/alen/irisa/rf24libs/RF24/RF24.h" #include <mysql/mysql.h> #define SERVER "localhost" #define USER "pialen" #define PASSWORD "pialen123" #define DATABASE "iris" //UKAZ PREVAJALNIKU // g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/alen/irisa/rf24libs/RF24/ -lrf24 readSensorsFinal.cpp -o readSensorsFinal `mysql_config --cflags --libs` unsigned long prejeti_podatek; unsigned long prejsnji_podatek; unsigned long podatek_za_posiljanje=0x12345678; float prejeta_vrednost = 0.0; char valueS[10]; char idS[10]; char sql_stavek [160]; void vpisMySQL(); void vpisMySQLnapake();

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

52

void nastavitev_nRF(void); using namespace std; RF24 radio(22,0); const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; uint8_t kanal_modula = 0xAB; uint8_t id_modula = 6; uint8_t tip_modula = 6; int main( int argc, char ** argv) { nastavitev_nRF(); //zagon modula MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "SELECT id_modula, kanal_modula, tip_modula FROM sensors ORDER BY id_modula DESC")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); while ((row = mysql_fetch_row(res)) != NULL) { id_modula = atoi(row[0]); kanal_modula = atoi(row[1]); tip_modula = atoi(row[2]); radio.setChannel(kanal_modula); /************POŠILJANJE **************************/ int ponovitve = 0; bool all_ok = false; while (ponovitve++ <= 5) { prejsnji_podatek = prejeti_podatek; //prehod delovanja modula v pisalni nacin radio.stopListening(); printf("*** Senzor ID=%i kanal_modula=%i tip_modula=%i posiljanje=%i ***\n",id_modula,kanal_modula,tip_modula,ponovitve); printf("Posiljanje...\n"); bool ok = radio.write( &podatek_za_posiljanje, sizeof(unsigned long) ); if (!ok)

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

53

{ printf("Napaka...\n"); } //Prehod v bralni način delovanja brezžičnega modula radio.startListening(); //kreiranje casovnika koliko casa bomo čakali na podatek unsigned long started_waiting_at = millis(); bool timeout = false; while ( ! radio.available() && ! timeout ) { if (millis() - started_waiting_at > 200 ) timeout = true; } if ( timeout ) { printf("Napaka. Oddaljeni modul se ne odziva...\n"); } else { //pridobivanje podatka iz oddaljene enote radio.read( &prejeti_podatek, sizeof(unsigned long) ); printf("Pridobljeni podatek %lu\n",prejeti_podatek); printf("Pridobljeni podatek (hex) 0x%X\n",prejeti_podatek); } if (prejsnji_podatek != prejeti_podatek) //preverjanje če je prejsnji podatek različen od prejetega podatka { all_ok = true; break; } } if (all_ok) { vpisMySQL(); } else vpisMySQLnapake(); printf("**************** KONEC branja senzorja z ID=%i ***********\n\n",id_modula); } printf("\n"); //zapiranje povezave z podatkovno bazo MySQL mysql_free_result(res); mysql_close(conn); return 0; //konec programa } void nastavitev_nRF(void) { printf("\nInicializacija brezzicnega modula - nRF24L01+\n"); radio.begin(); radio.setRetries( 15, 15); //nastavitev ponovitev radio.setChannel(kanal_modula); //nastavitev kanala

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

54

radio.openWritingPipe(pipes[0]); //nastavitev pisalne pipe radio.openReadingPipe(1,pipes[1]); //nastavitev bralne pipe radio.startListening(); //prehod v bralni način delovanja radio.printDetails(); //izpis podrobnosti o senzorju } void vpisMySQL() { if (tip_modula == 3) //senzor temperature { prejeta_vrednost = (float)prejeti_podatek * 0.0625; //pretvorba temperature iz int v float if (!(prejeta_vrednost >= -39.9 && prejeta_vrednost <=49.9)) { printf("\nNepravilna vrednost!"); prejeta_vrednost = 0.0; } } else { //dodatno za merjenje svetlobe prejeta_vrednost = prejeti_podatek; } /****************************************************************************/ char sql[250]="INSERT INTO meritve(idm, value) VALUES ("; char sql2[10]; char sql3[50]=","; char sql4[10]; char sql5[10]=");"; snprintf(sql2,10,"%i",idm); //pretvorba temperature iz float v string snprintf(sql4,10,"%i",prejeta_vrednost); strcat (sql,sql2); //sestavljanje MySQL stavka strcat (sql,sql2); strcat (sql,sql3); strcat (sql,sql4); strcat (sql,sql5); printf ("Insert INTO SQL= %s",sql); MYSQL *conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, sql_stavek)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } mysql_close(conn);

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

55

} void vpisMySQLnapake() { char sql[250]="INSERT INTO log_sensors(idm, description) VALUES ("; char sql2[10]; char sql3[50]=",'Se ne odziva');"; snprintf(sql2,10,"%i",idm); //id modula iz int v string strcat (sql,sql2); //sestavljanje MySQL stavka strcat (sql,sql3); printf ("Insert INTO SQL= %s",sql); MYSQL *conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, sql_stavek)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } }

Priloga D – Programska koda mikrokrmilnika za sporejemno-oddajno enoto za

vklop in izklop tokokrogov

#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" unsigned long temp; unsigned long prejsnji_podatek = 0x63000101; unsigned long trenutni_podatek; short int kanal; short int tip; unsigned long stanje; unsigned long prejeti_podatki; //prikljucni pin za vklop releja const int rele_pin = 7; //spremenljivka za vklop in izklop releja int stanje_releja = LOW; // priključni pini za SPI vodilo za brezžični modul RF24 radio(9,10); //inicializacije spremenljivke, ki vrne "true" ko smo podatek prejeli

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

56

boolean sprejeto = false; //Naslovi pip za komunikacijo med brezžičnimi moduli const uint64_t pipes[2] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL }; //definiranje podprogramov void setRelay(); void decoder(); bool firstRun = false; void setup(void) { Serial.begin(57600); pinMode(rele_pin, OUTPUT); printf_begin(); printf("\nVklop in izklop tokokroga s pomočjo releja\n\r"); radio.begin(); radio.setRetries(15,15); //nastavitev ponovitev pošiljanja radio.setChannel(99); //nastavitev kanala radio.openWritingPipe(pipes[0]); //nastavitev podatkovne pipe za pisanje radio.openReadingPipe(1,pipes[1]);//nastavitev podatkovne pipe za branje radio.startListening(); //začnemo preverjati razpoložljive podatke po zraku radio.printDetails(); //izpis detajlov modula //preverjanje delovanja digitalWrite(rele_pin, HIGH); delay(3000); digitalWrite(rele_pin, LOW); } void loop(void) { while (radio.available()) { // While there is data ready radio.read( &prejeti_podatki, sizeof(unsigned long) ); //prejemanje podatka radio.stopListening(); //izhod iz bralnega načina delovanja modula radio.write( &prejeti_podatki, sizeof(unsigned long) ); //vrnemo prejeti podatek na centralno enoto radio.startListening(); //bralni način delovanja prejsnji_podatek = prejeti_podatki; trenutni_podatek = prejeti_podatki; setRelay(); //klic podprograma za nastavitev releja } } void setRelay() { decoder(); //klic podprograma za dekodiranje prejetega podatka printf("\nStanje: %i",stanje); printf("\nTip: %i",tip); if (stanje == 1 && tip == 1) //vklop releja { stanje_releja = HIGH; digitalWrite(rele_pin, stanje_releja);

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

57

} else if (stanje == 1 && tip == 2) //vklop releja za določen čas { stanje_releja = HIGH; digitalWrite(rele_pin, stanje_releja); delay(2000); stanje_releja = LOW; digitalWrite(rele_pin, stanje_releja); } else { stanje_releja = LOW; // izklop releja - nedovoljeno stanje digitalWrite(rele_pin, stanje_releja); } } void decoder() { trenutni_podatek = prejeti_podatki; printf("\nDekodiranje sifre (0x%X)",trenutni_podatek); //maskiranje prejetega podatka in izločitev vrednosti označene z FF kanal = ((trenutni_podatek & 0xFF000000)|(trenutni_podatek >> 24)); printf("\n"); printf("0x%X",kanal); //maskiranje prejetega podatka in izločitev vrednosti označene z FF trenutni_podatek = prejeti_podatki; stanje = trenutni_podatek & 0x00FFFF00; stanje = stanje >> 8; printf("\n"); printf("0x%X",stanje); //maskiranje prejetega podatka in izločitev vrednosti označene z FF trenutni_podatek = prejeti_podatki; tip = trenutni_podatek & 0x000000FF; printf("\n"); printf("0x%X",tip); printf("\n"); }

Priloga E – Programska koda centralne enote za vklop in izklop tokokrogov

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <string> #include <getopt.h> #include <cstdlib> #include <iostream> #include "/home/alen/irisa/rf24libs/RF24/RF24.h" #include <mysql/mysql.h> #define SERVER "localhost"

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

58

#define USER "pialen" #define PASSWORD "pialen123" #define DATABASE "iris" //UKAZ PREVAJALNIKU // g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/alen/irisa/rf24libs/RF24/ -lrf24 readSensorsFinal.cpp -o readSensorsFinal `mysql_config --cflags --libs` unsigned long prejeti_podatek; unsigned long prejsnji_podatek; unsigned long izhodni_podatek=0x12345678; float value = 0.0; char valueS[10]; char idS[10]; char sql [160]; unsigned long temperatura; unsigned long prejeta_vrednost = 0x00000000; unsigned long vrednost; short int channel; short int ostanek; short int stanje; void decoder(); void encoder(); void vpisMySQL(); void nastavitev_nRF(void); using namespace std; RF24 radio(22,0); const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; uint8_t kanal = 0xAB; uint8_t id = 0; uint8_t idm = 0; uint8_t tip = 0; int main( int argc, char ** argv) { nastavitev_nRF(); MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "SELECT idm, stanje,(SELECT kanal FROM rele WHERE rele.id=rele_temp.idm) AS kanal,(SELECT tip FROM rele WHERE rele_temp.idm=rele.id)

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

59

AS tip,MAX(id) AS id FROM rele_temp GROUP BY idm")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); while ((row = mysql_fetch_row(res)) != NULL) { idm = atoi(row[0]); stanje = atoi(row[1]); kanal = atoi(row[2]); tip = atoi(row[3]); id = atoi(row[3]); encoder(); radio.setChannel(kanal); /************POŠILJANJE ***************************/ int ponovitve = 0; bool allOk = false; while (ponovitve++ <= 3) { prejsnji_podatek = prejeti_podatek; radio.stopListening(); printf("*** Rele ID=%i kanal=%i tip=%i posiljanje=%i ***\n",idm,kanal,tip,ponovitve); printf("Posiljam...\n"); bool ok = radio.write( &vrednost, sizeof(unsigned long) ); if (!ok) { printf("napaka.\n"); } radio.startListening(); unsigned long started_waiting_at = millis(); bool timeout = false; while ( ! radio.available() && ! timeout ) { if (millis() - started_waiting_at > 200 ) timeout = true; } if ( timeout ) { printf("Napaka! Oddaljena enota se ne odziva...\n"); } else { radio.read( &prejeti_podatek, sizeof(unsigned long) ); printf("Got response %lu\n",prejeti_podatek); printf("Inbox 0x%X\n",prejeti_podatek); }

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

60

if (prejsnji_podatek != prejeti_podatek) { allOk = true; break; } } if (allOk) { vpisMySQL(); } else { printf("**************** KONEC branja releja ID=%i ***********\n",id); printf("****************** 'RELE' SE NE ODZIVA!!! **************\n\n",id); } } printf("\n"); mysql_free_result(res); mysql_close(conn); return 0; //konec izvajanja programa } void nastavitev_nRF(void) { printf("\nInicializacija modula - nRF24L01+\n"); radio.begin(); radio.setRetries( 15, 15); //nastavitev ponovitev radio.setChannel(kanal); //nastavitev RF kanala radio.openWritingPipe(pipes[0]); //odpiranje pisalne pipe radio.openReadingPipe(1,pipes[1]); //odpiranje bralne pipe radio.startListening(); //bralni način delovanja radio.printDetails(); //izpis nastavitev } void vpisMySQL() { /****************************************************************************/ char sql[250]="DELETE FROM `rele_temp` WHERE idm="; char sql2[10]; char sql3[50]=";"; snprintf(sql2,10,"%i",id); //pretvorba id modula iz float v string strcat (sql,sql2); //sestavljanje MySQL stavka strcat (sql,sql3); printf ("Update SQL= %s",sql); MYSQL *conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); }

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

61

if (mysql_query(conn, sql)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } mysql_close(conn); } void encoder() { vrednost = 0x00000000; vrednost = vrednost | kanal; //OR funkcija vrednost = vrednost << 16; vrednost = vrednost | stanje; vrednost = vrednost << 8; vrednost = vrednost | tip; printf("\nKodiranje sifre\n"); printf("0x%X",vrednost); printf("\n"); } void decoder() { vrednost = prejeta_vrednost; channel = ((vrednost & 0xFF000000)|(vrednost >> 24)); vrednost = prejeta_vrednost; temperatura = vrednost & 0x00FFFF00; temperatura = temperatura >> 8; vrednost = prejeta_vrednost; ostanek = vrednost & 0x000000FF; printf("Dekodiranje sifre (0x12345678)"); printf("\n"); printf("0x%X",channel); printf("\n"); printf("0x%X",temperatura); printf("\n"); printf("0x%X",ostanek); printf("\n"); }

Priloga F – Programska koda sprejemno-oddajne enote za krmiljenje motorjev

(radiatorskega ventila)

#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" //inicializacija funkcij void vrtenje(boolean smer, int vrednost); // priključni pini za SPI vodilo za brezžični modul RF24 radio(9,10);

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

62

//Naslovi pip za komunikacijo med brezžičnimi moduli const uint64_t pipes[2] = { 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL }; //priključni pini za vrtenje motorja const int vrti_levo = 5; const int vrti_desno = 6; // inicializacija priključkov za detektiranje skrajnih leg int tok_pin_0 = A0; int tok_pin_1 = A1; //inicializacija spremenljivk int prejeti_podatki; int trenutno_stanje = 0; int tok_1 = 0; //inicializacija spremenljivke za kalibriranje motorja boolean nastavitve = false; float tempC; unsigned long time; void setup() { Serial.begin(57600); printf("\nRadiator VALVE control\n\r"); radio.begin(); radio.setRetries(15,15); radio.setChannel(0x4d); radio.setPALevel(RF24_PA_MAX); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); radio.startListening(); radio.printDetails(); //definiranje izhodov mikrokrmilnika pinMode(vrti_levo, OUTPUT); pinMode(vrti_desno, OUTPUT); } void loop() { //izklop vrtenja motorja digitalWrite(vrti_levo, LOW); digitalWrite(vrti_desno, LOW); //spodnji del kode se izvede le ob priključitvi napajanja if (nastavitve == false) { vrtenje(true,99999); //zapiranje do konca nastavitve = true; } else { while (radio.available()) { // While there is data ready radio.read( &prejeti_podatki, sizeof(unsigned long) ); //prejemanje podatka

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

63

radio.stopListening(); //izhod iz bralnega načina delovanja modula radio.write( &prejeti_podatki, sizeof(unsigned long) ); //vrnemo prejeti podatek na centralno enoto radio.startListening(); //bralni način delovanja int cas = 0; if (prejeti_podatki >= trenutno_stanje) { //ODPIRANJE cas = (prejeti_podatki - trenutno_stanje)*200; printf("\nOdpiranje: %i... milisekund",cas); vrtenje(false,cas); //klic podprograma za vrtenje trenutno_stanje = prejeti_podatki; } else { //ZAPIRANJE cas = (trenutno_stanje-prejeti_podatki)*200; printf("\nZapiranje: %i... milisekund",cas); vrtenje(true,cas); //klic podprograma za vrtenje trenutno_stanje = prejeti_podatki; } printf("\nOK\n"); } //Branje podatkov in izvedba vrtenja } } void vrtenje(boolean smer, int vrednost) { boolean prekinitev = false; if (smer == false) //VRTENJE LEVO { time = millis(); digitalWrite(vrti_levo, HIGH); while ((millis()-time < vrednost)&&(!prekinitev)) { tok_1 = (analogRead(tok_pin_1) - analogRead(tok_pin_0)); if (millis()-time < 200) { Serial.print("\nZagonski čas...\n"); } else if (tok_1 <= 960) { digitalWrite(vrti_levo, LOW); Serial.print("\nDosežena skrajna lega LEVO\n"); prekinitev = true; } } digitalWrite(vrti_levo, LOW); //konec vrtenja } else if (smer == true) //VRTENJE DESNO {

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

64

time = millis(); digitalWrite(vrti_desno, HIGH); while ((millis()- time < vrednost)&&(!prekinitev)) { tok_1 = (analogRead(tok_pin_0) - analogRead(tok_pin_1)); if (millis()-time < 200) { Serial.print("\nZagonski čas...\n"); } else if (tok_1 <= 960) { digitalWrite(vrti_desno, LOW); Serial.print("\nDosežena skrajna lega DESNO\n"); prekinitev = true; } } digitalWrite(vrti_desno, LOW); } }

Priloga G – Progrmaksa koda centralne enote za krmiljenje radiatorskih ventilov

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <string> #include <getopt.h> #include <cstdlib> #include <iostream> #include "/home/alen/irisa/rf24libs/RF24/RF24.h" #include <mysql/mysql.h> #define SERVER "localhost" #define USER "pialen" #define PASSWORD "pialen123" #define DATABASE "iris" //UKAZ PREVAJALNIKU // g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/alen/irisa/rf24libs/RF24/ -lrf24 readSensorsFinal.cpp -o readSensorsFinal `mysql_config --cflags --libs` //Inicializacija spremenljivk unsigned long prejeti_podatek; unsigned long presnji_podatek; unsigned long podatek_za_posiljanje=0x12345678; int id_modula; int tip; //PARAMETER za nastavitev podrocja regulacije float podrocje_regulacije = 4.0; //PARAMETER za najvišjo mozno temperaturo

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

65

float zgornja_temp = 1.05; float nastavljena_temp = 0.0; float izmerjena_temp = 0.0; //Inicializacija za brezzicni modul const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; RF24 radio(22,0); //spremenljivka za dolocitev kanala uint8_t kanal = 0xAB; //Inicializacija funkcij int preracunaj(float zeljena_temp, float izmerjena_temp); void vpisMySQL(); void nastavitev_modula(void); using namespace std; int main( int argc, char ** argv) { nastavitev_modula(); //funkcija za nastavitev modula //Inicializacija kazalcev za potrebe pridobivanja podatkov iz podatkovne baze MySQL MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "SELECT modules.id AS id_modul,modules.id_senzor, modules.kanal, modules.info, meritve.id AS id_meritve, meritve.value AS izmerjena_t,curtime(),settings.value AS zeljena_t,settings.time_from,settings.time_to,module_settings.value AS odprtost,module_settings.created AS odprtost_date, modules.tip FROM modules LEFT JOIN meritve ON modules.id_senzor = meritve.idm AND meritve.id = (Select Max(meritve.id) From meritve WHERE meritve.idm=modules.id_senzor) LEFT JOIN settings ON modules.id = settings.idm AND settings.id = (SELECT MAX(id) FROM settings WHERE (curtime() BETWEEN time_from and time_to) AND settings.idm=modules.id ORDER BY id DESC LIMIT 1) LEFT JOIN module_settings ON modules.id = module_settings.idm;")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); while ((row = mysql_fetch_row(res)) != NULL) { //Pridobivanje podatkov za vsak modul posebej id_modula = atoi(row[0]); kanal = atoi(row[2]);

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

66

nastavljena_temp = strtof (row[7],NULL); izmerjena_temp = strtof (row[5],NULL); tip = atoi(row[12]); //nastavitev kanala brezžičnega modula nRF24L01+ radio.setChannel(kanal); if (tip == 5) { //PRERAČUNAVANJE ODPRTOSTI podatek_za_posiljanje = preracunaj(nastavljena_temp,izmerjena_temp); printf("\n idm=%i kanal=%i nastavljena_temp=%.2f izmerjena_temp=%.2f podatek_za_posiljanje=0x%X=%i\n",id_modula,kanal,nastavljena_temp,izmerjena_temp,podatek_za_posiljanje,podatek_za_posiljanje); /************POŠILJANJE PRVIČ**********************/ int ponovitve = 0; bool all_ok = false; while (ponovitve++ <= 5) { presnji_podatek = prejeti_podatek; //prepis prejsnjega podatka da lahko detektiramo uspesno prejete podatke radio.stopListening(); //prehov v pisalni način delovanja brezžičnega modula printf("*** Senzor ID=%i kanal=%i posiljanje=%i ***\n",id_modula,kanal,ponovitve); printf("Posiljanje...\n"); bool ok = radio.write( &podatek_za_posiljanje, sizeof(unsigned long) ); if (!ok) { printf("spodleteli prenos...\n"); } radio.startListening(); //prehod v bralni način delovanja brezzicnega modula //Definiranje casovnika koliko časa bomo čakali na oddaljeni modul unsigned long started_waiting_at = millis(); bool timeout = false; while ( ! radio.available() && ! timeout ) { if (millis() - started_waiting_at > 200 ) timeout = true; } if ( timeout ) { printf("Napaka. Oddaljeni modul se ne odziva...\n"); } else { // Prestrežemo podatek od oddaljenega

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

67

modula radio.read( &prejeti_podatek, sizeof(unsigned long) ); printf("Pridobljeni podatek %lu\n",prejeti_podatek); printf("Pridobljeni podatek (hex) 0x%X\n",prejeti_podatek); } if (presnji_podatek != prejeti_podatek) //preverjanje ali je prejsnji podatek različen od trenutnega { all_ok = true; //uspešno prebrani podatki break; } } if (all_ok) { vpisMySQL(); //vpis nove nastavljene vrednost v podatkovno bazo za prikaz na spletni strani } printf("**************** KONEC branja senzorja z ID=%i ***********\n\n",id_modula); } else printf("\nTIP modula=6!!! (KRMILJENE ROLET oz. ZALUZIJ)\nNaslednji senzor...\n"); } /* zapiranje povezave MySQL */ mysql_free_result(res); mysql_close(conn); return 0; //KONEC PROGRAMA!!! } void nastavitev_modula(void) { printf("\nInicializacija brezzicnega modula - nRF24L01+\n"); radio.begin(); radio.setRetries( 15, 15); //nastavitev ponovitev radio.setChannel(kanal); //nastavitev kanala radio.openWritingPipe(pipes[0]); //odpiranje pisalne pipe radio.openReadingPipe(1,pipes[1]); //odpiranje bralne pipe radio.startListening(); //bralni način delovanja modula radio.printDetails(); //izpis detajlov } int preracunaj(float zeljena_temp, float izmerjena_temp) { zeljena_temp *= zgornja_temp; //določitev zgornje oziroma željene temperature //printf("\nZeljena: %.3f\n",zeljena_temp); float odprtost = (zeljena_temp - izmerjena_temp*100)/podrocje_regulacije; if(odprtost <= 0.0) //omejitev odprtosti navzdol return (0); else if (odprtost >= 100.0) //omejitev odprtosti navzgor

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

68

return (100); else return ((int)odprtost); //vrnemo celostevilcno vrednost } void vpisMySQL() { /****************************************************************************/ char sql[250]="UPDATE `module_settings` SET `value`="; char sql2[10]; char sql3[50]=", `created`=NOW() WHERE idm="; char sql4[10]; char sql5[10]=";"; snprintf(sql2,10,"%i",podatek_za_posiljanje); //pretvorba temperature iz float v string snprintf(sql4,10,"%i",id_modula); //printf("\nDan: %s\n",sql2); //snprintf(tempS,10,"%.2f",temp); //pretvorba temperature iz float v string //printf("\nTemperatura:%s *C\n",tempS); strcat (sql,sql2); //sestavljanje MySQL stavka strcat (sql,sql2); strcat (sql,sql3); strcat (sql,sql4); strcat (sql,sql5); printf ("Update SQL= %s",sql); //Vpis trenutne odprtosti v podatkovno bazo za prikaz MYSQL *conn; conn = mysql_init(NULL); if (!mysql_real_connect(conn, SERVER, USER, PASSWORD, DATABASE, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, sql)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } mysql_close(conn); }

Priloga H – Dodatna programska koda za mikrokrmilnike – printf.h

/* Copyright (C) 2011 J. Coliz <[email protected]> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

69

*/ /** * @file printf.h * * Setup necessary to direct stdout to the Arduino Serial library, which * enables 'printf' */ #ifndef __PRINTF_H__ #define __PRINTF_H__ #ifdef ARDUINO int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); } #else #error This example is only for use on Arduino. #endif // ARDUINO #endif // __PRINTF_H__

Priloga I – Drevesna struktura programske kode za spletni prikaz

Zaradi prevelike obsežnosti programske kode za prikaz spletne strani je le ta dosegljiva

na digitalnem mediju v mapi »www«.

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

70

Smetanova ulica 17

2000 Maribor, Slovenija

I Z J A V A O A V T O R S T V U

Spodaj podpisani/-a

z vpisno številko

sem avtor/-ica diplomskega dela z naslovom:

(naslov diplomskega dela)

S svojim podpisom zagotavljam, da:

sem diplomsko delo izdelal/-a samostojno pod mentorstvom (naziv, ime in priimek)

so elektronska oblika diplomskega dela, naslov (slov., angl.), povzetek (slov., angl.) ter ključne besede (slov., angl.) identični s tiskano obliko diplomskega dela.

soglašam z javno objavo elektronske oblike diplomskega dela v DKUM.

V Mariboru, dne

Podpis avtorja/-ice:

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

71

Smetanova ulica 17

2000 Maribor, Slovenija

IZJAVA O USTREZNOSTI ZAKLJUČNEGA DELA

Podpisani mentor :

_____________________________________________

(ime in priimek mentorja)

Izjavljam, da je študent

Ime in priimek:_________________________________

Vpisna številka:________________________________

Na programu:__________________________________

izdelal zaključno delo z naslovom:

_______________________________________________________________________

(naslov zaključnega dela v slovenskem in angleškem jeziku)

_______________________________________________________________________

v skladu z odobreno temo zaključnega dela, Navodilih o pripravi zaključnih del in mojimi (najinimi oziroma našimi) navodili. Preveril (-a, -i) in pregledal (-a, -i) sem (sva, smo) poročilo o plagiatorstvu. Datum in kraj: Podpis mentorja: Datum in kraj: Podpis somentorja (če obstaja): Priloga:

- Poročilo o preverjanju podobnosti z drugimi deli.«

Abraham, Alen (2015): Modularni sistem za avtomatizacijo hiše. Diplomsko delo. Maribor: UM FERI.

72

Smetanova ulica 17

2000 Maribor, Slovenija

IZJAVA O ISTOVETNOSTI TISKANE IN ELEKTRONSKE VERZIJE ZAKLJUČNEGA DELA IN OBJAVI OSEBNIH PODATKOV DIPLOMANTOV

Ime in priimek avtorja-ice:

Vpisna številka:

Študijski program:

Naslov zaključnega dela:

Mentor:

Podpisani-a izjavljam, da sem za potrebe arhiviranja oddal elektronsko verzijo zaključnega dela v Digitalno knjižnico Univerze v Mariboru. Zaključno delo sem izdelal-a sam-a ob pomoči mentorja. V skladu s 1. odstavkom 21. člena Zakona o avtorskih in sorodnih pravicah dovoljujem, da se zgoraj navedeno zaključno delo objavi na portalu Digitalne knjižnice Univerze v Mariboru. Tiskana verzija zaključnega dela je istovetna z elektronsko verzijo elektronski verziji, ki sem jo oddal za objavo v Digitalno knjižnico Univerze v Mariboru.

Zaključno delo zaradi zagotavljanja konkurenčne prednosti, varstva industrijske lastnine ali tajnosti podatkov naročnika: ne sme biti javno dostopno do (datum odloga javne objave ne sme biti daljši kot 3 leta od zagovora dela).

Podpisani izjavljam, da dovoljujem objavo osebnih podatkov, vezanih na zaključek študija (ime, priimek, leto in kraj rojstva, datum zaključka študija, naslov zaključnega dela), na spletnih straneh in v publikacijah UM. Datum in kraj: Podpis avtorja-ice: Podpis mentorja: (samo v primeru, če delo ne sme biti javno dostopno)

Podpis odgovorne osebe naročnika in žig: (samo v primeru, če delo ne sme biti javno dostopno)