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ä:

 

image108.png

 

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äyttyyLö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:

 

image101.png

 

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ä:

 

image102.png

 

 

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:

 

 image103.png

 

Sitten lähdimme luomaan omat subit sensoreille:

 

image104.png

Eli UÄ-sensori toteaa että joku meni ohi ja laittoi aikaleiman ylös. Sitten PIR-sensori näkee liikettä, toteaa että UÄ on 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:

 

etaisyys.PNG

 

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:

 

image106.png

 

Seurantakoodi oli siis nyt näin:

 

image107.png

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.

 image108.png

 

Lähtöehto koodiin, UÄ ja PIR

 

Laitetaan uusi ajastinlahtoAjastin 

 

image109.png

 

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.

 image10a.png

 

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:

 

image10b.png

 

 

TabStopitja TabIndexitkohdalleen GUI:ssa

 

 image10c.png

 

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 (ToolTipsGUI:hin

 

Ensiksi meidän tuli lisätä tämä työkalu lomakkeeseen. Nimesimme sen kuva mukaisesti Työkaluvihjeet 

 

image10d.png

 

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

 

image10e.png

 

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