door lock
door lock
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define Password_Length 5
Servo myservo;
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
int pos = 0;
char Data[Password_Length];
char Master[Password_Length] = "1234";
byte data_count = 0, master_count = 0;
bool Pass_is_good;
bool door = false;
char customKey;
/*---preparing keypad---*/
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {0, 1, 2, 3};
byte colPins[COLS] = {4, 5, 6, 7};
Keypad customKeypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
/*--- Main Action ---*/
void setup()
{
myservo.attach(9, 2000, 2400);
ServoClose();
lcd.begin(16, 2);
lcd.print("Protected Door");
loading("Loading");
lcd.clear();
}
void loop()
{
if (door == true)
{
customKey = customKeypad.getKey();
if (customKey == '#')
{
lcd.clear();
ServoClose();
lcd.print("Door is closed");
delay(3000);
door = false;
}
}
else
Open();
}
void loading (char msg[]) {
lcd.setCursor(0, 1);
lcd.print(msg);
for (int i = 0; i < 9; i++) {
delay(1000);
lcd.print(".");
}
}
void clearData()
{
while (data_count != 0)
{
Data[data_count--] = 0;
}
return;
}
void ServoClose()
{
for (pos = 90; pos >= 0; pos -= 10) {
myservo.write(pos);
}
}
void ServoOpen()
{
for (pos = 0; pos <= 90; pos += 10) {
myservo.write(pos);
}
}
void Open()
{
lcd.setCursor(0, 0);
lcd.print("Enter Password");
customKey = customKeypad.getKey();
if (customKey)
{
Data[data_count] = customKey;
lcd.setCursor(data_count, 1);
lcd.print(Data[data_count]);
data_count++;
}
if (data_count == Password_Length - 1)
{
if (!strcmp(Data, Master))
{
lcd.clear();
ServoOpen();
lcd.print(" Door is Open ");
door = true;
delay(5000);
loading("Waiting");
lcd.clear();
lcd.print(" Time is up! ");
delay(1000);
ServoClose();
door = false;
}
else
{
lcd.clear();
lcd.print(" Wrong Password ");
door = false;
}
delay(1000);
lcd.clear();
clearData();
}
}
Code 2
/*
Controlling a lock with a keypad and servo
by L0laB <https://github.com/L0laB/arduino-lock>
component used
- Arduino UNO & Genuino UNO
- 4x4 Keypad Matrix
- 1x Servo
- 2x LEDs
- Breadboard
- Jumper wires
inspired by
- https://www.arduino.cc/en/Tutorial/BuiltInExamples
- https://create.arduino.cc/projecthub/SurtrTech/keypad-door-lock-with-changeable-code-468b15
for language references see
- https://www.arduino.cc/reference/en/
to install the keypad library do
- [Tools] > [Manage Libraies] > [search for 'keypad'], than choose
'Mark Stanley, Alexander Breving, Version 3.11', http://playground.arduino.cc/Code/Keypad
to debug, check
- [Tools] > [Serial Monitor]
last modified on Jan, 2nd 2020
*/
//load mandatory libraries
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
//configuration for the servo - creating a servo object
Servo myservo;
//configuration for the keypad
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] = {9, 8, 7, 6}; //Rows 0 to 3 //if you modify your pins you should modify this too
byte colPins[numCols] = {5, 4, 3, 2}; //Columns 0 to 3
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);
//definition of variables
char keypressed; //variable to store the key strokes
char password[] = {'1', '2'}; //the default password
short a = 0, i = 0, j = 0; //variables used later for iterating through password input sequence
//definition of constants
const int ledGreen = 13; //connect green LED to pin number 13
const int ledRed = 12; //connect red LED to pin number 12
//initialise once various components
void setup() {
Serial.begin(9600); //open connection to serial monitor
pinMode(LED_BUILTIN, OUTPUT); //initialize the board LED as an output
digitalWrite(ledGreen, LOW);
digitalWrite(ledRed, HIGH);
myservo.attach(11); //attaches the servo on pin 10 to the servo object
closeLock();
}
//main program - runs always in a loop
void loop() {
keypressed = myKeypad.getKey(); //constantly wait and read for pressed key
//shows pressed keys in Serial-Monitor to debug
if (keypressed != NO_KEY) {
Serial.println(keypressed);
}
//check pressed keys to open/close thelock
if (keypressed == '*') { //press '*' to enter password sequence to open the lock
checkPassword(); //call function to read input
if (a == sizeof(password)) { //checkPassword function assigns a value to variable 'a' and it's correct when it has the size of the password array
openLock(); //open lock if password is correct
}
}
if (keypressed == '#') { //press '#' to close the lock
delay(300);
closeLock();
}
}
//function to verify password characters
void checkPassword() {
i = 0;
a = 0;
j = 0;
while (keypressed != 'B') { //to confirm the password press 'B' to 'open Door'
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY && keypressed != 'B' ) { //If the char typed isn't B and neither "nothing"
Serial.println(keypressed); //ATTENTION security risk, password will be shown in Serial Monitor!
j++;
if (keypressed == password[i] && i < sizeof(password)) { //if the char is correct a-/ i-variable increments to verify the next caracter
a++; //maybe only one iterator needed: a or i ?
i++;
}
else
a--; //if the character typed is wrong a decrements and cannot equal the size of password array
}
}
keypressed = NO_KEY;
}
//function opening the lock and setting statuses
void closeLock() {
myservo.write(90);
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
Serial.println("closing the lock");
}
//function closing the lock and setting statuses
void openLock() {
myservo.write(0);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(ledGreen, HIGH);
digitalWrite(ledRed, LOW);
Serial.println("opening the lock");
}
Door lock bloetuut
#include <Servo.h>
Servo myservo; // create servo object to control a servo
String inputString = "";
String command = "";
String value = "";
String password = "1958654"; // this is the password for opening and closing your door
// you can set any pasword you like using digit and symbols
boolean stringComplete = false;
void setup(){
//start serial connection
Serial.begin(9600); // baud rate is 9600 must match with bluetooth
//The String reserve() function allows you to allocate a buffer in memory for manipulating strings.
inputString.reserve(50); // reserve 50 bytes in memory to save for string manipulation
command.reserve(50);
value.reserve(50);
boolean stringOK = false;
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop(){
// if arduino receive a string termination character like \n stringComplete will set to true
if (stringComplete) {
//Serial.println(inputString);
delay(100);
// identified the posiion of '=' in string and set its index to pos variable
int pos = inputString.indexOf('=');
// value of pos variable > or = 0 means '=' present in received string.
if (pos > -1) {
// substring(start, stop) function cut a specific portion of string from start to stop
// here command will be the portion of received string till '='
// let received string is open=test123
// then command is 'open'
command = inputString.substring(0, pos);
// value will be from after = to newline command
// for the above example value is test123
// we just ignoreing the '=' taking first parameter of substring as 'pos+1'
// we are using '=' as a separator between command and vale
// without '=' any other character can be used
// we are using = menas our command or password must not contains any '=', otherwise it will cause error
value = inputString.substring(pos+1, inputString.length()-1); // extract command up to \n exluded
//Serial.println(command);
//Serial.println(value);
// password.compareTo(value) compare between password tring and value string, if match return 0
if(!password.compareTo(value) && (command == "OPEN")){
// if password matched and command is 'OPEN' than door should open
openDoor(); // call openDoor() function
Serial.println(" OPEN"); // sent open feedback to phone
delay(100);
}
else if(!password.compareTo(value) && (command == "CLOSE")){
// if password matched and command is 'CLOSE' than door should close
closeDoor();
Serial.println(" CLOSE"); // sent " CLOSE" string to the phone
delay(100);
}
else if(password.compareTo(value)){
// if password not matched than sent wrong feedback to phone
Serial.println(" WRONG");
delay(100);
}
}
// clear the string for next iteration
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
//Serial.write(inChar);
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline or a carriage return, set a flag
// so the main loop can do something about it:
if (inChar == '\n' || inChar == '\r') {
stringComplete = true;
}
}
}
void openDoor(){
myservo.write(-45);
delay(100);
}
void closeDoor(){
myservo.write(165);
delay(100);
}
/*
* Fingerprint Door Lock System
*
* Designed for Novita Palilati's Final Project
*
* The circuit:
* Using DFRobot LCD Keypad Shield
* Fingerprint Sensor: TX to D2; RX to D3; Vcc to 3.3V;
* Passive Buzzer to A1 pin
* Solenoid driver to A2 pin (active low)
*
* ADC Value for Analog Keypad:
* Key RIGHT = 0
* Key UP = 131
* Key DOWN = 306
* Key LEFT = 479
* Key SELECT = 720
*
*
* Created 2 May 2018
* @Gorontalo, Indonesia
* by ZulNs
*/
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#define LCD_RS 8
#define LCD_EN 9
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7
#define SS_RX 2
#define SS_TX 3
#define KEY_NONE 0
#define KEY_RIGHT 1
#define KEY_UP 2
#define KEY_DOWN 3
#define KEY_LEFT 4
#define KEY_SELECT 5
#define MENU_ENROLL 0
#define MENU_DELETE 1
#define MENU_EMPTY_DATABASE 2
#define MENU_TEMPLATE_COUNT 3
#define MENU_CHANGE_PIN 4
#define MENU_LCD_TIMEOUT 5
#define MENU_KEY_TIMEOUT 6
#define MENU_RETURN 7
const uint16_t EEPROM_PIN = EEPROM.length() - 7; // Max 6 chrs + zero chr
const uint16_t EEPROM_LCD_TIMEOUT = EEPROM.length() - 11; // Max 6 chrs + zero chr
const uint16_t EEPROM_KEY_TIMEOUT = EEPROM.length() - 15; // Max 6 chrs + zero chr
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
SoftwareSerial mySerial(SS_RX, SS_TX);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
char pin[7] = "908576";
char keyBuffer[7];
uint8_t oldKey;
uint32_t lcdTimeout, keyTimeout, lcdTimer, keyTimer;
void setup()
{
finger.begin(57600);
lcd.begin(16, 2);
lcd.print(F(" FINGERPRINT"));
bitSet(DDRB, 2); // Set D10 as output
bitSet(PORTB, 2); // Set D10 high (LCD backlight on)
bitSet(DDRC, 2); // Set A2 as output
bitSet(PORTC, 2); // Set A2 high (Solenoid Driver off)
delay(2000);
EEPROM.get(EEPROM_PIN, pin);
EEPROM.get(EEPROM_LCD_TIMEOUT, lcdTimeout);
EEPROM.get(EEPROM_KEY_TIMEOUT, keyTimeout);
lcdPrintL1(F("Init fingerprint"));
while (!finger.verifyPassword());
lcdPrintL2(F("Tmpl count: "));
finger.getTemplateCount();
lcd.print(finger.templateCount);
delay(2000);
oldKey = getKey();
printWaiting();
enableLcdTimeout();
}
void loop()
{
uint8_t id, key = getKey();
id = getFingerprintId();
if (id > 0)
{
printWaiting();
}
isLcdTimeout();
if (key != oldKey)
{
if (oldKey == KEY_NONE)
{
soundTick();
enableLcdTimeout();
if (key == KEY_SELECT)
{
keyTimer = lcdTimer;
if (getPin())
{
mainMenu();
}
enableLcdTimeout();
printWaiting();
}
}
oldKey = key;
}
}
// returns 0 if failed, otherwise returns ID #
uint8_t getFingerprintId()
{
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK)
{
return 0;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK)
{
return 0;
}
enableLcdTimeout();
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK)
{
lcdPrintL1(F("Unrecognized"));
}
else
{
lcdPrintL1(F("Found ID #"));
lcd.print(finger.fingerID);
lcdPrintL2(F("Confidence: "));
lcd.print(finger.confidence);
delay(2000);
bitClear(PORTC, 2); // Set A2 low (Solenoid Driver on)
lcdPrintL2(F("Box unlocked.."));
delay(20000);
bitSet(PORTC, 2); // Set A2 high (Solenoid Driver off)
lcdPrintL2(F("Box locked.."));
delay(2000);
}
while (finger.getImage() != FINGERPRINT_NOFINGER);
return (p == FINGERPRINT_OK) ? finger.fingerID : 255;
}
uint8_t getFingerprintEnroll(const uint8_t id)
{
uint8_t p;
lcdPrintL1(F("Finger #"));
lcd.print(id);
p = fingerGetImage();
if (p != FINGERPRINT_OK)
{
return p;
}
p = fingerImage2Tz(1);
if (p != FINGERPRINT_OK)
{
return p;
}
lcdPrintL2(F("Remove finger"));
while (finger.getImage() != FINGERPRINT_NOFINGER);
lcdPrintL1(F("Finger again"));
p = fingerGetImage();
if (p != FINGERPRINT_OK)
{
return p;
}
p = fingerImage2Tz(2);
if (p != FINGERPRINT_OK)
{
return p;
}
lcdPrintL1(F("Creating model"));
p = finger.createModel();
if (p == FINGERPRINT_OK)
{
lcdPrintL2(F("Prints matched!"));
}
else if (p == FINGERPRINT_PACKETRECIEVEERR)
{
lcdPrintL2(F("Comm error"));
}
else if (p == FINGERPRINT_ENROLLMISMATCH)
{
lcdPrintL2(F("Did not match"));
}
else
{
lcdPrintL2(F("Unknown error"));
}
delay(2000);
if (p != FINGERPRINT_OK)
{
return p;
}
lcdPrintL1(F("Storing model"));
p = finger.storeModel(id);
if (p == FINGERPRINT_OK)
{
lcdPrintL2(F("Stored #"));
lcd.print(id);
}
else if (p == FINGERPRINT_PACKETRECIEVEERR)
{
lcdPrintL2(F("Comm error"));
}
else if (p == FINGERPRINT_BADLOCATION)
{
lcdPrintL2(F("Could not store"));
}
else if (p == FINGERPRINT_FLASHERR)
{
lcdPrintL2(F("Error flashing"));
}
else
{
lcdPrintL2(F("Unknown error"));
}
delay(2000);
return p;
}
uint8_t fingerGetImage()
{
uint8_t p;
while (true)
{
p = finger.getImage();
switch (p)
{
case FINGERPRINT_OK:
lcdPrintL2(F("Image taken"));
break;
case FINGERPRINT_NOFINGER:
if (isKeyTimeout())
{
return -1;
}
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcdPrintL2(F("Comm error"));
break;
case FINGERPRINT_IMAGEFAIL:
lcdPrintL2(F("Imaging error"));
break;
default:
lcdPrintL2(F("Unknown error"));
}
if (p != FINGERPRINT_NOFINGER)
{
delay(2000);
keyTimer = millis();
return p;
}
}
}
uint8_t fingerImage2Tz(const uint8_t slot)
{
uint8_t p = finger.image2Tz(slot);
switch (p)
{
case FINGERPRINT_OK:
lcdPrintL1(F("Image converted"));
break;
case FINGERPRINT_IMAGEMESS:
lcdPrintL1(F("Image too messy"));
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcdPrintL1(F("Comm error"));
break;
case FINGERPRINT_FEATUREFAIL:
lcdPrintL1(F("Features fail"));
break;
case FINGERPRINT_INVALIDIMAGE:
lcdPrintL1(F("Invalid image"));
break;
default:
lcdPrintL1(F("Unknown error"));
}
delay(2000);
return p;
}
uint8_t deleteFingerprint(const uint8_t id)
{
uint8_t p = finger.deleteModel(id);
if (p == FINGERPRINT_OK)
{
lcdPrintL1(F("Deleted #"));
lcd.print(id);
}
else if (p == FINGERPRINT_PACKETRECIEVEERR)
{
lcdPrintL1(F("Comm error"));
}
else if (p == FINGERPRINT_BADLOCATION)
{
lcdPrintL1(F("Bad location"));
}
else if (p == FINGERPRINT_FLASHERR)
{
lcdPrintL1(F("Flashing error"));
}
else
{
lcdPrintL1(F("Unknown error"));
}
delay(2000);
return p;
}
void mainMenu()
{
uint8_t key, menu = MENU_ENROLL;
char chrBuffer[7];
boolean isYes;
lcdPrintL1(F("Select:"));
while (true)
{
switch (menu)
{
case MENU_ENROLL:
lcdPrintL2(F("Enroll"));
break;
case MENU_DELETE:
lcdPrintL2(F("Delete"));
break;
case MENU_EMPTY_DATABASE:
lcdPrintL2(F("Empty database"));
break;
case MENU_TEMPLATE_COUNT:
lcdPrintL2(F("Template count"));
break;
case MENU_CHANGE_PIN:
lcdPrintL2(F("Change PIN"));
break;
case MENU_LCD_TIMEOUT:
lcdPrintL2(F("LCD timeout"));
break;
case MENU_KEY_TIMEOUT:
lcdPrintL2(F("Key timeout"));
break;
case MENU_RETURN:
lcdPrintL2(F("Return"));
}
key = getAKey();
switch (key)
{
case KEY_DOWN:
menu++;
if (menu == MENU_RETURN + 1)
{
menu = MENU_ENROLL;
}
break;
case KEY_UP:
menu--;
if (menu == 255) // 255 is rollover value after decrement of 0
{
menu = MENU_RETURN;
}
break;
case KEY_SELECT:
switch (menu)
{
case MENU_ENROLL:
if (!enrollOrDelete(true))
{
return;
}
break;
case MENU_DELETE:
if (!enrollOrDelete(false))
{
return;
}
break;
case MENU_EMPTY_DATABASE:
key = getSureness();
if (key == 255)
{
return;
}
else if (key == 0)
{
finger.emptyDatabase();
lcdPrintL1(F("Now database is"));
lcdPrintL2(F("empty"));
delay(2000);
}
break;
case MENU_TEMPLATE_COUNT:
finger.getTemplateCount();
lcdPrintL1(F("Template: "));
lcd.print(finger.templateCount);
delay(2000);
break;
case MENU_CHANGE_PIN:
if (!getNewPin(F("New PIN:"), 9))
{
return;
}
if (keyBuffer[0] != 0)
{
strcpy(chrBuffer, keyBuffer);
if (!getNewPin(F("Confirm:"), 9))
{
return;
}
if (keyBuffer[0] != 0)
{
if (strcmp(chrBuffer, keyBuffer) == 0)
{
strcpy(pin, keyBuffer);
savePin();
lcdPrintL1(F("PIN changed"));
}
else
{
lcdPrintL1(F("PIN unchanged"));
}
delay(2000);
}
}
break;
case MENU_LCD_TIMEOUT:
if (!getTimeout(F("LCD T/O: "), 9, true))
{
return;
}
break;
case MENU_KEY_TIMEOUT:
if (!getTimeout(F("Key T/O: "), 9, false))
{
return;
}
break;
case MENU_RETURN:
return;
}
lcdPrintL1(F("Select:"));
keyTimer = millis();
break;
case 255:
return;
}
}
}
boolean enrollOrDelete(const boolean isEnroll)
{
uint8_t id;
while (true)
{
if (!getNumber(F("ID#"), 3, 6, false))
{
return false;
}
id = atoi(keyBuffer);
if (id > 127)
{
lcdPrintL1(F("0 < ID < 128"));
if (getAKey() == 255)
{
return false;
}
continue;
}
if (id == 0)
{
return true;
}
if (isEnroll)
{
if (getFingerprintEnroll(id) == 255)
{
return false;
}
}
else
{
deleteFingerprint(id);
}
keyTimer = millis();
}
}
uint8_t getSureness()
{
uint8_t key, pos = 8;
lcd.cursor();
lcd.blink();
lcdPrintL1(F("Sure? Y/N"));
while (true)
{
lcd.setCursor(pos, 0);
key = getAKey();
switch (key)
{
case KEY_LEFT:
pos = 6;
break;
case KEY_RIGHT:
pos = 8;
break;
default:
lcd.noCursor();
lcd.noBlink();
return (key == 255 ? -1 : pos == 6 ? 0 : 1);
}
}
}
boolean getTimeout(const __FlashStringHelper *flashStr, const uint8_t pos, const boolean isLcd)
{
uint16_t to = isLcd ? lcdTimeout / 1000 : keyTimeout / 1000; // convert milliseconds to seconds
uint16_t newTo;
while (true)
{
itoa(to, keyBuffer, 10);
if (!getNumber(flashStr, pos, 6, true))
{
return false;
}
newTo = atoi(keyBuffer);
if (keyBuffer[0] == 0 || isLcd && newTo * 1000 == lcdTimeout || !isLcd && newTo * 1000 == keyTimeout)
{
lcdPrintL1(F("T/O unchanged"));
delay(2000);
return true;
}
if (9 < newTo && newTo < 3601)
{
break;
}
lcdPrintL1(F("9 < T/O < 3601"));
if (getAKey() == 255)
{
return false;
}
}
if (isLcd)
{
lcdTimeout = newTo * 1000;
EEPROM.put(EEPROM_LCD_TIMEOUT, lcdTimeout);
lcdPrintL1(F("LCD"));
}
else
{
keyTimeout = newTo * 1000;
EEPROM.put(EEPROM_KEY_TIMEOUT, keyTimeout);
lcdPrintL1(F("Key"));
}
lcd.print(F(" T/O changed"));
delay(2000);
return true;
}
boolean getNewPin(const __FlashStringHelper *flashStr, const uint8_t pos)
{
uint8_t len;
do
{
if (!getNumber(flashStr, pos, 6, false))
{
return false;
}
len = strlen(keyBuffer);
}
while (0 < len && len < 4);
return true;
}
boolean getPin()
{
return getNumber(F("PIN:"), 5, 6, false) && (strcmp(pin, keyBuffer) == 0);
}
boolean getNumber(const __FlashStringHelper *flashStr, const uint8_t pos, const uint8_t len, const boolean preVal)
{
uint8_t srcCtr = 6, destCtr = preVal ? strlen(keyBuffer) : 0, key;
char chr;
lcdPrintL1(F(" 0123456789"));
lcdPrintL2(flashStr);
if (preVal)
{
lcd.print(keyBuffer);
}
lcd.setCursor(srcCtr, 0);
lcd.cursor();
lcd.blink();
while (true)
{
key = getAKey();
switch (key)
{
case KEY_RIGHT:
srcCtr++;
if (srcCtr == 16)
{
srcCtr = 6;
}
lcd.setCursor(srcCtr, 0);
break;
case KEY_LEFT:
srcCtr--;
if (srcCtr == 5)
{
srcCtr = 15;
}
lcd.setCursor(srcCtr, 0);
break;
case KEY_DOWN:
chr = 42 + srcCtr;
if (destCtr == len)
{
destCtr--;
}
keyBuffer[destCtr] = chr;
lcd.setCursor(pos + destCtr, 1);
lcd.print(chr);
lcd.setCursor(srcCtr, 0);
destCtr++;
break;
case KEY_UP:
if (destCtr > 0)
{
destCtr--;
lcd.setCursor(pos + destCtr, 1);
lcd.print(F(" "));
lcd.setCursor(srcCtr, 0);
}
break;
case KEY_SELECT:
keyBuffer[destCtr] = 0;
lcd.noCursor();
lcd.noBlink();
return true;
case 255:
return false;
}
}
}
uint8_t getAKey()
{
uint8_t key, key0 = getKey();
while (true)
{
if (isKeyTimeout())
{
return -1;
}
key = getKey();
if (key != key0)
{
if (key0 == KEY_NONE)
{
soundTick();
enableLcdTimeout();
keyTimer = lcdTimer;
return key;
}
key0 = key;
}
}
}
uint8_t getKey()
{
int16_t adc0, adc;
do
{
adc0 = analogRead(0);
delay(10);
adc = analogRead(0);
}
while (abs(adc - adc0) > 10);
if (adc < 50)
{
return KEY_RIGHT;
}
else if (adc < 181)
{
return KEY_UP;
}
else if (adc < 356)
{
return KEY_DOWN;
}
else if (adc < 524)
{
return KEY_LEFT;
}
else if (adc < 770)
{
return KEY_SELECT;
}
return KEY_NONE;
}
void soundTick()
{
tone(A1, 4000, 25);
}
void printWaiting()
{
lcdPrintL1(F("Waiting 4 finger"));
}
void lcdPrintL1(const __FlashStringHelper *flashStr)
{
lcd.clear();
lcd.print(flashStr);
}
void lcdPrintL2(const __FlashStringHelper *flashStr)
{
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(flashStr);
}
void enableLcdTimeout()
{
bitSet(PORTB, 2);
lcdTimer = millis();
}
void isLcdTimeout()
{
if (millis() - lcdTimer >= lcdTimeout)
{
bitClear(PORTB, 2);
}
}
boolean isKeyTimeout()
{
return (millis() - keyTimer >= keyTimeout);
}
void savePin()
{
uint8_t ctr = 0, chr;
do
{
chr = pin[ctr];
EEPROM.update(EEPROM_PIN + ctr, chr);
ctr++;
}
while (chr != 0);
}
/*
* Arduino Door Lock Access Control Project
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor
myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
void loop() {
int proximitySensor = analogRead(A0);
// If door is closed...
if (proximitySensor > 200) {
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return;
}
tagID = "";
// The MIFARE PICCs that we use have 4 byte UID
for ( uint8_t i = 0; i < 4; i++) { //
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
correctTag = false;
// Checks whether the scanned tag is the master tag
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if ( successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
successRead = false;
// Checks whether the scanned tag is authorized
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Unlocks the door
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// If door is open...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Locks the door
printNormalModeMessage();
}
}
uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return 0;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return 1;
}
void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}
/*RFID tag scan code
* https://srituhobby.com
*/
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
byte a = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
delay(4);
mfrc522.PCD_DumpVersionToSerial();
lcd.setCursor(2, 0);
lcd.print("Put your card");
}
void loop() {
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scanned UID");
a = 0;
Serial.println(F("Scanned PICC's UID:"));
for ( uint8_t i = 0; i < 4; i++) { //
readCard[i] = mfrc522.uid.uidByte[i];
Serial.print(readCard[i], HEX);
Serial.print(" ");
lcd.setCursor(a, 1);
lcd.print(readCard[i], HEX);
lcd.print(" ");
delay(500);
a += 3;
}
Serial.println("");
mfrc522.PICC_HaltA();
return 1;
}
/*
* Hello,Welcome TO Techno-E-Solution
* Check out Video Tutorial of this project:- https://www.youtube.com/watch?v=mmF7q6Nuj6Y
* Here is the Arduino Code for "RFID Based Door Lock System Using Arduino"
*/
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define SS_PIN 10
#define RST_PIN 9
#define LED_G 4 // Green LED pin
#define LED_R 5 // Red LED pin
#define lock 3
MFRC522 mfrc522(SS_PIN, RST_PIN);
int Btn = 6;
void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(Btn,INPUT);
pinMode(lock,OUTPUT);
Serial.println("Place your card on reader...");
Serial.println();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Scan Your RFID ");
lcd.setCursor(0,1);
lcd.print(" Door Locked ");
}
void loop()
{
if(digitalRead(Btn) == HIGH){
Serial.println("Access Granted");
Serial.println();
delay(500);
digitalWrite(LED_G, HIGH);
lcd.setCursor(0,1);
lcd.print(" Door Un-Locked ");
digitalWrite(lock,HIGH);
delay(3000);
digitalWrite(lock,LOW);
delay(100);
digitalWrite(LED_G, LOW);
lcd.setCursor(0,1);
lcd.print(" Door Locked ");
}
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "6A 7F 65 B3") //change here the UID of card/cards or tag/tags that you want to give access
{
Serial.println("Access Granted");
Serial.println();
delay(500);
digitalWrite(LED_G, HIGH);
lcd.setCursor(0,1);
lcd.print(" Door Un-Locked ");
digitalWrite(lock,HIGH);
delay(3000);
digitalWrite(lock,LOW);
delay(100);
digitalWrite(LED_G, LOW);
lcd.setCursor(0,1);
lcd.print(" Door Locked ");
}
else
{
lcd.setCursor(0,1);
lcd.print("Invalid RFID Tag");
Serial.println(" Access denied");
digitalWrite(LED_R, HIGH);
digitalWrite(LED_R, LOW);
delay(100);
digitalWrite(LED_R, HIGH);
delay(500);
digitalWrite(LED_R, LOW);
delay(100);
digitalWrite(LED_R, HIGH);
delay(500);
digitalWrite(LED_R, LOW);
lcd.setCursor(0,1);
lcd.print(" Door Locked ");
}
delay (100);
}
Komentar
Posting Komentar