Doma narejena naprava proti kraji, ki uporablja Arduino Uno in senzor prstnih odtisov. Domača biometrična ključavnica na prstni odtis za garažna vrata Priključitev senzorja prstnih odtisov na računalnik

Ker nimam avta, mi ključev ni treba nositi povsod s seboj. Zaradi tega se je izkazalo, da sem se večkrat znašla brez ključev pred hišo in sem morala počakati, da je eden od sorodnikov prišel domov in me spustila noter, in v nekem trenutku sem se odločila, da moram glede tega nekaj narediti. in zasnoval doma narejeno garažno ključavnico.

V tem projektu vam bom pokazal, kako narediti ključavnico s prstnim odtisom za vaša vhodna vrata.

1. korak: Materiali


Tukaj je seznam potrebne materiale in orodja.

Elektronika:

  • Čitalnik prstnih odtisov (in priključek JST)
  • LCD komplet (z ATmega328)
  • ATtiny85
  • NPN tranzistor
  • Visokotonski zvočnik
  • Žica zvočnika
  • Ohišje (v 9. koraku bodo datoteke za 3D-tiskanje)
  • Bakreni film
  • Regulator napetosti 5V
  • 9V baterija
  • Konektor za 9V baterijo
  • SPDT stikalo

Za udobje bom priložil že pripravljen seznam želja na spletni strani Sparkfun.

Orodje:

  • Spajkalnik in spajka
  • Izolacijski trak
  • Žice in mostički
  • Klešče/strizalec
  • Prototipna plošča
  • Razni upori
  • Vijaki
  • Vrtalnik
  • Več LED za testiranje
  • FTDI 5V plošča
  • Pištola za vroče lepilo
  • Dostop do 3D tiskalnika
  • Izbirno: vtičnica IC (8-polna za ATtiny in 28-pinska za ATmega)
  • Izbirno: druga plošča Arduino/kondenzator 10uF (podrobnosti v 5. koraku)

2. korak: Diagram naprave






LCD komplet, kupljen pri Sparkfun, je bil opremljen z ATmega328, ki nadzoruje zaslon. ATmega328 je precej zmogljiv in se lahko uporablja ne samo za nadzor zaslona, ​​ampak tudi za druga opravila. Glede na to ga lahko uporabimo namesto Arduina za komunikacijo s čitalnikom prstnih odtisov in pošiljanje ukazov ATtiny85, nadzor zaslona in piska.

Da biometrična ključavnica na vratih ne bi delovala ves čas, sem vanjo vgradil stikalo, ki deluje v trenutku, ko je ohišje zaprto. Če je ohišje zaprto, se naprava ne napaja in varčujemo z viri baterije.

Pomembna opomba: čitalnik prstnih odtisov deluje pri 3,3 V, zato priporočam uporabo napetostnega delilnika, ki bo signale iz ATmega pretvoril v 3,2 V. Delilnik napetosti je sestavljen iz upora 560 ohmov med D10/sekundnim zatičem optičnega bralnika in upora 1K med GND/drugim zatičem optičnega bralnika.

LCD pinout:

  • D10 - pin skenerja 1 (črna žica)
  • D11 - pin 2 skener (prek napetostnega delilnika)
  • D12 - ATtiny85
  • D13 - Piščalka

pinout ATtiny85:

  • Pin 5 (0 v programski kodi) - vhod iz ATmega
  • Pin 3 (4 v programski kodi) - tranzistor / rumena LED
  • Pin 7 (2 v programski kodi) - indikacija LED

3. korak: Sestavljanje komponent iz kompleta LCD

Ime koraka govori samo zase: priročen vodnik za hitri začetek/sestavljanje

4. korak: Sestavljanje vezja na prototipno ploščo




Postavitev komponent na ploščo je odvisna od vas, samo poskusite spajkati žice tako, da so obrnjene v isto smer in se ne zlomijo.

Ko sem ploščo sestavil, sem zgornji in spodnji del plošče prekril z vročim lepilom - to je pritrdilo in izoliralo elemente vezja. Vroče lepilo ne bo poškodovalo čipa.

Kot pri glavni plošči, prispajkajte vse na ploščo ATtiny in nanesite vroče lepilo, da pritrdite in izolirate komponente. Regulator napetosti se lahko zelo segreje, zato je dobro, da se nanj ali na druge površine v njegovi bližini ne nanašate vročega lepila. Prav tako je najbolje, da plošče ATtiny ne prekrijete z vročim lepilom, saj jo boste morda želeli odstraniti in ponovno programirati.

5. korak: Programiranje ATmega328

Kot je omenjeno v 2. koraku, ima ATmega328 dovolj močan procesor in dovolj zatičev za pogon LCD-ja, medtem ko nadzoruje druge dodatne komponente. Da bi to dosegli, morate programirati čip.

Če imate Arduino Uno ali Duemilanove, lahko preprosto odstranite čip z njega in ga zamenjate s tistim, ki ste ga dobili s kompletom. Lahko pa najdete tudi ploščo FTDI Basic Breakout (5V) in spajkalne priključke ob njeni strani (glejte slike v 3. koraku)

Prav tako boste morali naložiti kodo v načinu »Duemilanove w/ ATmega328«.

Spodnja koda je delujoč program za preverjanje delovanja naprave.

#include "LiquidCrystal.h" LiquidCrystal lcd(2,3,4,5,6,7,8); void setup() ( pinMode(9, OUTPUT); // osvetlitev ozadja pinMode(13, OUTPUT); // piskač lcd.begin(16, 2); // 16 znakov širine, 2 visoka digitalWrite(9, HIGH) ; / /vklopi osvetlitev ozadja lcd.print(" Pozdravljeni, svet! "); //centriraj besedilo z uporabo presledkov delay(2000); .clear(); lcd.print("Zvok je vklopljen");

6. korak: Nastavitev bralnika prstnih odtisov

To knjižnico sem uporabil za komunikacijo s skenerjem. Neposredna povezava za prenos.

