Raja-arvojen kontrollit käyttöliittymään ja koodi hälytyksille ja nollaamisille
Ajastimen toiminta
Lähdimme liikkeelle siitä, että saisimme laukaistua toiminnon, kun hälytyksestä olisi kulunut GUI:ssa määrätty aika.
http://www.vb-helper.com/howto_2005_countdown_timer.html
Tämä edellytti, että teimme ensin tarvittaville raja-arvoille muutaman uuden kontrollin. Samalla teimme jatkoa varten muutaman muunkin samalla kertaa. Nyt näytti tältä:

Saimme esimerkkikoodin toimimaan, joten seuraavaksi lähdimme koodaamaan seuraavaa ehtoa.
Logiikka hälytykselle
Tilanne 1.
Nyt piti miettiä, että mitkä reunaehdot tulisi täyttyä, jotta hälytys annetaan.
Lämpötilarajaylityksen ja sen kestoehdon tulee ensin täyttyä. Toisakseen löylyyn on pitänyt jonkun tulla ja se on tulkittu UÄ-sensorilla ja liiketunnistimella.
UÄ-anturi siis laukeaa saunaan tullessa ensin ja muutoksesta merkitään aikaleima muuttujaan. Kun sitten löylyhuoneessa havaitaan liikettä (PIR), niin katsotaan josko tuore aikaleima UÄ:ltä ja tästä tieto toiseen aikaleimaan ja näiden vertailusta päätellään että löylyyn on joku todella saapunut. Tällä eliminoidaan liiketunnistimen väärä hälytys.
Jos siis lämpötila- ja aikaraja ylittyy ja löylyssä on yhä joku, niin annetaan hälytys, mikäli läsnäoloehto täyttyy. Löylyssäolo päätellään PIRin havaitsemasta tai sitten jos liikettä ei havaita määrätyssä ajassa, niin katsotaan UÄ:n anturin hälytyksen viimeistä aikaleimaa (se ei saa olla sama kuin tuloleima) ja sen perusteella päätellään onko löylyssä enää ketään.
Jos löylyssä on siis yhä joku, niin annetaan hälytys.
Tilanne 2.
Lämpimään saunaan ja löylyyn on tultu, mutta sieltä ei ole poistuttu (UÄ-sensorin aikaleima) aikarajan puitteissa.
Tilanne 1. lämpötilaehto ja aikaraja sille
Otimme käsittelyyn lämpötilaehdon ja aikarajan sille. Funktion rakenteesta johtuen emme voineet käyttää lämpötilan hetkellisessä arvossa enää tekstikentän arvoa, joten määrittelimme sille kokonaislukumuuttujan lampo ja sille määrityksen seuraavasti:

Koodasimme ensin ajastimen, että se käynnistyy, mikäli asetettu lämpötilaraja ylittyy ja samalla määritettiin aika kuinka kauan ajastin juoksee ennen kuin se laukeaa ja aiheuttaa tarvittaessa hälytyksen.
Toisessa subissa sitten juoksuttaa nollaan ja tekee hälytyksen tältä osin, mikäli yhä tarpeen. Koodimme näytti nyt tältä:

Kuten videosta näkyy (videossa GUI:n vanhempi versio), niin ei startannut, jos lämpötila olialle hälytysrajan, ei antanut hälytystä, jos lämpötila ehti laskea rajan alle ja antoi hälytyksen, jos lämpötila oli vielä yli rajan, kun aikaraja tuli vastaan.
Tuloehto UÄ- ja liikesensori
Lähdimme liikkeelle luomalla parit muuttujat:
![]()
Sitten lähdimme luomaan omat subit sensoreille:

