DIY Fingerprint Scanning Garage dörröppnare (8 / 12 steg)
Steg 8: Den Final koden
Nedan är en Arduino program jag har skrivit för projektet med hjälp av FPS och LCD-biblioteken. Jag har gjort mitt bästa att skriva kommentarer i kod för att beskriva vad varje del gör, men om du har några frågor, inte tveka att fråga mig!
Efter denna kod laddas upp, ska allt fungera. Nu allt som behöver göras för att integrera det!
Kod:
Kod för ATmega238:
/**
* FPSGarageDoorOpenner av Nodcah
* Öppnar en garageport om scannade fingeravtrycket är i
* den FPS' databas av utskrifter.
*
* FPS_GT511C3 bibliotek skapad av Josh Hawley, juli 23 2013
* Licensierad för icke-kommersiellt bruk, måste inkludera denna licens meddelande
* i princip, Känn dig fri att hacka bort på det, men bara ge mig kredit för mitt arbete =)
* TLDR; Wil Wheatons lag
*
* Version 1.00: Första utgåva
* Version 1.01: Fast bugg med openning garageporten på boot och Attiny timing
* Version 1,02:
+ Gjort överföring mellan ATtiny och ATmega timing mer tillförlitlig (linje 115)
+ Namn är nu associerad med ID
*/
#include "LiquidCrystal.h" //for skärmen
#include "FPS_GT511C3.h" //the fps (fingeravtryck avsökare) bibliotek
#include "SoftwareSerial.h" //used av fps bibliotek
Ställa in stiften för LCD och fps
LiquidCrystal lcd (2, 3, 4, 5, 6, 7, 8); Stifttilldelningar för LCD
FPS_GT511C3 fps (10, 11); RX, TX
booleska isFinger = false; sant om fps upptäcker ett finger på skannern
utgångsstift
CONST int buzzerPin = 13.
CONST int backlightPin = 9;
CONST int attinyPin = 12;
const String idNames [] =
{
"jaget", "Bro", "Ryan", "Mamma", "Pappa", "Tant", "Farmor", "Zeide", "Person", "person", "Tummen"};
void setup() {
Ställ in utgångar
pinMode (buzzerPin, produktionen);
pinMode (backlightPin, produktionen);
pinMode (attinyPin, produktionen);
för felsökning
Serial.BEGIN(9600);
FPS. UseSerialDebug = false; värdet true för fps felsökning via seriell
initierar bibliotek
LCD.BEGIN(16,2);
digitalWrite (backlightPin, hög); LCD-bakgrundsbelysning
FPS. Open();
FPS. SetLED(true); fps LED
starta upp ljud
för (int jag = 0; jag < 30; i ++) {
tonen (buzzerPin, 50 + 10 * i, 30);
Delay(30);
}
tonen (buzzerPin, 350);
skriva ut start meddelande
LCD.Print ("sätta fingret"); kommandot för att skriva ut på LCD-skärmen
lcd.setCursor (0, 1); ställer markören till kolumnen 0. 1: a raden
LCD.Print ("på skannern");
Delay(150);
noTone(buzzerPin); stoppar startljudet
}
void loop() {
Skanna och identifiera finger när man sätts på det
waitForFinger();
LCD.Clear(); rensar skärmen och ställer markören till 0,0
FPS. CaptureFinger(false); fångar finger för identifiering
int id = fps. Identify1_N(); identifierar print och lagrar id
om (id < = 10) {
LCD.Print ("tillgång beviljas"); meddelande
lcd.setCursor(0,1);
skriver ut namnet när garaget öppnar
Sträng meddelande = "Hej" + idNames [id] + "!";
LCD.Print(Message);
tonen (buzzerPin, 262, 1000);
Delay(1500);
en signal att öppna garageporten
digitalWrite (attinyPin, hög); första puls synkroniserar förseningar (10 MS)
Delay(5);
digitalWrite (attinyPin, låg);
Delay(3);
digitalWrite (attinyPin, hög); två öppna garaget
Delay(15);
digitalWrite (attinyPin, låg);
Delay(5);
digitalWrite (attinyPin, hög);
Delay(10);
digitalWrite (attinyPin, låg);
Delay(1000);
LCD.Clear();
LCD.Print ("Glöm inte att");
lcd.setCursor(0,1);
LCD.Print stänga ("mig!");
Delay(2000);
waitForFinger(); Tryck på för att fortsätta att registrera
While(true) {//save ett nytt fingeravtryck
skriver ut meddelande till lcd
LCD.Clear();
LCD.Print (centerText ("så du vill"));
lcd.setCursor(0,1);
LCD.Print (centerText ("Skanna ett nytt?"));
Delay(2000);
Kopieras och något modifierad från registrera exemplet:
int enrollid = 11;
att välja vilken id för att skriva över/skapa
släpp ditt finger när du vill skriva till id/namn tryckt på skärmen
waitForFinger(); väntar på fps ska pressas
While(enrollid==11) {
för (int jag = 1; jag < = 10; i ++) {
om ((fps. IsPressFinger() == true)) {
LCD.Clear();
String str = "ID" + String(i) + ":" + idNames [i]; concats en sträng w/id
LCD.Print(centerText(Str));
Delay(1000);
}
annat if(i>1) {
LCD.Print(i);
enrollid = i-1;
bryta;
}
}
}
varning om det finns redan data i denna slot med id
IF(fps. CheckEnrolled(enrollid)) {
LCD.Clear();
LCD.Print ("varning! ID #");
LCD.Print(enrollid);
lcd.setCursor(0,1);
LCD.Print ("har data. Okej? ");
Delay(2500);
waitForFinger(); väntar på fps ska pressas
FPS. DeleteID(enrollid); ta bort data
Delay(100);
}
Registrera
FPS. EnrollStart(enrollid);
LCD.Clear();
LCD.Print ("förlägger finger till");
lcd.setCursor(0,1);
LCD.Print ("registrera #");
LCD.Print(enrollid); utskrifter-id som är att vara inskrivna
waitForFinger(); väntar på fps ska pressas
fångar upp fingret och sparar i minnet tre gånger för korrekta uppgifter
bool bret = fps. CaptureFinger(true); hög kvalitet pic för registrering
int iret = 0; fel saker
om (bret! = false) {//first registrera
LCD.Clear();
LCD.Print ("ta bort finger");
FPS. Enroll1();
While(fps. IsPressFinger() == true) delay(100); väntar tills inget finger
LCD.Clear();
LCD.Print ("tryck igen");
waitForFinger(); väntar på fps ska pressas
Bret = fps. CaptureFinger(true);
om (bret! = false) {//second registrera
LCD.Clear();
LCD.Print ("ta bort finger");
FPS. Enroll2();
While(fps. IsPressFinger() == true) delay(100);
LCD.Clear();
LCD.Print ("Tryck återigen");
waitForFinger();
Bret = fps. CaptureFinger(true);
om (bret! = false) {//third registrera
IRET = fps. Enroll3();
om (iret == 0) {//checks att se om det finns några fel
LCD.Clear();
LCD.Print ("succé!");
Delay(2000);
beep(); stänger arduino
}
annat {//if registreringen misslyckas på något sätt
LCD.Clear();
LCD.Print ("misslyckas. Försök igen ");
Delay(1000);
}
}
LCD.Clear();
LCD.Print ("misslyckades 3."); fel på 3.
Delay(1000);
}
LCD.Clear();
LCD.Print ("misslyckades 2."); fel på 2.
Delay(1000);
}
LCD.Clear();
LCD.Print ("misslyckades 1."); fel på 1.
Delay(1000);
}
}
annat {
LCD.Print ("Fingerprint är"); om print inte är igen
lcd.setCursor(0,1);
LCD.Print ("Verifierad");
Delay(2000);
LCD.Clear();
LCD.Print ("försök igen");
lcd.setCursor(0,1);
LCD.Print ("användning pekaren"). Jag scannade allas pekaren finger
Delay(500);
}
Delay(250);
}
void beep() {
PIP i hopp om att någon stänga fallet
LCD.Clear();
LCD.Print ("Stäng av");
lcd.setCursor(0,1);
LCD.Print ("fall!");
för (int jag = 0; jag < 8; i ++) {
tonen (buzzerPin, 262, 500);
Delay(1000);
}
Delay(5000); vänta på att någon att avsluta ärendet
om ingen gör det, stänga allt
LCD.Clear();
digitalWrite (backlightPin, låg);
FPS. SetLED(LOW);
While(true) delay(10000);
}
void waitForFinger() {
statisk int timer; innehåller timeout counter
timer = 0; återställer den timer varje gång denna funktion startar
While(!fps. IsPressFinger()) {//timeout åtta sekunder
timer ++;
Delay(100);
om (timer > = 80 & &! fps. IsPressFinger()) {
beep();
}
}
timer = 0; återställer den timer varje gång funktionen slutar
}
Sträng centerText(String s) {//centers text på LCD ser bättre
While(16-s.length() > 1) {//if text måste vara centrerad
s = " " + s + " "; skapar utrymme på båda sidor jämnt
}
returnera s;
}