0,00 €

V košarici ni izdelkov.

0,00 €

V košarici ni izdelkov.

More
    DomovRevijaProgramiranjePametni sef (3) – navodila za uporabo in programski primeri

    Pametni sef (3) – navodila za uporabo in programski primeri

    Avtor: mag. Vladimir Mitrović
    E-pošta: vmitrovic12@gmail.com
    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.