Če želite preveriti, ali vaša koda deluje, prenesite ta tester za utripanje.

Čitalnik prstnih odtisov ima lasten vgrajen pomnilnik za shranjevanje podatkov. Torej, ko ste prepričani, da optični bralnik deluje, prenesite ta program, da dodate svoj prstni odtis v bazo podatkov pod id #0. Odprite serijsko konzolo in preprosto sledite navodilom.

Program utripanja LED za testiranje optičnega bralnika

/* Ta preprosta koda bo vklopila in izklopila LED. Uporablja se za razumevanje, ali komunikacija deluje. */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Nastavitev strojne opreme - čitalnik prstnih odtisov povezan na: //digitalni pin 10(arduino rx, fps tx) //digitalni pin 11(arduino tx - 560ohm fps upor tx - upor 1000 ohmov - GND) //to zniža 5v tx na približno 3,2v in ne bomo prežgali našega skenerja FPS_GT511C3 fps(10, 11); void setup())( Serial.begin(9600); fps.UseSerialDebug = true; // lahko vidite sporočila na zaslonu za serijsko odpravljanje napak fps.Open(); ) void loop())( // Test utripanja LED za fps skener. // vklopi LED znotraj skenerja delay (1000); fps. SetLED (false); // izklopi LED znotraj skenerja delay (1000);

Program za zapisovanje podatkov v skener

#include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Nastavitev strojne opreme - čitalnik prstnih odtisov povezan na: //digitalni pin 10(arduino rx, fps tx) //digitalni pin 11(arduino tx - 560ohm upor fps tx - 1000 ohmski upor - GND) //to zniža 5v tx na približno 3,2v in ne bomo prežgali našega skenerja FPS_GT511C3 fps(10, 11); void setup())( Serial.begin(9600); delay(100); fps.Open(); fps.SetLED(true); Enroll(); ) void Enroll())( // Test registracije // iskanje open id int enrollid = 0; fps.EnrollStart(enrollid); // register Serial.print("Pritisnite prst za vpis #"); while(fps.IsPressFinger() == false) delay(100); .CaptureFinger(true); int iret = 0; if (bret != false) ( Serial.println("Odstrani prst"); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100) ; Serial.println("Pritisnite isti prst"); while(fps.IsPressFinger() == false) bret = fps.CaptureFinger(true); if (bret != false) ( Serial.println() "Odstrani prst" (fps.IsPressFinger() == delay(100) == false) delay(100); if (bret != false) ( Serial.println("Odstrani prst"); if (iret = = 0) ("Vpis je uspešen"); ) else ( Serial.print("Vpis ni uspel s kodo napake:"); Serial.println(iret); ) ) else Serial.println("Zajem tretjega prsta ni uspel"); ) else Serial.println("Ni uspelo zajeti drugega prsta"); ) else Serial.println("Ni uspelo zajeti prvega prsta"); ) void loop())( delay(100000); ) Datoteke

7. korak: Programirajte ATtiny85


ATtiny85 je nekaj podobnega poceni Arduinu, sestavljenemu v en čip. ATtiny85 je mogoče programirati z drugimi Arduini, vključno z ATmega328, ki ga najdete v našem kompletu LCD. V projektu se uporablja za izvajanje zelo preprostih ukazov: preverite signal iz ATmega in odprite vrata, če je signal pravilen.

Za programiranje povežite vse po priloženih fotografijah. Nato prenesite potrebne datoteke in sledite tem navodilom.

Po prenosu kode bi moral pin 13 na Arduinu (vgrajena LED) zasvetiti, kar pomeni, da je bila koda prenesena.

Končna koda:

//Prejme kratek signal od glavnega modula za zapiranje releja void setup())( pinMode(2,OUTPUT); //Indikacija LED preko 10K upora pinMode(4,OUTPUT); //tranzistorski pin, ki odpre garažo pinMode(0,INPUT); //vhodna zakasnitev(500); //dajte napravi čas za zagon digitalWrite(2,HIGH);/LED indikator void loop())(if(digitalRead(0))( / /preprost vzorec za preklop tranzistorske zakasnitve (125); if(digitalRead(0)==false)( delay(55); //počakajte, ker časovnik ATtiny ni idealen if(digitalRead(0))( delay(55) ); if(digitalRead(0)= =false)( delay(55); if(digitalRead(0))( delay(55); if(digitalRead(0)==false)( digitalWrite(4, HIGH); / / tranzistor "pritisne" gumb za zakasnitev (1000); digitalWrite (2, HIGH);

8. korak: Končna koda

Spodaj je program Arduino, ki sem ga napisal z uporabo knjižnic skenerja in zaslona. Da bi bilo jasno, kaj se dogaja v posameznem delu programa, sem poskušal vse komentirati na najboljši možni način. Po prenosu te kode bi moralo vse delovati in ostalo je le še integracija sistema v vrata.

Opozorilo: če knjižnica optičnega bralnika ne deluje, poskusite uporabiti starejšo različico Arduino IDE.

Koda za ATmega238:

