Hi everyone. I'm extremely new to coding arduino but am trying my best. I created a perfectly functioning door entry system that uses RFID key tags or a password to open the door. So far it is functioning great. I created the code by stealing bits and pieces from others and modifying it to suit my needs. I want to add one function. Right now if I scan an RFID tag or enter the correct password the door opens for 3 seconds and then re-locks. What I would like to do is once the correct password is entered / keytag swiped or perhaps even before if I push the "#" key the door will unlock permanently until the "" key is pushed. So I will copy here my original code without the unlocking functionality and then I will add the code at the bottom that I started to play with. I think I know how to unlock the door based on a variable "lockState" I just don't know how to change that state based on the "" or "#" keys. Thanks for any help you may be able to lend me. I'm very new to coding but think I'm slowly picking it up...
Here is the functioning code...
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10, 9); // MFRC522 mfrc522(SS_PIN, RST_PIN)
constexpr uint8_t greenLed = 7;
constexpr uint8_t redLed = 6;
constexpr uint8_t relayPin = 8;
constexpr uint8_t buzzerPin = 5;
constexpr uint8_t openPin = 4;
int openState = 0;
int lockState = true;
int passwordstate = 0;
char initial_password[4] = {'1', '1', '1', '1'}; // Input desired password here
char password[4];
char key_pressed = 0;
uint8_t i = 0;
const byte rows = 4;
const byte columns = 4;
char hexaKeys[rows][columns] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte row_pins[rows] = {A0, A1, A2, A3};
byte column_pins[columns] = {0, 1, 2, 3};
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup()
{
pinMode(buzzerPin, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(openPin, INPUT);
digitalWrite(relayPin, HIGH);
lcd.begin();
lcd.backlight();
SPI.begin();
mfrc522.PCD_Init();
mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
lcd.clear(); //
lcd.print("Enter Password:");
}
void loop()
{
{
openState = digitalRead(openPin);
if (openState == HIGH)
{
lcd.clear();
lcd.print(" DOOR OPENING");
lcd.setCursor(0, 1);
lcd.print(" STAND CLEAR");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
}
{
key_pressed = keypad_key.getKey(); // Storing keys
if (key_pressed)
{
password[i++] = key_pressed; // Storing in password variable
lcd.setCursor(0, 1);
lcd.print("*");
passwordstate = 1;
}
if ((i == 2) && (passwordstate != 2)) // If 2 keys are completed
{
lcd.print("*");
passwordstate = 2;
}
if ((i == 3) && (passwordstate != 3)) // If 3 keys are completed
{
lcd.print("**");
passwordstate = 3;
}
if (i == 4) // If 4 keys are completed
{
delay(200);
if (!(strncmp(password, initial_password, 4))) // If password is matched
{
lcd.clear();
lcd.print("Pass Accepted");
lcd.setCursor(0, 1);
lcd.print("Authorized");
digitalWrite(relayPin, LOW);
digitalWrite(greenLed, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
passwordstate = 0;
}
else // If password is not matched
{
lcd.clear();
lcd.print("Wrong Password");
lcd.setCursor(0, 1);
lcd.print("Access Denied");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
}
}
}
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
//Reading from the card
String tag = "";
byte letter;
for (byte j = 0; j < mfrc522.uid.size; j++)
{
tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
tag.concat(String(mfrc522.uid.uidByte[j], HEX));
}
tag.toUpperCase();
//Checking the card
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Chelsea");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Cory");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Cory");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) != "11 11 11 11")
if (tag.substring(1) != "11 11 11 11")
if (tag.substring(1) != "11 11 11 11")
{
// If UID of tag is not matched.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong Tag Shown");
lcd.setCursor(0, 1);
lcd.print("Access Denied");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
}
{
key_pressed = keypad_key.getKey(); // Storing keys
if (key_pressed)
{
password[i++] = key_pressed; // Storing in password variable
lcd.print("*");
}
if (i == 4) // If 4 keys are completed
{
delay(200);
if (!(strncmp(password, initial_password, 4))) // If password is matched
{
lcd.clear();
lcd.print("Pass Accepted");
lcd.setCursor(0, 1);
lcd.print("Authorized");
digitalWrite(relayPin, LOW);
digitalWrite(greenLed, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
}
else // If password is not matched
{
lcd.clear();
lcd.print("Wrong Password");
lcd.setCursor(0, 1);
lcd.print("Access Denied");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
}
}
}
}
Here is the code I started to play with adding a "lockState" to keep the door unlocked...
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(10, 9); // MFRC522 mfrc522(SS_PIN, RST_PIN)
constexpr uint8_t greenLed = 7;
constexpr uint8_t redLed = 6;
constexpr uint8_t relayPin = 8;
constexpr uint8_t buzzerPin = 5;
constexpr uint8_t openPin = 4;
int openState = 0;
int lockState = true;
int passwordstate = 0;
char initial_password[4] = {'1', '1', '1', '1'}; // Input desired password here
char password[4];
char key_pressed = 0;
uint8_t i = 0;
const byte rows = 4;
const byte columns = 4;
char hexaKeys[rows][columns] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte row_pins[rows] = {A0, A1, A2, A3};
byte column_pins[columns] = {0, 1, 2, 3};
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup()
{
pinMode(buzzerPin, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(openPin, INPUT);
digitalWrite(relayPin, HIGH);
lcd.begin();
lcd.backlight();
SPI.begin();
mfrc522.PCD_Init();
mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
lcd.clear(); //
lcd.print("Enter Password:");
}
void loop()
{
if (lockState = false)
{
digitalWrite(greenLed, HIGH);
lcd.clear();
lcd.print("DOOR UNLOCKED");
lcd.setCursor(0, 1);
lcd.print("PUSH * TO LOCK");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
}
if (lockState == true)
{
{
openState = digitalRead(openPin);
if (openState == HIGH)
{
lcd.clear();
lcd.print(" DOOR OPENING");
lcd.setCursor(0, 1);
lcd.print(" STAND CLEAR");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
}
{
key_pressed = keypad_key.getKey(); // Storing keys
if (key_pressed)
{
password[i++] = key_pressed; // Storing in password variable
lcd.setCursor(0, 1);
lcd.print("*");
passwordstate = 1;
}
if ((i == 2) && (passwordstate != 2)) // If 2 keys are completed
{
lcd.print("*");
passwordstate = 2;
}
if ((i == 3) && (passwordstate != 3)) // If 3 keys are completed
{
lcd.print("**");
passwordstate = 3;
}
if (i == 4) // If 4 keys are completed
{
delay(200);
if (!(strncmp(password, initial_password, 4))) // If password is matched
{
lcd.clear();
lcd.print("Pass Accepted");
lcd.setCursor(0, 1);
lcd.print("Authorized");
digitalWrite(relayPin, LOW);
digitalWrite(greenLed, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
passwordstate = 0;
}
else // If password is not matched
{
lcd.clear();
lcd.print("Wrong Password");
lcd.setCursor(0, 1);
lcd.print("Access Denied");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
}
}
}
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
//Reading from the card
String tag = "";
byte letter;
for (byte j = 0; j < mfrc522.uid.size; j++)
{
tag.concat(String(mfrc522.uid.uidByte[j] < 0x10 ? " 0" : " "));
tag.concat(String(mfrc522.uid.uidByte[j], HEX));
}
tag.toUpperCase();
//Checking the card
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Chelsea");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Cory");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) == "11 11 11 11")
{
lcd.clear();
lcd.print("Tag Matched");
lcd.setCursor(0, 1);
lcd.print("Welcome Cory");
digitalWrite(greenLed, HIGH);
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(3000);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
if (tag.substring(1) != "11 11 11 11")
if (tag.substring(1) != "11 11 11 11")
if (tag.substring(1) != "11 11 11 11")
{
// If UID of tag is not matched.
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong Tag Shown");
lcd.setCursor(0, 1);
lcd.print("Access Denied");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
}
}
{
key_pressed = keypad_key.getKey(); // Storing keys
if (key_pressed)
{
password[i++] = key_pressed; // Storing in password variable
lcd.print("*");
}
if (i == 4) // If 4 keys are completed
{
delay(200);
if (!(strncmp(password, initial_password, 4))) // If password is matched
{
lcd.clear();
lcd.print("Pass Accepted");
lcd.setCursor(0, 1);
lcd.print("Authorized");
digitalWrite(relayPin, LOW);
digitalWrite(greenLed, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(buzzerPin, HIGH);
delay(500);
digitalWrite(buzzerPin, LOW);
delay(500);
digitalWrite(greenLed, LOW);
digitalWrite(relayPin, HIGH);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
i = 0;
}
else // If password is not matched
}
}
}
}
I’m just curious. Can someone explain the following if statement...
if (!(strncmp(password, initial_password, 4))) // If password is matched
I stole it from someone else I just don’t understand what’s happening in it. The brackets and explanation point is confusing me. Thanks in advance. I realize it’s a string compare just the brackets and location of the explanation point are confusing me.