Anda di halaman 1dari 31

#include <Keypad.

h>

#include <LiquidCrystal.h>

#include <PN532_HSU.h>

#include <PN532.h>

PN532_HSU pn532hsu(Serial1);

PN532 nfc(pn532hsu);

const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

struct USR

String nama;

String pass;

String nfc;

};

const int jlhUser = 3;


USR DataUser[jlhUser] ={{"SUPARMAN","1111111","AAAAAAA"}, //C18174EF -> id
gantungan kunci

{"SUKIRMAN","7654321","63AFA74B"},

{"JENETHA","1234567","04426C32C52880"}

};

const byte numRows= 4; //number of rows on the keypad

const byte numCols= 4; //number of columns on the keypad

char keymap[numRows][numCols]=

{'1', '2', '3', 'A'},

{'4', '5', '6', 'B'},

{'7', '8', '9', 'C'},

{'*', '0', '#', 'D'}

};

byte rowPins[numRows] = {28,29,26,27}; //Rows 0 to 3

byte colPins[numCols]= {24,25,22,23}; //Columns 0 to 3

Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);


// deklarasi pin

const int pinLock = 30;

const int pinLimitBuka = 10;

const int pinLimitTutup = 11;

const int pinMotor[2] = {31,33};

const int pinBuzzer = 32;

const int pinBtnBuka = 8;

const int pinBtnTutup = 9;

// alarm

long tmrBuzz;

int cntBuzz;

bool alarmOn;

int urutBuka;

int urutTutup;

int prosesPintu;

int proses = 200; // awalnya tutup pintu

int prosesOld ;
// keypad

String dtKey;

String charPass;

// delay

long timeTunda;

int cntTunda;

int cntSalah;

int cntNfcSalah;

int dlyPassSalah = 30;

bool cekBobol;

//

String dtNFC;

long tmrOver;

bool newNFC;

int cnt;

long tmrCall;
bool callNow;

int prosesCall;

int cntCall;

void setup() {

Serial.begin(9600);

Serial3.begin(9600);

delay(5000);

Serial3.println("AT+CMGF=1");

lcd.begin(16, 2);

pinMode(pinLock, OUTPUT);

pinMode(pinLimitBuka, INPUT_PULLUP);

pinMode(pinLimitTutup, INPUT_PULLUP);

pinMode(pinMotor[0], OUTPUT);

pinMode(pinMotor[1], OUTPUT);

pinMode(pinBuzzer, OUTPUT);

pinMode(pinBtnBuka,INPUT_PULLUP);

pinMode(pinBtnTutup,INPUT_PULLUP);

digitalWrite(pinLock,HIGH);

// init nfc

nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();

Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);