#include "LiquidCrystal.h" //prikazna knjižnica #include "FPS_GT511C3.h" //fps (skener prstnih odtisov) knjižnica #include "SoftwareSerial.h" //uporablja ga knjižnica optičnega bralnika //Konfigurirajte zatiče zaslona in optičnega bralnika LiquidCrystal lcd( 2, 3, 4, 5, 6, 7, 8); //prikaži pinout FPS_GT511C3 fps(10, 11); //RX, TX boolean isFinger = false; //true, če knjižnica fps zazna prst na optičnem bralniku //izhodni zatiči const int buzzerPin = 13; const int backlightPin = 9; const int attinyPin = 12; const String idNames = ("jaz", "Bro", "Ryan", "Mama", "Oče", "Teta", "Babica", "Zeide", "Oseba", "oseba", "Palček"); void setup())( //nastavitev izhodov pinMode(buzzerPin, OUTPUT); pinMode(backlightPin, OUTPUT); pinMode(attinyPin, OUTPUT); //za odpravljanje napak //Serial.begin(9600); fps.UseSerialDebug = false; / postane resnično za razhroščevanje preko serijskih vrat //inicializacija knjižnic lcd.begin(16,2); //osvetlitev LCD zaslona //nalaganje zvok za (int i=0; i<30; i++){ tone(buzzerPin, 50+10*i, 30); delay(30); } tone(buzzerPin, 350); //вывод стартового сообщения lcd.print("Put your finger "); //команда вывода на экран lcd.setCursor(0, 1); //устанавливаем курсор на нулевую колонку первой строки lcd.print(" on the scanner "); delay(150); noTone(buzzerPin); //останавливаем стартовый звук } void loop(){ //сканируем и распознаём отпечаток, когда приложен палец waitForFinger(); lcd.clear(); //очищаем экран и устанавливаем курсов в положение 0,0 fps.CaptureFinger(false); //захватываем отпечаток для идентификации int id = fps.Identify1_N(); //идентифицируем отпечаток и сохраняем id if(id <= 10){ lcd.print(" Access granted "); //сообщение об успехе lcd.setCursor(0,1); //выводим на экран имя когда дверь открывается String message = " Hey " + idNames + "!"; lcd.print(message); tone(buzzerPin, 262, 1000); delay(1500); //отправляем сигнал для открытия двери digitalWrite(attinyPin, HIGH); //первый импульс синхронизирует задержку (10ms) delay(5); digitalWrite(attinyPin, LOW); delay(3); digitalWrite(attinyPin, HIGH); //следующие два - открывают дверь delay(15); digitalWrite(attinyPin, LOW); delay(5); digitalWrite(attinyPin, HIGH); delay(10); digitalWrite(attinyPin, LOW); delay(1000); lcd.clear(); lcd.print("Don"t forget to "); lcd.setCursor(0,1); lcd.print(" shut me off! "); delay(2000); waitForFinger(); //нажмите чтобы продолжить запись while(true){ //сохраняет новый отпечаток //выводит сообщение на экран lcd.clear(); lcd.print(centerText("So you want to")); lcd.setCursor(0,1); lcd.print(centerText("scan a new one?")); delay(2000); //Скопировано и слегка модифицировано из примера регистрации данных: int enrollid = 11; //выбираете какой id переписать\создать //отпустите палец, когда хотите записать id/имя, напечатанное на экране waitForFinger(); //ждёт, когда будет нажат fps while(enrollid==11){ for (int i = 1; i1){ lcd.print(i); enrollid = i-1; break; } } } //предупреждение, если в данном слоте уже есть данные if(fps.CheckEnrolled(enrollid)){ lcd.clear(); lcd.print(" Warning! ID #"); lcd.print(enrollid); lcd.setCursor(0,1); lcd.print(" has data. OK? "); delay(2500); waitForFinger(); //ждёт, когда будет нажат fps fps.DeleteID(enrollid); //удаляет данные delay(100); } //Enroll fps.EnrollStart(enrollid); lcd.clear(); lcd.print("Place finger to "); lcd.setCursor(0,1); lcd.print("enroll #"); lcd.print(enrollid); //выводит id, который был добавлен waitForFinger(); //ждёт, когда будет нажат fps //захватывает отпечаток и сохраняет его в память трижды для точности данных bool bret = fps.CaptureFinger(true); //картинка высокого качества для записи int iret = 0; //в случае ошибки if (bret != false){ //первая регистрация lcd.clear(); lcd.print(" Remove finger "); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100); //ждёт пока уберут палец lcd.clear(); lcd.print(" Press again "); waitForFinger(); //ждёт, когда будет нажат fps bret = fps.CaptureFinger(true); if (bret != false){ //вторая регистрация lcd.clear(); lcd.print(" Remove finger "); fps.Enroll2(); while(fps.IsPressFinger() == true) delay(100); lcd.clear(); lcd.print("Press yet again "); waitForFinger(); bret = fps.CaptureFinger(true); if (bret != false){ //третья регистрация iret = fps.Enroll3(); if (iret == 0){ //проверяет, были ли какие-нибудь ошибки lcd.clear(); lcd.print(" Success! "); delay(2000); beep(); //выключает Ардуино } else{ //запускает этот код в случае любой ошибки lcd.clear(); lcd.print("Fail. Try again "); delay(1000); } } lcd.clear(); lcd.print(" Failed 3rd "); //ошибка на третьей записи delay(1000); } lcd.clear(); lcd.print(" Failed 2nd "); //ошибка на второй записи delay(1000); } lcd.clear(); lcd.print(" Failed 1st "); //ошибка на первой записи delay(1000); } } else{ lcd.print("Fingerprint is"); //если отпечаток не распознан lcd.setCursor(0,1); lcd.print(" unverified "); delay(2000); lcd.clear(); lcd.print("Please try again"); lcd.setCursor(0,1); lcd.print("Use your pointer"); //pointer - указательный палец (можете использовать любой и заменить это слово) delay(500); } delay(250); } void beep(){ //издаёт звуки, чтобы кто-нибудь закрыл кейс lcd.clear(); lcd.print("Please close the"); lcd.setCursor(0,1); lcd.print(" case! "); for(int i=0;i=80 && !fps.IsPressFinger()){ beep(); } } timer = 0; //обнуляет таймер как только функция завершится } String centerText(String s) { //центрует текст на дисплее, чтобы он лучше смотрелся while(16-s.length()>1)( //če besedilo potrebuje centriranje s = " " + s + " "; // enakomerno doda presledke na obeh straneh ) return s; ) Datoteke


Za ustvarjanje takšnega projekta je moral avtor spremeniti zagonski sistem svojega vozila. Glavni priključek je IG vodnik od stikala za vžig, preko katerega se napajalna napetost dovaja do regulatorja napetosti, nato pa do Arduino da ga vklopite, kot tudi vklopite senzor za skeniranje prstov. Če je skeniranje prstov uspešno, sistem aktivira relejno enoto in nadzoruje rele zaganjalnika. Zdaj lahko začnete avtomobilski. Senzor deluje 10 sekund in ga je mogoče znova zagnati s ponavljanjem cikla zagona vžiga. Če v dodeljenem času senzor ne zazna prstnega odtisa ali se ne ujema z navedenim, bo sistem za zagon onemogočen in motor se ne bo zagnal.

