Potem, ko smo se spoznali s konceptom pametnega trezorja, možnostmi krmilne ploščice in s programsko logiko, bomo v tem zadnjem nadaljevanju predstavili navodila za njegovo uporabo, opisali bomo tudi tehnike programiranja, ki so bile uporabljene za branje matrične tipkovnice preko PCF8574 čipa in za izpis omejenega trajanja na LCD-ju. Pokazali bomo tudi, kako lahko razlikujemo prvo izvršitev programa.
Trezor ima dvoja vrat: masivna notranja (v programu so 1. vrata) in mrežasta zunanja (2. vrata). V osnovnem načinu delovanja lahko vrata samostojno odpiramo in zapiramo z vnosom ustreznih kod. V konfiguracijskem načinu je možno inicializirati program, nastaviti vrata v osnovni položaj in vnesti kode za odpiranje in zapiranje vrat.
Prvi zagon programa
Na displeju se bo izpisalo sporočilo
STEM 2023 Sef pripravljen!
Ker šifre za odpiranje/zapiranje vrat še niso definirane, bo program zagnal proces inicializacije. V njemu se bodo postavile začetne vrednosti za odpiranje in zapiranje prvih vrat
resetiranje kode
koda 1 = 1234
in nato še drugih vrat:
resetiranje kode
koda 2 = 5678
Kode bodo zapisane v trajni pomnilnik mikrokontrolerja in bodo veljavne do naslednje spremembe. Po tem je potrebno umeriti položaj vrat. Najprej se bo izpisalo sporočilo nastavitev vrat
In nato maska z ukazi za premik zunanjih vrat:
< [1] [OK] [3] >
Odpri 2. vrata!
Vrata se vrtijo v levo, medtem ko držite tipko “1” na tipkovnici. Vrata se vrtijo v desno, medtem ko držite tipko “3” na tipkovnici. Ko so vrata popolnoma odprta, pritisnemo tipko “OK”.
Nato se bo izpisala maska z ukazi za zagon notranjih vrat:
< [1] [OK] [3] >
Odpri 1. vrata!
Vrata se vrtijo v levo, medtem ko držite tipko “1” na tipkovnici. Vrata se vrtijo v desno, medtem ko držite tipko “3” na tipkovnici. Ko so vrata popolnoma odprta, pritisnemo tipko “OK”.
S tem je postopek zaključen. Ob sporočilu “Zapiram vrata!”, se bodo obojna vrata zaprla in program se bo postavil v osnovni način delovanja.
Osnovni način delovanja
V osnovnem načinu delovanja program pričakuje vnos kode za odpiranje vrat:
koda: ____
Vpiši kodo!
S pritiski na tipke 0-9 vnašamo številko po številko naše šifre. Vsaka vpisana številka se bo kratkotrajno prikazala,
koda: **3_
Vpiši kodo!
in nato prekrila z zvezdico:
koda: ***_
Vpiši kodo!
V tem primeru so vpisane prve tri številke šifre in program pričakuje vpis zadnje številke. Če vtipkamo več kot 4 številke, se bodo prve štiri izgubile in vpis se bo nadaljeval od začetka. Vpis lahko zbrišete s pritiskom na tipko “C”, nakar pričnemo novi vnos od prve številke. Ko smo vpisali vse štiri številke vnos potrjujemo s pritiskom na tipko “OK”.
Program bo preveril, ali se vpisana šifra ujema s šiframi za odpiranje prvih ali drugih vrat. Če se ujema, se bodo odprla ali zaprla ena od vrat (ista šifra velja za odpiranje in zapiranje!). Če se ne ujema, bo program izpisal sporočilo
koda: ****
Koda ???
in pričakoval vnos nove šifre.
Konfiguracijski način dela
V konfiguracijski način delovanja lahko vstopimo, če je na glavni ploščici postavljen kratkostičnik med priključki D13 in GND. V tem načinu delovanja, poleg šifer za odpiranje in zapiranje vrata, program dodatno razpozna tudi šifre “0000” in “9999”.
Šifra «0000» zažene proceduro identično tisti, ki je opisana pod naslovom Prvi zagon programa.
Šifra «9999» omogoča zamenjavo šifer za odpiranje in zapiranje vrat. Najprej se bo izpisalo sporočilo “sprememba kode”, in nato maska za vnos šifre za odpiranje in zapiranje prvih vrat:
koda: ____
Vnesi 1. kodo!
Postopek vnosa šifre je identičen vnosu šifre v osnovnem načinu delovanja. Po pritisku na tipko “OK” bo program sprejel vpisano šifro in izpisal masko za vnos šifre za odpiranje in zapiranje drugih vrat:
koda: ____
Vnesi 2. kodo!
Po pritisku na tipko “OK” bo program sprejel vpisano šifro, zapomnil si bo obe šifri v trajni spomin mikrokontrolerja, izpisal bo sporočilo “Sef pripravljen!” in se vrnil v osnovni način delovanja.
Po zaključeni inicializaciji in konfiguraciji priporočamo, da se odstrani kratkostičnik med priključkoma D13 in GND.
aPritiski na tipke in vsa sporočila so pospremljeni z ustreznimi zvočnimi signali.
Med odpiranjem in zapiranjem vrat signalna dioda sveti zeleno. Po napačnem vnosu signalna dioda sveti rdeče. Med konfiguracijo signalna dioda sveti modro, modrozeleno ali vijolično.
Program Sef_SE.bas
Program, ki krmili delo trezorja, je napisan v programskem jeziku Bascom-AVR. Najprej bomo pogledali njegove dele, ki so namenjeni branju matrične tipkovnice!
Spomnimo se: matrično tipkovnico beremo v multipleksiranem načinu delovanja s pomočjo integriranega vezja PCF8574 (slika 27). PCF8574 ima 8 kvazi-dvosmernih priključkov P0-P7, ki jih uporabimo na naslednji način:
ko se postavi v stanje logične ničle vsak priključek postane izhodni in lahko “povleče” tok do 25 mA;
ko se postavi v stanje logične enice, je izhodna upornost priključka večkratno večja in iz njega lahko “povlečemo” samo okoli 1 mA;
zaradi omejenega izhodnega toka je priključek postavljen v stanje “1”, zato ga ne smemo resno obremeniti, če ga uporabljamo kot izhodnega, ga pa smemo kratko vezati proti masi;
če preberemo logično stanje priključkov po tem, ko smo ga postavili v stanje «1», bomo ugotovili, ali je kratko vezan proti masi, oziroma, ali je na njega vezano stikalo ali tipka, sklenjeno ali odprto.
Na kratko rečeno, priključek, ki je postavljen v stanje “1” lahko uporabimo tudi kot “slabi” izhod in kot vhod brez posebne konfiguracije.
Kot tudi vsi drugi čipi, ki podpirajo I2C komunikacijo, ima PCF8574 ima dva naslova: naslov za pisanje in naslov za branje. Naslovi so sestavljeni s karakterističnim naslovom PCF8574 čipa (“0100”), stanjem njegovih naslovnih priključkov A2-A0 (v tem projektu, “110”) in zaključnega bita, ki je “0” pri naslovu za pisanje in “1” pri naslovu za branje:
Const Pcf8574_adresa = &B01001100
Const Pcf8574_r_adresa = &B01001101
PCF8574 podpira zelo enostavno I2C komunikacijo:
ko ga naslovimo preko naslova za pisanje, bo sprejel naslednji bajt in njegovo vsebino prenesel na priključke P7-P0;
ko ga naslavljamo preko naslova za branje, bo poslal en bajt, katerega vsebina ustreza stanju priključkov P7-P0.
Za pisanje in branje sta napisana podprograma Pcf8574_pisi in Pcf8574_citaj, v katerih uporabljamo standardne Bascomove ukaze za I2C komunikacijo:
Pcf8574_pisi:
I2cstart
I2cwbyte Pcf8574_adresa
I2cwbyte Za_pcf8574
I2cstop
Return
Pcf8574_citaj:
I2cstart
I2cwbyte Pcf8574_r_adresa
I2crbyte Iz_pcf8574 , Nack
I2cstop
Return
Pred klicem podprograma za pisanje, moramo v spremenljivki Za_pcf8574 pripraviti vsebino, ki jo želimo postaviti na priključke P7-P0. Po izvršitvi podprograma za branje bodo logična stanja teh priključkov vpisana v spremenljivko Iz_pcf8574.
V glavni zanki (slika 28 levo) izmenično beremo stanje tipk v prvem, drugem in tretjem stolpcu:
Do
Gosub Debounce_kbd1
Gosub Provjeri_tipku
Gosub Debounce_kbd2
Gosub Provjeri_tipku
Gosub Debounce_kbd3
Gosub Provjeri_tipku
…
Na diagramu poteka na sliki 28 desno je podrobno prikazan samo postopek branja tipk iz prvega stolpca. Ta prvi stolpec beremo v podprogramu Debounce_kbd1. Da bi lahko prebrali tipke v prvem stolpcu, bomo priključek P1 postavili v stanje “0”, vse ostale priključke pa v stanje “1”:
Debounce_kbd1:
Za_pcf8574 = &B11111101
Gosub Pcf8574_pisi
Priključka P2 in P3 postavljata drugi in tretji stolpec v stanje “1” in tako njihove tipke odstranijo iz preverjanja, priključke P7-P4 bomo uporabili kot vhode za branje stanj tipk iz 4., 3., 2. in 1. vrste. Po kratki pavzi bomo prebrali stanja vseh priključkov in izločili tista, ki ustrezajo priključkom P7-P4:
Waitms 1
Gosub Pcf8574_citaj
Iz_pcf8574 = Iz_pcf8574 And &B11110000
V naslednjo proceduro vstopamo samo, če se novo stanje razlikuje od predhodno prebranega. S tem se izognemo večkratnemu branju iste tipke, prav tako, kot v “pravem” Bascom Debounce ukazu. Če smo prebrali novo stanje tipk v prvem stolpcu, si ga bomo zapomnili
If Kbd_col1 <> Iz_pcf8574 Then
Kbd_col1 = Iz_pcf8574
in nato smo pripravljeni za preverjanje, katera od tipk iz prvega stolpca je pritisnjena. Pritisnjena tipka bo povzročila ničlo na enem od bitov 7-4:
Select Case Kbd_col1
Case &B11100000 : Tipka = “1”
Case &B11010000 : Tipka = “4”
Case &B10110000 : Tipka = “7”
Case &B01110000 : Tipka = “C”
Še prepoznamo stanje v katerem ni pritisnjena niti ena tipka
Case &B11110000 : Tipka = “_”
in nedovoljeno stanje, v katerem je sočasno pritisnjenih več tipk:
Case Else : Tipka = “?”
End Select
End If
Return
Tako bo po izvršitvi podprograma Debounce_kbd1, vsebina string spremenljivke Tipka bila “1”, “4”, “7”, “C”, “_” ali “?”. Logika branja tipk v drugem in tretjem stolpcu kot tudi pripadajoči podprogrami, Debounce_kbd2 in Debounce_kbd3, so identični, razen da “aktivirajo” drugi ali tretji stolpec s postavljanjem priključkov P2 ali P3 v stanje “0”. Seveda so tudi vsebine spremenljivke Tipka po izvršitvi teh podprogramov različne od prej navedenih in ustrezajo imenom tipk v teh stolpcih.
Takoj po tem, ko smo prebrali stanja tipk v nekem stolpcu bomo preverili, kakšno stanje smo dobili. Preverjanje naredimo s podprogramom Provjeri_tipku, katerega logika je prikazana na diagramu na sliki 29.
Če je pritisnjena ena numerična tipka, se bo ustrezna vrednost vpisala v šifro na naslednjo pozicijo (določa jo indeks I2):
Provjeri_tipku:
Select Case Tipka
Case “0” To “9”:
…
Incr I2
Mid(sifra , I2 , 1) =
Tipka
Mid(nevidljiva_sifra ,
I2 , 1) = Tipka
Gosub Disp_sifre
I3 = 0
Tako šifro v programu formiramo znak za znakom. Opazili bomo, da sta v programu dve spremenljivki, v katerih formiramo šifro: spremenljivka Sifra in spremenljivka Nevidljiva_sifra. Obe sta vrste string in dolžine 4 znake, točno kolikor so dolge tudi šifre, ki odpirajo in zapirajo vrata. Spremenljivka Sifra vsebuje vpisano vrednost in jo uporabimo zato, da bi jo lahko primerjali s “poznanimi” (dovoljenimi) šiframi. Spremenljivko Nevidljiva_sifra uporabimo v podprogramu Disp_sifre za prikaz šifre na LCD-ju, čemur se bomo posvetiti malo kasneje.
Če je pritisnjena tipka «C», bomo šifro zbrisali:
Case “C”:
Gosub Beep
Gosub Brisi_sifru
Zbrisana šifra vsebuje štiri podčrtaje (“_”). Če je pritisnjena tipka “OK”, bomo preverili, ali gre za eno od dovoljenih šifer, izvršili bomo pridruženo aktivnost in nato zbrisati šifro, saj je svoje “naredila”:
Case “O”:
Gosub Beep
Gosub Provjeri_sifru
Gosub Brisi_sifru
Na koncu bomo šifro zbrisati tudi, če je pritisnjena nedovoljena kombinacija tipk:
Case “?”:
Gosub Beep_3
Gosub Brisi_sifru
End Select
Tipka = “_”
Return
Vse aktivnosti so pospremljene z ustreznimi zvočnimi signali (Beep in Beep_3). Na koncu podprograma bomo v spremenljivko Tipka vpisati vrednost “_”; kar je znak, da je tipka »od-delana«.
Med prikazom šifre na LCD-ju želimo, da se zadnja vpisana številka prikazuje samo eno sekundo, nato jo maskiramo z zvezdico. To dosežemo s pomočjo števca I3, v katerega je vpisana vrednost nič v trenutku, ko je vtipkan novi znak šifre. V vsakem prehodu skozi Do-Loop zanko se vrednost števca poveča za 1, vse dokler ne doseže vrednost 100:
Do
…
If I3 < 100 Then
Incr I3
Else
Gosub Ucini_sifru_nevidljivom
End If
Loop
Ena izvršitev glavne zanke traja okoli 10 ms, nato se bo proces štetja do 100 zaključil približno po eni sekundi. Takrat bomo prenehali šteti in zadnji vpisani znak bomo prekrili z zvezdico (I2 je indeks, ki kaže na položaj zadnjega vpisanega znaka):
Ucini_sifru_nevidljivom:
…
Mid(nevidljiva_sifra , I2 , 1) = “*”
Gosub Disp_sifre
Return
Tako med vnosom šifro skrivamo od vedoželjnih pogledov!
Poglejmo še, kako prepoznavamo prvo izvršitev programa. V ta namen smo v EEPROM-u definirali spremenljivko Sifra_0e.
Dim Sifra_0 As Byte
Dim Sifra_0e As Eram Byte
Če je v spremenljivko Sifra_0e vpisana vrednost 12, je to znak, da je program že naredil inicializacijo trezorja v eni od predhodnih izvršitev; iz EEPROM-a se bo prebrala vrednosti prej definiranih šifer za odpiranje in zapiranje obeh vrat in nadaljevalo se bo izvajanje programa:
Sifra_0 = Sifra_0e
If Sifra_0 = 12 Then
Sifra_1 = Sifra_1e ‚1. vrata
Sifra_2 = Sifra_2e ‚2. vrata
Pred prvim izvrševanjem programa je EEPROM mikrokontrolerja prazen (zbrisan), zato bo vsebina vseh njegovih lokacij znašala 255 (=&HFF). Zato začetna vrednost spremenljivke Sifra_0e ne bo 12; program bo resetiral šifre in naredil proceduro nastavljanja vrat:
Else
Home L
Gosub Reset_sifri
Gosub Ugadjanje_vrata
End If
Med resetom se bodo postavile začetne vrednosti šifer, “1234” in “5678” in se vpisale v EEPROM; skupaj z oznako Sifra_0e = 12, kot potrdilom, da je sef inicializiran.
Ostanek programa uporablja poznane tehnike programiranja, katerih ni nujno posebej analizirati. O krmiljenju z delom koračnih motorjev smo pisali večkrat, npr. v seriji opisov o Geekcreit kompletu (SE 325). Alfanumerični displej je vezan preko I2C modula, za kar potrebujemo knjižnico I2CLCD.sub. Ta knjižnica in program Sef_SE.bas se lahko brezplačno dobita od uredništva revije Svet elektronike iz SE326.
Spoštujemo vašo zasebnost in se zavezujemo, da bomo osebne podatke, pridobljene prek spletnega informacijskega sistema, skrbno varovali in jih brez vaše privolitve ne bomo posredoval tretji osebi oziroma jih uporabili v druge namene. Ker obstajajo v spletnem informacijskem sistemu določene povezave na druge, zunanje spletne strani, ki niso vezane na nas, ne prevzemamo nobene odgovornosti za zaščito podatkov na teh spletnih straneh.
Hkrati se zavezujemo, da bomo po svojih najboljših možnih močeh varovali podatke in zasebnost obiskovalcev spletne strani .
Da bi preprečili nepooblaščen dostop do pridobljenih podatkov ali njihovo razkritje, ohranili natančnost osebnih podatkov in zagotovili njihovo ustrezno uporabo, uporabljamo ustrezne tehnične in organizacijske postopke za zavarovanje podatkov, ki jih zbiramo.
Piškotki, ki so nujno potrebni za delovanje spletne strani
Nujno potrebne piškotke bomo na vašo napravo vedno nameščali, saj brez njih naša spletna stran ne deluje pravilno. Med nujno potrebne piškotke uvrščamo piškotke, ki vam omogočajo dostop do spletne strani, delovanje posameznih funkcionalnosti spletne strani in hkrati ne zbirajo analitičnih ali drugih podatkov o vašem obisku.
Ime piškotka
Trajanje
Opis
PHPSESSID
dokler ne zaprete brskalnika
Piškotek omogoča shranjevanje sej med posameznimi zahtevami znotraj sistema za upravljanje z vsebinami.
moove_gdpr_popup
1 leto
Shrani uporabnikove preference politike piškotkov
Če onemogočite ta piškotek, ne bomo mogli shraniti vaših nastavitev. To pomeni, da boste morali vsakič, ko obiščete to spletno mesto, ponovno omogočiti ali onemogočiti piškotke.
Piškotki tretjih oseb
Med piškotke tretjih oseb spadajo analitični in funkcijski piškotki, ki jih na vašo napravo nameščajo druga podjetja, kot so Facebook Inc. in Google Inc.. Ti piškotki vam omogočajo uporabo vtičnikov in funkcij na naši strani, ki so povezane z njihovimi družbenimi omrežji in drugimi platformami ter za sledenje vaši uporabi njihovih storitev.
Ime piškotka
Trajanje
Opis
_ga
2 leti
Google Analytics Zabeleži razlikovanje med uporabniki in sejami.
_gid
1 leto
Google Analytics Zabeleži novo sejo ali novega uporabnika.
_gat
10 min
Google Analytics piškotek se uporablja za omejevanje pogostosti zadetkov..
IDE
2 leti
Oglaševalski piškotek podjetja Google Inc. Ki nam omogoča prikazovanje oglasov.
Najprej omogočite strogo potrebne piškotke, da lahko shranimo vaše nastavitve!
Uporaba piškotkov na spletišču
Spletišče v brskalnik računalnika obiskovalca oziroma uporabnika odloži tako imenovani “piškotek”. Piškotki so tekstovne datoteke, ki se shranijo na uporabnikovem računalniku in omogočajo analize o uporabnikovem obisku, številu obiskov in kaj ga zanima v teh obiskih. V piškotku so osnovni podatki o uporabnikovem obisku določene spletne strani, npr. ime obiskovane spletne strani, ki jih opravi v spletišču. Vsebina piškotka se shrani v računalniku uporabnika v posebni mapi. Z dvakratnim klikom na datoteko dobimo podrobnejše informacije o obiskani spletni strani, datumu in uri obiska. Vsi ti podatki so shranjeni tudi pri upravljavcu spletne strani, ki jo uporabnik obiskuje.
Uporabnik lahko piškotke z določenimi nastavitvami briše, izključuje oziroma jih pogojno uporablja, a posledično uporabnik ne bo mogel uporabljati vseh funkcij spletišča v polni meri. V osnovi so brskalniki nastavljeni tako, da piškotke sprejemajo, zavračajo pa nastavljanje piškotkov, ki ne izvirajo iz področja, zapisanega v naslovni vrstici.