LAMPIRAN PROGRAM
a. Library
#include <LiquidCrystal.h> #include <Keypad.h> #include <EEPROM.h>
#include <Adafruit_Fingerprint.h> #include <SoftwareSerial.h>
b. Inilisialisasi Variabel dan PORT
uint8_t getFingerprintEnroll(uint8_t id);
SoftwareSerial mySerial(52, 53);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int addr = 0; byte value; uint8_t p = -1;
int addr_door1 = 0; int addr_door2 = 1;
int dot=0,n_code=3,id_door=0,door=0,g=0,x=0,i=0, times=0, times1=0, times2=0;
char pass1[3] = {'0','0','0'}; char pass2[3] = {'0','0','0'};
int passB1=5; int passB2=6; int passB3=7;
const byte ROWS = 4; const byte COLS = 4;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char key[3] = {'0','0','0'};
char hexaKeys[ROWS][COLS] = { {'1','2','3','A'},
{'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} };
byte rowPins[ROWS] = {23, 25, 27, 29}; byte colPins[COLS] = {31, 33, 35, 37};
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
c. Configurasi Pin dan Conektifitas (void setup())
void setup() { Serial.begin(9600); lcd.begin(16, 2); finger.begin(57600);
if (finger.verifyPassword()) {
lcd.setCursor(0, 0);
Serial.println("Fingerprint"); }
else {
lcd.setCursor(0, 0);
Serial.println("Not Found"); while (1);
} }
c.1 Fungsi Tambahan (void InputPin() dan void change_pass())
void InputPin() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ups, not match"); delay(2000);
lcd.clear();
lcd.setCursor(0, 0); lcd.print("PIN code "); delay(1000);
while(times < 3) {
char customKey = customKeypad.getKey(); if (customKey)
{
{
if(id_door==1) {
pass1[0]=EEPROM.read(passA1); pass1[1]=EEPROM.read(passA2); pass1[2]=EEPROM.read(passA3); if(key[x]==pass1[x])
{
times++;
lcd.setCursor(x, 1); lcd.print(customKey); delay(300);
x++; continue;
} else {
lcd.setCursor(0, 0);
lcd.print("ups, not match"); delay(1000);
lcd.clear(); times = 0; x=0; return; }
}
else if(id_door==2) {
{
times++;
lcd.setCursor(x, 1); lcd.print(customKey); delay(300);
x++; continue; }
else {
lcd.setCursor(0, 0);
lcd.print("ups, not match"); delay(1000);
lcd.clear(); times = 0; x=0; return; }
} } } } }
void change_pass() {
g=0; lcd.clear(); while(g<n_code) {
lcd.setCursor(0, 0);
char customKey = customKeypad.getKey(); if (customKey)
{
lcd.setCursor(g, 1); lcd.print(customKey); key[g]=customKey; g++;
if(g==n_code){ if(id_door==1) {
EEPROM.write(passA1,key[0]); EEPROM.write(passA2,key[1]); EEPROM.write(passA3,key[2]); }
else if(id_door==2) {
EEPROM.write(passB1,key[0]); EEPROM.write(passB2,key[1]); EEPROM.write(passB3,key[2]); }
} }
delay(300); }
lcd.clear(); }
d. Raning Main Program (void loop())
void loop() {
door = 0; lcd.clear();
lcd.setCursor(0, 0); lcd.print("No.Locker :");
char customKey = customKeypad.getKey(); id = customKey;
delay(1); id = id - 48;
if (customKey) //atau while(customKey) {
lcd.setCursor(11, 0); lcd.print(customKey); delay(1000);
if(customKey=='1') {
id_door = 1;
value = EEPROM.read(addr_door1); if(value == 0)
{
//Tag fingerprint baru door = 1;
getFingerprintEnroll(id); EEPROM.write(addr_door1, 1); }
else {
if (times1==3) {
InputPin(); if (times == 3) {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Locker #1"); delay(1000);
lcd.setCursor(0,1);
lcd.print("is opened"); delay(3000);
EEPROM.write(addr_door1, 0); door= 1;
lcd.clear();
lcd.setCursor(0,0); lcd.print("Open..."); lcd.setCursor(0,1); lcd.print("Locker #"); lcd.print(door); delay(2000); lcd.clear();
times = 0; x = 0; }
times1 = 1; }
} }
{
id_door = 2;
value = EEPROM.read(addr_door2); if(value == 0)
{
//Tag fingerprint baru door = 2; getFingerprintEnroll(id);
EEPROM.write(addr_door2, 1); }
else {
//searching fingerprint getFingerprintSearch(); if (times2==3)
{
InputPin(); if (times == 3) {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Locker #2"); delay(1000);
lcd.setCursor(0,1);
lcd.print("is opened"); delay(3000);
EEPROM.write(addr_door2, 0); door= 2;
lcd.clear();
lcd.setCursor(0,1); lcd.print("Locker #"); lcd.print(door); delay(2000); lcd.clear();
times = 0; x=0; }
times2 = 1; }
} }
else if(customKey=='D') {
EEPROM.write(addr_door1, 0); EEPROM.write(addr_door2, 0); EEPROM.write(passA1,'0'); EEPROM.write(passA2,'0'); EEPROM.write(passA3,'0'); EEPROM.write(passB1,'0'); EEPROM.write(passB2,'0'); EEPROM.write(passB3,'0'); lcd.clear();
lcd.setCursor(0,0); lcd.print("Erasing"); lcd.setCursor(0,1);
lcd.print("EEPROM..."); delay(1000);
{
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Locker #"); lcd.print(customKey); lcd.setCursor(0, 1);
lcd.print("is not available..."); delay(1000);
door=0; }
lcd.clear(); }
// Checking door
if(door==1) {
digitalWrite(50,HIGH); }
else if(door==2) {
digitalWrite(24,HIGH); }
delay(2000);
digitalWrite(50,LOW); digitalWrite(24,LOW); }
//ambil original image 288 x 256
uint8_t getFingerprintEnroll(uint8_t id) {
lcd.clear(); delay(500);
lcd.setCursor(0, 0);
lcd.print("Rec New Finger"); lcd.setCursor(0, 1);
while (p != FINGERPRINT_OK) {
p = finger.getImage(); switch (p) {
case FINGERPRINT_OK: lcd.print("Image taken"); break;
case FINGERPRINT_NOFINGER: if(dot<3)
{
lcd.print("."); dot++; } break;
case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Communication error");
break;
case FINGERPRINT_IMAGEFAIL: lcd.print("Imaging error");
break; default:
lcd.setCursor(0,1);
lcd.print("Unknown error"); break;
// OK success!
//convert original image ke bentuk character file simpan di char buffer 1 p = finger.image2Tz(1);
lcd.clear(); delay(500);
lcd.setCursor(0,0); switch (p)
{
case FINGERPRINT_OK: lcd.clear();
lcd.print("Image converted"); break;
case FINGERPRINT_IMAGEMESS: lcd.print("Image too messy"); return p;
case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL: lcd.print("Could not find");
return p;
case FINGERPRINT_INVALIDIMAGE: lcd.print("Could not find");
return p; default:
lcd.setCursor(0,1);
lcd.print("Unknown error"); return p;
}
delay(500); lcd.setCursor(0,0);
lcd.print("Remove finger"); delay(1000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage(); }
change_pass();
// ambil kembali original image p = -1;
lcd.clear(); delay(500); lcd.setCursor(0,0);
lcd.print("Place your fngr"); lcd.setCursor(0,1);
while (p != FINGERPRINT_OK) {
p = finger.getImage(); switch (p) {
case FINGERPRINT_OK: lcd.print("Image taken"); break;
case FINGERPRINT_NOFINGER: if(dot<3)
{
lcd.print("."); dot++;
case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Communication error");
break;
case FINGERPRINT_IMAGEFAIL: lcd.print("Imaging error"); break;
default:
lcd.print("Unknown error"); break;
} }
// OK success!
//convert original image ke bentuk character file simpan di char buffer 2 p = finger.image2Tz(2);
lcd.clear(); delay(500); lcd.setCursor(0,0); switch (p)
{
case FINGERPRINT_OK: lcd.print("Image converted"); break;
case FINGERPRINT_IMAGEMESS: lcd.print("Image too messy"); return p;
case FINGERPRINT_PACKETRECIEVEERR: lcd.print("Communication error");
return p;
return p;
case FINGERPRINT_INVALIDIMAGE: lcd.print("Could not find");
return p; default:
lcd.print("Unknown error"); return p;
}
// OK converted!
// matching kan isi char buffer 1 dan buffer 2
// convert isi di char buffer 1 dan char buffer 2 menjadi sebuah template lalu simpan kembali di char buffer
lcd.clear(); delay(500);
p = finger.createModel(); lcd.setCursor(0,0);
if (p == FINGERPRINT_OK) {
lcd.print("Prints matched!"); }
else if (p == FINGERPRINT_PACKETRECIEVEERR) {
lcd.print("Communication error"); return p;
}
else if (p == FINGERPRINT_ENROLLMISMATCH) {
lcd.print("Not Match"); return p;
else {
lcd.print("Unknown error"); return p;
}
delay(2000);
//setelah print matched !
//simpan template jari di flash memory ZFM-20 p = finger.storeModel(id);
lcd.clear(); delay(500); lcd.setCursor(0,0);
if (p == FINGERPRINT_OK) {
lcd.print("Stored!"); delay(1000);
lcd.clear();
lcd.print("Succesfull"); delay(2000);
lcd.clear();
lcd.setCursor(0,0); lcd.print("Open..."); lcd.setCursor(0,1); lcd.print("Locker #"); lcd.print(door); }
else if (p == FINGERPRINT_PACKETRECIEVEERR) {
}
else if (p == FINGERPRINT_BADLOCATION) {
lcd.print("Could not store"); return p;
}
else if (p == FINGERPRINT_FLASHERR) {
lcd.print("Error writing"); return p;
} else {
lcd.print("Unknown error"); return p;
}
delay(1000); }
uint8_t getFingerprintSearch() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Scan your finger..."); delay(500);
uint8_t p = -1;
while (p != FINGERPRINT_OK) {p = finger.getImage();}
p = -1;
{p = finger.image2Tz();}
p = -1; while (1) {
p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) {
lcd.clear();
lcd.print("Locker #");
if (id_door == 0) {id_door = 1;} lcd.print(id_door); delay(300);
if (id_door == 1){times1++;} else if (id_door == 2){times2++;}
lcd.setCursor(0,1); lcd.print("is not yours"); delay(3000);
door = 0; }
else {
if (id_door == 0) {id_door = 1;}
if(finger.fingerID==id_door) {
lcd.clear();
lcd.print("Locker #"); if (id_door == 0) {id_door = 1;} lcd.print(id_door); delay(1000); lcd.setCursor(0,1);
lcd.print("is opened"); delay(3000);
if (finger.fingerID == 1)
{EEPROM.write(addr_door1, 0);door = 1;} else if (finger.fingerID == 2)
{EEPROM.write(addr_door2, 0);door = 2;} lcd.clear();
lcd.print("Locker #"); lcd.print(door); delay(2000); lcd.clear();
times1 = 1; times2 = 1; }
else {
lcd.clear();
lcd.print("Locker #"); if (id_door == 0) {id_door = 1;} lcd.print(id_door); delay(300);
else if (id_door == 2){times2++;}
lcd.setCursor(0,1); lcd.print("is not yours"); delay(3000);
door = 0; }
}
return 1; // break; }