Ker ima vsak avtomobil svoj sistem konfiguracije zagona, je treba pred spreminjanjem sistema za zagon motorja pogledati električni diagram.

Ta članek opisuje, kako priključiti napravo proti kraji na 2-vratni Mitsubishi Lancer 2000 coupe.

Materiali:
- Arduino Uno.
- Senzor prstnih odtisov.
- Napajanje.
- Relejna enota.
- NPN tranzistor BC547B
- Upor 1 kOhm










Shema povezave:
Vezje je nekoliko spremenjeno glede na uporabljene komponente. Ne pozabite, da velja samo za ta model avtomobila.

1. korak Priprava komponent programske opreme:
V Arduino IDE se knjižnica naloži in doda.
V Arduino se naloži datoteka iz knjižnice blank.ino, ki bo služila kot vmesnik med senzorjem in mikrokontrolerjem.
Program je nameščen in senzor je povezan z Arduino, kot je prikazano na diagramu. Po tem se prstni odtis naloži prek nameščenega programa.


Zdaj je senzor priključen, kot je prikazano na naslednji shemi. Po tem avtor nadaljuje s prenosom glavnega programa. LED z uporom je priključena na pin 12.

Program bo deloval predvsem na podlagi materiala za usposabljanje Adafruit Fingerprint. Edina stvar, ki je dodana programski kodi, je časovnik za izklop senzorja 10 sekund. Kodo lahko prenesete pod člankom.

3. korak sestavljanja:
1. del:

Najprej odvijte vijake pod armaturno ploščo. Spodnji del plošče se odstrani in senzor se lahko namesti v prosti prostor.



2. del:
Na izbranem mestu za senzor je izrezano območje za njegovo zanesljivo namestitev.





3. del:
Plošča Arduino je nameščena za senzorjem prstnih odtisov. Mesto namestitve Arduina smo rahlo zaostrili, da je lahko plošča zavzela pravilen položaj.



4. del:
Regulirani napajalnik je nameščen za armaturno ploščo na voznikovi strani.

5. del:
Preostale komponente opreme so povezane v skladu s shemo na začetku članka.







4. korak namestitev:
Priključite potrebne žice in napravo namestite pod armaturno ploščo. Avtor poskrbi, da ne pride do kratkega stika.

kaj potrebuješ

  1. Modul prstnih odtisov FPM10A
  2. RFID modul RC522
  3. Arduino mega (teoretično je mogoče uporabiti tudi druge plošče, vendar sem se odločil za to zaradi števila pinov)
  4. 1 licenca za 1C 8.2 (v mojem primeru debel odjemalec, za tankega ga odrežite sami)
  5. Komunikacija prek vrat Com z uporabo MsCommLib.MsComm (potrebujete licenco, lahko jo celo poguglate tukaj)
  6. Razvojno okolje za Arduino (rabljeno 1.8.5)
  7. Tablica z USB vmesnikom.
  8. Kabelski snop: upor 1 KiOhm, gumb za kratek stik, žice, "modri" električni trak, termorektalni analizator lezenja po želji (žice lahko zvijete, če imate blizu, neopisljive občutke, povezane s to napravo), USB kabel za Arduino, ravne roke in krive konvolucije povprečnega vzdevka 1s vklj. narediti telo za ves ta čudež.

Opombe: na fotografiji so barve žic drugačne - med namestitvijo je bilo več žic pretrganih, ker... Bile so popolnoma Huawei in sem moral vzeti druge razpoložljive barve.

Sistem sporočil se v kritičnih trenutkih namerno podvaja.
Takoj vas opozarjam, da lahko povprečnemu inženirju tečejo solze iz oči zaradi kolofonije, vendar je to moj prvi Arduino projekt, in to tako kompleksen, in zdi se, da deluje in deluje stabilno. Sprva je bila ideja, da bi vse naredil prek omrežja (wifi + žično), vendar sem se po oceni stroškov odpravljanja napak in ustvarjanja lastne http storitve ter implementacije vsega v 1C odločil za uporabo com; v vsakem primeru vsa logika se lahko prenese v zunanjo obdelavo brez spreminjanja konf.

Prav tako lahko vstavite sistem za fotografiranje prihajajočega zaposlenega preko spletne kamere tablice, dodate rele in krmiljenje elektronskih vrat, dokončate integracijo z ZUP preko zunanje obdelave, posredovane preko parametrov zagona in izničenje karnevala za posebej nevarne prehode tajnega pomena) .

Koristne kritike so dobrodošle.

Prolog

Ko sem videl cene obstoječih dostopnih sistemov in sistemov za merjenje časa, me je zelena esenca počasi začela dušiti. Po dolgotrajnem sprehajanju po Arduinu in njegovih modulih sem naletel na modul prstnih odtisov FPM10A. Ta modul, odvisno od različice, lahko shrani veliko število prstnih odtisov - od 50 do neskončno v svoj flash pomnilnik in se uporablja v večini modulov proizvajalcev biometričnega nadzora. Vendar je v mojem projektu zaradi knjižnice omejen na 254. Takoj vas opozarjam, da objavljam svojo izčrpno najdeno knjižnico za Arduino, ker ... Dolgo sem se mučil z iskanjem in izgubil 3 dni z iskanjem in odpravljanjem napak v knjižnici za ta modul.

Opis modulov