Eli UÄ-sensori toteaa että joku meni ohi ja laittoi aikaleiman ylös. Sitten PIR-sensori näkee liikettä, toteaa että UÄ on nähnyt myös ja päättelee, että nyt on löylyyn joku saapunut.Seuraavaksi koodit vain piti saada ajettua järkevään aikaan. Pidimme helpoimpana tapana kytkeä ne aiempien tekstikenttien laukaisuihin, koodissa näin:
Testissämme näytti tältä (vanhempi GUI):
Hyvin toimii, kiva.
Tilanne 1. ehtojen yhdistäminen
Seuraavaksi yhdistimme nämä kaksi vaatimusta. Ensimmäiseksi huomasimme tarvitsevamme yhden TOSI/EPÄTOSI -tarkisteen yhdistämistä varten. Tämä tarkiste muuttuu todeksi, kun lämpö- ja aikaraja yhdessä ylitetään. Ja kun sitten myös liikettä havaitaan, niin mikäli tarkiste on tosi, niin hälytys annetaan. Tässä kohtaa piti siis saada lämpötila- ja aikaseuranta juoksemaan myös koko ajan taustalle. Kytkimme senkin siis samaan tapaan sinne tekstikentän muutosseurantaan, muutimme samalla subin nimen kuvaavammaksi:

Seurantakoodi oli siis nyt näin:

Testasimme ja saimme tällaista (vanha GUI):
Pelasi, hyvä.
Logiikka milloin löylyhuone on tyhjentynyt
Tässä ajattelimme seuraavanlaista kuviota. Kun liikesensori hälyttää, niin laitetaan ajastin juoksemaan ja kun määrätyn ajan kuluttua tarkistetaan PIRrin huomaaman viimeisen liikkeen aikaleima, niin sen tulee olla aikaleimaltaan sama koko ajastimen lahtoAjastin juoksun aikana ja sen on oltava vanhempi kuin UÄ:n (kulkusuuntaindikaattorimme). Jos näin on, niin nollataan kaikki arvot alkutilanteeseen.Tämä vaati taas yhden uuden kontrollin ja arvon tauluun ja teimme samaan syssyyn toisetkin, koska myös tilanne 2 vaatisi yhden lisää molempia.

Lähtöehto koodiin, UÄ ja PIR
Laitetaan uusi ajastinlahtoAjastin

Lisäillään tarvittava koodi. Se oli taas vain pieni askelmille tahansa kunnalle ja puoli sivua koodia, mutta luojaltaan taas paljon hikeä, muttei onneksi kyyneleitä. Koodimme kommentit kertokoon tyhjentävästi mistä oli kyse ja miten se toteutettiin.Tulikohan koodaajalle henkilökohtainen ennätys sisäkkäisissä If-lauseissa.

Tilanne 2. löylyssä ollaan liian pitkään
Loimme jälleen pari kontrollia lisää, jotta maksimiaika ja -lämpö löylyssäololle ilman hälytystä saadaan GUI:ssa asetettua. Ja näille taulukkoon omat solunsa(3, 2) & (3, 3) ja näiden huomioiminen tallennuksessa ja lataamisessa. Koodiin määrittelimme saunaoloaikaehdolle seuraavasti. Koodin kommentit puhukoot puolestaan:

TabStopitja TabIndexitkohdalleen GUI:ssa

Laittelimme GUI:ssa TabSopit pois päältä niihin kontrolleihin, joihin emme tarkoittaneet käyttäjän koskevan. Tässä kannatti huomata, että kaikkien noiden kenttien arvon saattoi laitella kerralla Falseksi, kunhan ensin nokki kaikki ne valintaan hiirellä ja CTRL-napilla. Sama päto muihin yhteisiin asetuksiin ja olimmekin jo aiemmin viilailleet kenttien ulkoasua tuolla tavalla.
TabIndexit laittelimme siihen järjestykseen, että tabulaattorilla järjestys on käyttäjälleen looginen. Meillä oli aiempaa kokemusta tilanteesta, jossa näihin ei oltu kiinnitetty huomiota ja vasta käyttöönotossa huomattiin kuinka järjestys pomppi sinne sun tänne ja käyttäjä pääsi kenttiin, joihin ei ollut tarkoitus. Mitään emme myönnä.
Viilailumme jälkeen testi meni näin:
Työkaluvihjeet (ToolTips) GUI:hin
Ensiksi meidän tuli lisätä tämä työkalu lomakkeeseen. Nimesimme sen kuva mukaisesti Työkaluvihjeet

Nyt saimme kontrollien ominaisuuksin kentän mihin syöttää vihjeet:

Teimme jokaiseen kontrolliin mihin käyttäjä pääsee syöttämään tai käyttämään, oman vihjeensä.
Sivu 12 / 16