if (! versiondata) {

Serial.print("Didn't find PN53x board");

while (1); // halt

nfc.setPassiveActivationRetries(0xFF);

nfc.SAMConfig();

void loop() {

if(prosesOld != proses){

prosesOld = proses;

//Serial.print("Urut:");

//Serial.println(proses);

if(proses < 100){

if(cekTombolBuka()) {

proses = 100;
cekBobol = false;

}else if(cekTombolTutup()) {

proses = 200;

switch(proses){

case 0:

proses = 10;

lcd.begin(16, 2);

lcd.clear();

lcd.print("PASS:");

dtKey = "";

charPass = "";

tmrOver = millis();

break;

case 10: // stanby case

if(millis() > tmrOver + 1000){

tmrOver = millis();

proses = 15;
}

KeyPad();

break;

case 15:

proses = 10;

readNFC();

tmrOver = millis();

break;

case 20: // password salah

if(tunda(2)) {

proses = 0;

break;

case 30: // password slah 3 kali

//if(tunda(1)){

dlyPassSalah--;
lcd.setCursor(0, 0);

lcd.print("Tunggu ");

lcd.print(dlyPassSalah);

lcd.print(" dtk ");

Serial.print("Countdown:");

Serial.println(dlyPassSalah);

if(dlyPassSalah == 0){

dlyPassSalah = 30;

proses = 0;

//}

readNFC();

break;

case 100: // Buka pintu

prosesPintu = 100;

proses = 110;

//lcd.clear();

lcd.begin(16, 2);

lcd.print(" BUKA PINTU ");


cekBobol = false;

break;

case 110: //tunggu buka pintu selesai

if(prosesPintu == 0){

proses = 120;

break;

case 120: // jika buka pintu selesai

if(prosesPintu == 0){

proses = 130;

lcd.setCursor(0, 1);

lcd.print(" SELESAI ");

break;

case 130:

if(tunda(2)) {

proses = 0;

}
break;

case 200: // tutup pintu

prosesPintu = 200;

proses = 210;

//lcd.clear();

lcd.begin(16, 2);

lcd.print(" TUTUP PINTU ");

break;

case 210: //tunggu tutup pintu selesai

if(prosesPintu == 0){

proses = 220;

break;

case 220: // jika tutup pintu selesai

if(prosesPintu == 0){

proses = 230;

lcd.setCursor(0, 1);

lcd.print(" SELESAI ");


}

break;

case 230:

if(tunda(2)) {

proses = 0;

cekBobol = true;

break;

switch(prosesPintu){

case 0: // stanby

break;

case 100: // proses buka pintu

if(BukaPintu()){

prosesPintu = 0;
}

break;

case 200: // proses tutup pintu

if(TutupPintu()){

prosesPintu = 0;

break;

if(cekBobol){

if(digitalRead(pinLimitTutup) == 1) alarmOn = true;

//Serial.println(digitalRead(pinLimitBuka));

prosesAlarm();

if(callNow){

if(millis() > tmrCall + 1000){

tmrCall = millis();

switch(prosesCall){

case 0:
CallNum();

prosesCall = 10;

cntCall = 0;

break;

case 10:

cntCall++;

if(cntCall > 30){ // proses panggilan selama 10 detik

StopCall();

prosesCall = 20;

cntCall = 0;

break;

case 20:

cntCall++;

Serial.print("Wait next call");

Serial.println(120 - cntCall );

if(cntCall >= 120){ // tunggu 2 menit baru boleh call lagi

prosesCall = 0;

callNow = false;
}

break;

void KeyPad(){

char keypressed = myKeypad.getKey();

if (keypressed != NO_KEY)

switch(keypressed){

case '*':

if(SudahTutup()){ // jika pintu tertutup cek password

cnt = 0;

for(int i=0;i<3;i++){

Serial.println(cnt);

if(DataUser[i].pass == dtKey){

Serial.println("PASS OK");
dlyPassSalah = 30;

cnt++;

if(alarmOn){

alarmOn = false;

proses = 0;

cntSalah = 0;

}else{

Serial.print("Nama:");

Serial.println(DataUser[i].nama);

//lcd.clear();

lcd.begin(16, 2);

lcd.print("Nama:");

lcd.print(DataUser[i].nama);

lcd.setCursor(0, 1);

lcd.print(" AKSES DITERIMA ");

delay(1000);

proses = 100;

cntSalah = 0;

cekBobol = false;

alarmOn = false;

}
break;

Serial.print("cnt:");

Serial.println(cnt);

if(cnt == 0){

Serial.println("PASS SALAH");

proses = 20;

cntSalah++;

lcd.setCursor(0, 1);

lcd.print(cntSalah);

lcd.print("-PASSWORD SALAH");

if(cntSalah > 2){

cntSalah = 0;

proses = 30;

lcd.setCursor(0, 0);

lcd.print(" ");

alarmOn = true;

}else{

proses = 20;

}
}

dtKey = "";

}else{ // jika pintu terbuka tutup pintu

proses = 200;

break;

case '#':

dtKey = "";

charPass = "";

//Serial.println(charPass);

lcd.setCursor(5, 0);

lcd.print(" ");

break;

case 'A':

break;

case 'B':

break;

case 'C':
break;

case 'D':

break;

default:

if(dtKey.length() < 8) {

dtKey+= keypressed;

charPass+="*";

lcd.setCursor(5, 0);

lcd.print(charPass);

lcd.print(" ");

break;

//Serial.print(keypressed);

bool BukaPintu(){

bool rtrn = false;

switch(urutBuka){
case 0:

if(SudahBuka()){ // cek apakah pintu sudah terbuka full

urutBuka = 100;

}else{

urutBuka = 10;

digitalWrite(pinLock,LOW);

delay(100);

break;

case 10: // buka pintu

digitalWrite(pinMotor[0],LOW);

digitalWrite(pinMotor[1],HIGH);

Serial.println("BUKA PINTU");

urutBuka = 20;

break;

case 20:
if(SudahBuka()){ // cek apakah pintu sudah terbuka full

urutBuka = 100;

break;

case 100:

delay(100);

digitalWrite(pinMotor[0],LOW);

digitalWrite(pinMotor[1],LOW);

digitalWrite(pinLock,HIGH);

urutBuka = 0;

rtrn = true;

Serial.println("PINTU TELAH TERBUKA");

break;

return rtrn;

bool TutupPintu(){

bool rtrn = false;


switch(urutTutup){

case 0:

if(SudahTutup()){ // cek apakah pintu sudah tertutup full

urutTutup = 100;

}else{

urutTutup = 10;

cekBobol = false;

digitalWrite(pinLock,LOW);

delay(100);

break;

case 10: // Tutup pintu

digitalWrite(pinMotor[0],HIGH);

digitalWrite(pinMotor[1],LOW);

Serial.println("TUTUP PINTU");

urutTutup = 20;

break;

case 20:
if(SudahTutup()){ // cek apakah pintu sudah terTutup full

urutTutup = 100;

break;

case 100:

delay(100);

digitalWrite(pinMotor[0],LOW);

digitalWrite(pinMotor[1],LOW);

digitalWrite(pinLock,HIGH);

urutTutup = 0;

rtrn = true;

Serial.println("PINTU TELAH TERTUTUP");

cekBobol = true;

break;

return rtrn;

bool SudahBuka(){
bool rtrn;

if(digitalRead(pinLimitBuka) == 0) rtrn = true; else rtrn = false;

return rtrn;

bool SudahTutup(){

bool rtrn;

if(digitalRead(pinLimitTutup) == 0) rtrn = true; else rtrn = false;

return rtrn;

void LockDoor(){

digitalWrite(pinLock,HIGH);

void UnlockDoor(){

digitalWrite(pinLock,LOW);

bool tunda(int lama){

if (cntTunda < lama){


if(millis() > timeTunda + 1000){

timeTunda = millis();

cntTunda++;

return false;

}else{

cntTunda = 0;

return true;

void prosesAlarm(){

if(millis() > tmrBuzz + 300){

tmrBuzz = millis();

if(alarmOn){

if(!callNow) callNow = true;

digitalWrite(pinBuzzer,!digitalRead(pinBuzzer));

}else{

if(digitalRead(pinBuzzer) == 0) digitalWrite(pinBuzzer,HIGH);

callNow = false;

}
}

bool cekTombolBuka(){

bool rtrn ;

if(digitalRead(pinBtnBuka) == 0) rtrn = true; else rtrn = false;

return rtrn;

bool cekTombolTutup(){

bool rtrn ;

if(digitalRead(pinBtnTutup) == 0) rtrn = true; else rtrn = false;

return rtrn;

void readNFC(){

boolean success;

uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID

uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A


card type)
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

if (success) {

Serial.println("Found a card!");

//Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");

//Serial.print("UID Value: ");

dtNFC = "";

newNFC = false;

for (uint8_t i=0; i < uidLength; i++)

String dtHex = String(uid[i],HEX);

if(dtHex.length() == 1) dtNFC += "0";

dtNFC += dtHex;

//dtNFC += " ";

dtNFC.toUpperCase();

Serial.print("NFC Input:");

Serial.print(dtNFC);

Serial.print("(");

Serial.print(dtNFC.length());

Serial.println(")");
if(dtNFC.length() > 5){

cnt = 0;

//Serial.println("Masuk");

for(int i=0;i<3;i++){

if(DataUser[i].nfc == dtNFC){

dlyPassSalah = 30;

cnt++;

Serial.println("NFC Sesuai");

cekBobol = false;

if(alarmOn){

alarmOn = false;

proses = 0;

cntNfcSalah = 0;

lcd.begin(16, 2);

lcd.print("Nama:");

lcd.print(DataUser[i].nama);

lcd.setCursor(0, 1);

lcd.print(" ALARM OFF ");

}else{
Serial.print("Nama:");

Serial.println(DataUser[i].nama);

//lcd.clear();

lcd.begin(16, 2);

lcd.print("Nama:");

lcd.print(DataUser[i].nama);

lcd.setCursor(0, 1);

lcd.print(" AKSES DITERIMA ");

delay(1000);

proses = 100;

cntNfcSalah = 0;

alarmOn = false;

break;

}else{

//cnt =0 ;

Serial.print(cnt);

Serial.print("->");

Serial.println(DataUser[i].nfc);

}
}

Serial.print("cnt:");

Serial.println(cnt);

if(cnt == 0 ){

Serial.println("NFC TIDAK TERDAFTAR");

proses = 20;

cntNfcSalah++;

lcd.setCursor(0, 1);

lcd.print(cntNfcSalah);

lcd.print("- NFC SALAH");

if(cntNfcSalah > 2){

cntNfcSalah = 0;

proses = 30;

lcd.setCursor(0, 0);

lcd.print(" ");

alarmOn = true;

}else{

proses = 20;

}
}

dtKey = "";

void CallNum(){

Serial3.println("ATD +6282368283855;");

Serial.println("CALL NUMBER");

void StopCall(){

Serial3.println("ATH;");

Serial.println("STOP CALL");

Anda mungkin juga menyukai