Knjižnica, uporabljena v projektu, omogoča uporabo do 256 (bajtnih) prstnih odtisov. Ta znesek je bil zame pretiran, v skrajnem primeru lahko porabite 1 modul na vsakih 256 zaposlenih.
Število oznak RFID je omejeno samo z edinstvenostjo njihovega UID. bazo lahko shranimo v 1C in jo povežemo z zaposlenimi. Uporabite lahko vse združljive oznake. Teoretično so lahko primerni kateri koli ključi za domofone, metro kartice in kartice trojke.
Povezava z 1c poteka preko com porta prek knjižnice MsCommLib.MsComm, lahko pa jo prepišemo na katero koli drugo. Gonilnike za com vrata za Arduino je treba namestiti skupaj z razvojnim okoljem Arduino, lahko pa jih tudi poiščete v Googlu.
Vse spajkano je skrito v škatli in komunicirano preko omrežja (uporabil sem WiFi, lahko pa tudi z zunanjo USB omrežno kartico).

Delovni algoritem

Strojna oprema:

  1. Spajkamo/zvijamo module Arduino
  2. Povezamo se z osebnim programatorjem in naložimo strojno programsko opremo v Ardo, zaženemo test, preverimo, ali ukazi delujejo
  3. Povezujejo se prek USB-ja na tablico z operacijskim sistemom Windows 10. Na tablici jo zamenjamo bodisi s samodejnim nalaganjem:

A) prek datoteke telesa:

    zagon - izvedba: shell:startup

    tam ustvarite datoteko z Beležnico z imenom hz.bat in vsebino (prepričan sem, da lahko sami uredite parametre baze podatkov datotek - imam sql): “C:\Program Files\1cv8\ ... \bin\1cv8 .exe” ENTERPRISE / SServerName:Port\DBName" /NUser /PPassword

B) naredimo naprednejšega z zamenjavo lupine s skriptom VB (ne pozabite ustvariti drugega uporabnika poleg privzetega brez zagona lupine):

    z uporabo Beležnice ustvarite datoteko z imenom C:\hz\hz.vbs in vsebino

set oShell=createobject("wscript.shell")
sCmd="""C:\Programske datoteke\1cv8\ ... \bin\1cv8.exe"" ENTERPRISE /SServerName:Port\DBName" /NUser /PPassword"
oShell.run sCmd,true
sCmd="izklop /r /t 0"
oShell.run sCmd

    zagon - izvedba: regedit, sledi veji: Current User\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

    dodajte parameter niza "Shell" (REG_SZ)

    uredite: "wscript C:\hz\hz.vbs" (brez narekovajev v parametru)

    znova zaženite in preizkusite. 1c bi se moral začeti brez explorere

  1. Nato preverimo, ali deluje, in ga zapakiramo v škatlo.

Programsko:

  1. V normalnem stanju Arduino poizveduje o skenerju prstnih odtisov, skenerju RFID, skrbniškem gumbu in pošilja ukaze čakanja prek vrat com.
  2. Takoj, ko se prst pojavi v vidnem polju bralnika, pošljemo ukaz v com port in 1c prek branja spremenljivk vidi ID prsta ali UID oznake.
  3. Gumb je potreben za upravljanje prstnih odtisov. Ko ga pritisnete, 1c zahteva geslo za prijavo in lahko nato prek sistema za sporočanje zaposlenemu dodeli ID optičnega bralnika ali UID kartice.

Za komunikacijo z 1c se uporabljajo naslednje vrstice (izvedel sem obdelavo za svojo conf in svoj časovni list, to je v projektu samo za primer, vendar je vključeno v izvorno kodo):

Povezava na com port

Procedure StartSystem() ComPort = New COMObject("MsCommLib.MsComm"); Poskusite ComPort.CommPort = 3; ComPort.Settings = "9600,N,8,1"; ComPort.Handshaking = 0; ComPort.InBufferCount = 0; ComPort.InBufferSize = 70; ComPort.InputLen = 0; ComPort.InputMode = 1; ComPort.NullDiscard = 0; ComPort.PortOpen = True; Opozorilo o izjemi ("Vrata ni mogoče odpreti!"); ThisForm.Close(); EndAttempt; hSeconds = 0; ConnectWaitHandler("OutputSportData", 1, False); // Povežite upravljalnik za nadzor vrat Konec postopka

Prekinitev povezave z vrati com

Procedure EndSystem() DisableWaitHandler("OutputSportData"); ComPort.PortOpen = False; ComPort = ""; Konec postopka

Branje podatkov iz vrat com

Procedure OutputSportData() ExportSportData = ""; If ComPort.PortOpen Then //ComPort.Output = "1"; SportsData = ComPort.Input; ProcessEncryptedString(SportData); Če je skrajšano (pre-zaposleni)<>"" Potem je hSeconds = hSeconds + 1; endIf; Če je hSeconds > 60, je PreEmployee = 0; hSeconds = 0; endIf; V nasprotnem primeru Opozorilo ("Vrata se ne odprejo"); ThisForm.Close(); endIf; End of Procedure Procedure Encrypted String (Sport Data) Array = Sports Data Unload(); IndexMin = SportsData.GetLowerBound(0); IndexMax = SportsData.GetUpperBound(0); StringInfo = ""; Za Index = IndexMin By IndexMax - 1 cikel SymbolReceived = AbbrLP(Array.Get(Index)); If CharacterReceived = "13" Then If Not Suspend Then RowInfo = RowProcessing(RowInfo); //Tukaj obdelava sporočila EndIf; Else LineInfo = LineInfo + Symbol(Number(SymbolReceived)); endIf; EndCycle; Konec postopka

Pošiljanje informacij v vrata com

Postopek SendToPort(Send) If ComPort.PortOpen Then ComPort.Output = AbbrLP(Send); Else Notify("Port se ne odpre", MessageStatus.VeryImportant); endIf; Konec postopka

Projektna koda za Arduino Mega

#vključi // povežite knjižnico za delo z modulom prstnih odtisov #include // povežite knjižnico za delo s programsko opremo UART #include #vključi const int buttonPin = 2; // vnos številke, povezane z gumbom za vstop v način programiranja int buttonState = 0; // spremenljivka za shranjevanje stanja gumba int modeState = 0; // spremenljivka za shranjevanje stanja naprave. 0 - čakanje na čitalnik prstnih odtisov. 1 - programiranje uint8_t id; // identifikacijska številka, pod katero bo shranjena predloga prstnega odtisa String frcUID = ""; // identifikacijska številka čitalnika rfid int rfidYes = 0; // uspešen vnos RFID SoftwareSerial mySerial(10, 11); // deklariraj objekt mySerial za delo s knjižnico SoftwareSerial OBJECT_NAME(RX, TX); // Določite lahko katere koli zatiče, ki podpirajo prekinitev PCINTx Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // deklariraj prstni objekt za delo s knjižnico Adafruit_Fingerprint OBJECT_NAME = Adafruit_Fingerprint(PARAMETER); // PARAMETER - povezava do objekta za delo z UART, na katerega je povezan modul, na primer: &Serial1 MFRC522 mfrc522(53, 5); // Ustvari primerek MFRC522 void setup() ( pinMode(buttonPin, INPUT); // inicializiraj pin, povezan z gumbom, kot vhod Serial.begin(9600); // Inicializiraj UART strojne opreme pri hitrosti 9600 medtem (!Serial); / / Čakanje na zakasnitev inicializacije strojne opreme (500); // Zagon SPI vodila mfrc522.PCD_Init(); // Prikaži podrobnosti o zakasnitvi čitalnika kartic MFRC522 (500); / Čakanje na inicializacijo modula prstnih odtisov Serial.println(". . . Scan sensor . . ."); // Prikaz sporočila "Iskanje senzorja" finger.begin (57600); (privzeta hitrost modula) Serial.println(finger.verifyPassword()); if (finger.verifyPassword()) ( Serial.println(". . . Najden senzor! . . "); // Če je zaznan modul prstnih odtisov , natisni sporočilo "senzor najden" ) else ( Serial.println(". . . Senzor ni bil najden . . ."); // Če modul za prstne odtise ni najden, prikaži sporočilo "senzor ni najden" in vnesi neskončno zanka: medtem (1); medtem ko (1); ) Serial.println(". . . Prosimo, položite prst na skener ali rfid . . .."); ) void loop() ( //Delo z gumbom! buttonState = digitalRead(buttonPin); // branje vrednosti iz vnosa gumba if (buttonState == HIGH) ( modeState = 1; // vstop v programski način NEXT ) stikalo (modeState) ( case 0: frcUID = ""; //Delo v načinu anketiranja prstnih odtisov in rfid if (finger.getImage() == FINGERPRINT_OK) ( // Zajemi sliko, če je rezultat izvedbe enak konstanti FINGERPRINT_OK ( pravilno nalaganje slike), nato gremo naprej if (finger.image2Tz() == FINGERPRINT_OK) ( // Pretvori nastalo sliko, če je rezultat izvedbe enak konstanti FINGERPRINT_OK (slika je pretvorjena), nato pa naprej if (finger.fingerFastSearch() == FINGERPRINT_OK) ( // Najdi ujemanje v zbirki prstnih odtisov, če je rezultat izvedbe enak konstanti FINGERPRINT_OK (ujemanje je bilo najdeno), potem gremo naprej frcUID = ". . . Najden ID=" + String(finger.fingerID) + ", confidence=" + String(finger.confidence) + "! . . "; Serial.println(frcUID); ) ) ) if (mfrc522.PICC_IsNewCardPresent()) ( delay(100); if (mfrc522.PICC_ReadCardSerial()) ( //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); frcUID = ""; za (bajt i = 0; i< mfrc522.uid.size; i++) { frcUID = frcUID + (mfrc522.uid.uidByte[i]); } frcUID = ". . . Found RFID UID=" + frcUID + "@ . . ."; Serial.println(frcUID); } } delay(100); // Задержка перед следующим сканированием 0,5 сек (нет смысла запускать на полной скорости) Serial.println(". . . Please put your finger on the scanner or rfid . . ."); break; case 1: Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования id = readnumber(); // Ожидание получения цифры, введённой с COM-порта if (id >= 255) ( // Če je 255 (največji ID), potem znova vstopite v stanje pripravljenosti modeState = 0; ) else ( if (id< 254) { // Если 254 то rfid иначе палец 0-253 modeState = 2; // Пытаемся отсканировать палец } else { modeState = 3; // Пытаемся отсканировать rfid uid } } break; case 2: while (!getFingerprintEnroll()); // Пытаемся получить ответ об присваивании ID modeState = 1; break; case 3: rfidYes = 0; Serial.println(". . . Put RFID in Scanner! . . ."); delay(400); Serial.println(". . . Put RFID in Scanner! . . ."); delay(400); Serial.println(". . . Put RFID in Scanner! . . ."); delay(5000); if (mfrc522.PICC_IsNewCardPresent()) { // Пытаемся отсканировать rfid uid delay(100); if (mfrc522.PICC_ReadCardSerial()) { //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); frcUID = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { frcUID = frcUID + (mfrc522.uid.uidByte[i]); } frcUID = ". . . New RFID UID=" + frcUID + "@ . . ."; rfidYes = 1; Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); } } if (rfidYes == 0) { Serial.println(". . . RFID error! . . ."); delay(400); } modeState = 1; break; } } // функция возвращает номер, введённый с COM-порта uint8_t readnumber(void) { int num = -1; // Переменная с номером, который требуется вернуть while (num < 0) { // Вход в цикл, пока переменная num не станет >= 0 medtem ko (!Serial.available()); // Počakajte, da se podatki prikažejo v medpomnilniku vrat COM, medtem ko (Serial.available()) ( // Zanka, dokler v medpomnilniku vrat COM ne zmanjka podatkov char c = Serial.read(); // Dodelite naslednji znak iz vrat COM v spremenljivko c if (isdigit(c)) ( // Če je vrednost spremenljivke c cifra, potem ... if (num< 0) { num = 0; // Увеличиваем значение num на один порядок } else { num *= 10; } num += c - "0"; // Прибавляем к значению num цифру из переменной c } delay(5); // Задержка на 5мс, чтоб в буфер COM-порта успели догрузиться следующие символы (если таковые имеются) } } return num; // Возвращение введённого числа } uint8_t getFingerprintEnroll() { int p; // Переменная для получения результатов выполнения функций //Загрузка первого изображения отпечатка пальца p = -1; Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" while (p != FINGERPRINT_OK) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_OK (корректная загрузка изображения) p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println(" Ok!"); break; // Изображение отпечатка пальца корректно загрузилось case FINGERPRINT_NOFINGER: Serial.println(". . . Please put your new finger on the scanner . . ."); break;// Сканер не обнаружил отпечаток пальца case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); break; // Ошибка соединения case FINGERPRINT_IMAGEFAIL: Serial.println(". . . Imaging error Please try again . . ."); break; // Ошибка изображения default: Serial.println(". . . Unknown error Please try again . . ."); break; // Неизвестная ошибка } } //Конвертирование изображения первого отпечатка пальца p = finger.image2Tz(1); Serial.print (". . . Image converting . . ."); // Конвертируем первое изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println("Ok!"); break; // Изображение сконвертировано case FINGERPRINT_IMAGEMESS: Serial.println(". . . Image too messy . . ."); return p; // Изображение слишком нечеткое case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); return p; // Ошибка соединения case FINGERPRINT_FEATUREFAIL: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка конвертирования case FINGERPRINT_INVALIDIMAGE: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); return p; // Неизвестная ошибка } //Просим убрать палец от сканера p = 0; while (p != FINGERPRINT_NOFINGER) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_NOFINGER (сканер не обнаружил отпечаток пальца) Serial.println(". . . Please remove your finger from the scanner . . ."); // Вывод сообщения "Пожалуйста уберите Ваш палец со сканера" delay(400); p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p } Serial.println(" Ok!"); //Загрузка второго изображения отпечатка пальца p = -1; Serial.println(". . . Place same finger again . . ."); // Вывод сообщения "Пожалуйста положите тот же палец еще раз" delay(400); while (p != FINGERPRINT_OK) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_OK (корректная загрузка изображения) p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println(" Ok!"); break; // Изображение отпечатка пальца корректно загрузилось case FINGERPRINT_NOFINGER: Serial.println(". . . Place same finger again . . ."); break; // Сканер не обнаружил отпечаток пальца case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); break; // Ошибка соединения case FINGERPRINT_IMAGEFAIL: Serial.println(". . . Imaging error . . ."); break; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); break; // Неизвестная ошибка } } //Конвертирование изображения второго отпечатка пальца p = finger.image2Tz(2); Serial.print (". . . Image 2 converting . . ."); // Конвертируем второе изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println("Ok!"); break; // Изображение сконвертировано case FINGERPRINT_IMAGEMESS: Serial.println(". . . Image too messy . . ."); return p; // Изображение слишком нечеткое case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); return p; // Ошибка соединения case FINGERPRINT_FEATUREFAIL: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка конвертирования case FINGERPRINT_INVALIDIMAGE: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); return p; // Неизвестная ошибка } //Создание модели (шаблона) отпечатка пальца, по двум изображениям p = finger.createModel(); Serial.print (". . . Creating model . . ."); // Создание модели (шаблона) отпечатка пальца, по двум изображениям if (p == FINGERPRINT_OK) { Serial.println(". . . Model create! Ok! . . ."); } else // Модель (шаблон) отпечатка пальца создана if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(". . . Communication error . . ."); return p; } else // Ошибка соединения if (p == FINGERPRINT_ENROLLMISMATCH) { Serial.println(". . . Fingerprints did not match . . ."); return p; } else // Отпечатки пальцев не совпадают { Serial.println(". . . Unknown error . . ."); // Неизвестная ошибка return p; } //Сохранение, ранее созданной, модели (шаблона) отпечатка пальца, под определённым ранее, идентификационным номером p = finger.storeModel(id); //Serial.println(". . . Saving model . . ."); Serial.println(". . . Saving model . . ."); //Serial.println(". . . Saving model in ID="); Serial.print(id); Serial.print(": "); // Сохранение модели (шаблона) отпечатка пальца, по двум изображениям if (p == FINGERPRINT_OK) { frcUID = ". . . Model save in ID=" + String(id) + "! . . ."; Serial.println(frcUID); delay(1500); Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); } else // Модель (шаблон) отпечатка пальца сохранена if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(". . . Communication error . . ."); return p; } else // Ошибка соединения if (p == FINGERPRINT_BADLOCATION) { Serial.println(". . . Could not store in that location . . ."); return p; } else // Не удалось сохранить в этом месте if (p == FINGERPRINT_FLASHERR) { Serial.println(". . . Error writing to flash . . ."); return p; } else // Ошибка записи в flash память { Serial.println(". . . Unknown error . . ."); // Неизвестная ошибка return p; } }

Epilog

Cena tablice je približno 10.000 rubljev. (pravzaprav se da od 7000 nove kupiti z 1 Gb RAM-a, ampak s 4Gb 1c bo bolj prijeten za selitev, dejansko sem kupil rabljenega za 6000 v brezhibnem stanju z 1Gb pa cincal z optimizacijo).

Prehod je bil narejen za proizvodnjo pohištva, zato sem tam izdelal karoserijo. Mislim, da lahko v trgovini razrežete "mešanico žagovine in kartona" za 1000 rubljev. in privijte skupaj s samoreznimi vijaki/zlepite s superlepilom. V skrajnem primeru lahko vzamete že pripravljeno škatlo (na primer električno omarico) in tam izrežete okno.

Moduli Arduino in tako naprej: približno 2000 rubljev.

Užitek v razmišljanju in izdelavi je neprecenljiv!

Za vzpostavitev povezave s senzorjem prstnih odtisov so bila uporabljena navodila Josha Hawleyja (neposredni prenos navodil).

Za odpravljanje napak pri delovanju optičnega bralnika prstnih odtisov s prikazom črk je potrebna sinhronizacija.

Senzor prstnih odtisov ima lasten pomnilnik za shranjevanje skeniranih slik. Torej, potem ko senzor začne delovati, prenesite to tako, da ga dodate v podatkovno bazo prstnih odtisov na naslov 0. Odprite upravljalno konzolo v vašem računalniku in sledite pojavnim pozivom.

Kode – Primer utripanja:

/* Primer knjižnice za nadzor skenerja prstnih odtisov GT-511C3 (FPS) */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Nastavitev strojne opreme - FPS povezan z: //digitalnim zatičem 10(arduino rx, fps tx) //digitalni pin 11(arduino tx - 560ohm upor fps tx - 1000ohm upor - ozemljitev) //to zniža 5v tx linijo na približno 3,2v, tako da ne pokvarimo naših fps FPS_GT511C3 fps(10, 11); void setup())( Serial.begin(9600); fps.UseSerialDebug = true; // tako da lahko vidite sporočila na zaslonu za serijsko odpravljanje napak fps.Open(); ) void loop())( // FPS Blink LED Test fps .SetLED(true); // vklopi LED znotraj fps delay(1000); fps.SetLED(false); // izklopi LED znotraj fps delay(1000);

Kode – primer vpisa:

/* FPS_Enroll.ino - Primer knjižnice za krmiljenje skenerja prstnih odtisov GT-511C3 (FPS) */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Nastavitev strojne opreme - FPS povezan z: //digitalnim zatičem 10 (arduino rx, fps tx) //digitalni pin 11(arduino tx - 560ohm upor fps tx - 1000ohm upor - ozemljitev) //to zniža 5v tx linijo na približno 3,2v, tako da ne pokvarimo naših fps FPS_GT511C3 fps(10, enajst); void setup())( Serial.begin(9600); delay(100); fps.Open(); fps.SetLED(true); Enroll(); ) void Enroll())( // Preizkus prijave // ​​najdi odprto enroll id int enrollid = 0; fps.EnrollStart(enrollid); // enroll Serial.print("Pritisnite prst za vpis #"); .CaptureFinger(true); int iret = 0; if (bret != false) ( Serial.println("Odstrani prst"); fps.Enroll1(); while(fps.IsPressFinger() == true ) delay(100) ; Serial.println("Pritisnite isti prst"); (fps.IsPressFinger() == false) (Serial.println("Odstrani prst"); while(fps. IsPressFinger() == true) delay(100); Serial.println("Še enkrat pritisnite isti prst"); while(fps. IsPressFinger() == false) delay(100); if (bret != false) ( Serial.println("Odstrani prst"); iret = fps.Enroll3(); if (iret == 0) ( Serial.println("Vpis uspešen"); ) else ( Serial.print("Vpis ni uspel s kodo napake:"); Serial.println(iret); ) ) else Serial.println("Zajem tretjega prsta ni uspel"); ) else Serial.println("Ni uspelo zajeti drugega prsta"); ) else Serial.println("Ni uspelo zajeti prvega prsta"); ) void loop())( delay(100000); )

Sinhronizacija datoteke:

Registracijska datoteka skice:

Faza 7: Programiranje procesorja ATtiny85

Mikročip ATtiny85 je poceni in popolnoma združljiv s ploščo Arduino, zato je verjetno najboljši električni del, ki je bil kdaj ustvarjen!

Programator Arduino je potreben tudi za osvežitev čipa ATmega328, ki nadzoruje delovanje LCD zaslona.

V sestavljeni napravi bo procesor ATtiny izvajal zelo preproste ukaze: preveri signal iz ATmege in odpri vrata garaže, ko bo signal potrjen.

Če želite programirati procesor, ga morate s programirno ploščo povezati s programatorjem skupaj s kondenzatorjem 10 uF, kot je prikazano na spodnji sliki.

In nato prenesite končna koda in upoštevajte priporočila navodila podjetja High-Low Tech.

Nato je treba izhod 13 na plošči Arduino, povezan z LED, preklopiti v stanje VISOKO, da se delovanje spremlja s svetlobno indikacijo.

Končna koda za ATtiny :

//fpsAttiny by Nodcah //Sprejme kratek signal od glavnega modula za zapiranje releja void setup())( pinMode(2,OUTPUT); //indikator, ki vodi skozi 10K upor pinMode(4,OUTPUT); //trazistorski pin ki odpre garažni pinMode(0,INPUT); //vhodna zakasnitev(500); //daj stvari za zagon digitalWrite(2,HIGH); //indikatorska zanka void())(if(digitalRead(0)) ) ( //preprost vzorec za sprožitev zakasnitve tranzistorja (125); if(digitalRead(0)==false)( delay(55); //časi so izklopljeni, ker časovnik ATtiny ni popoln if(digitalRead ( 0))( delay(55); if(digitalRead(0)==false)( delay(55); if(digitalRead(0))( delay(55); if(digitalRead(0)==false)( digitalWrite (4, HIGH); //tranzistor "pritisne" gumb za zakasnitev (1000); digitalWrite (2, HIGH) )

Biometrična ključavnica - končna koda, izrez pokrova, priprava garaže GPS ura na Arduinu Biometrična ključavnica - diagram LCD zaslona in montaža



Morda vas bo zanimalo tudi:

Kako poklicati angela ljubezni Kako poklicati svetnike na pomoč
Kako poklicati angela varuha in ga prositi za pomoč in zaščito? Veliko ljudi zanima...
Prehrana amfipodov Raki amfipodov
Taksonski rang. Eden od cvetočih redov višjih rakov (Malacostraca). Na svetu...
Koncept
Moskovski umetnostno-industrijski inštitut Fakulteta: Okoljsko oblikovanje R E F E R A T...
Oboževalci so razkrili zaplet nove
"Ray, ti si moj oče" in druga včasih čudna ugibanja oboževalcev Vojne zvezd. V...
Posodobljen obračun DDV
Postopek predložitve posodobljenega obračuna DDV je določen v členu 81 Davčnega zakonika Ruske federacije. In njegova oblika in ...