In the previous post, you learned about RFID and keypad based door lock system in which you had to first scan the right tag and then enter the correct password to open the door lock. Now we are going to add the Sim900 module in that system to make it an RFID and Keypad based Door lock and alert system using Arduino.
For Custom Projects, hire me at https://www.freelancer.com/u/Muhammadaqibdutt
This is third article of the RFID Arduino series. All articles of RFID Arduino series are as follows
- RFID Basics and RFID Module interfacing with Arduino
- RFID and Keypad based Door Lock using Arduino
- RFID and Keypad based Door Lock and Alert System using Arduino
- RFID based Access Control System using Arduino
- RFID based Access Control and Alert System using Arduino
- RFID and Keypad based Access Control using Arduino
- RFID and Keypad Based Access Control and Alert System using Arduino
- On scanning the wrong tag or on entering the wrong password, it will send us an alert.
- On scanning the right tag and on entering the right password, it will send us a confirmation message that the door has opened.
- You can halt the system by sending ‘close’ message to Arduino and it will only go back to normal mode when you will send the ‘open’ message to Arduino. During halt time, it won’t scan any tags and it will only look for messages.
- You can also open the door by sending message to Arduino.
The RFID reader communicates with the Arduino through the SPI protocol and different Arduino boards have different SPI pins.
To test if the RFID reader is working properly or not, upload the “dumpinfo” from the examples in the Arduino and see if it is showing the information of the tags on the serial monitor or not. If you are new to RFID, then follow this tutorial | RFID basics and RFID module interfacing with Arduino
The I2C LCD communicates with the Arduino through the I2C protocol. Different Arduino boards have different I2C pins. The I2C pins on Arduino Uno and Arduino Nano are A4, A5.
Next connect the keypad with Arduino. The 4X4 keypad has 8 connections but we don’t require the last column of keypad. We only require numbers for the password. So we won’t use the last pin of keypad which is for fourth column. You can also use 4X3 keypad instead of 4X4 keypad.
For powering the SIM900 module, the recommended power to use is 5V, 2A but I have used the 5V, 1.5A power adapter and it worked fine.
Once you have powered the SIM900 module, the power light will light up and on pressing the power key, the status led should light up and the netlight should start blinking. At this point, make a call from your mobile to the sim you have placed in the SIM900 module. If you are successful in making the call, then your sim is working properly with the SIM900 module.
In the end, connect the power source to the Arduino. I have used three 18650 cells. We can give 6 to 12V to the Arduino through the barrel jack.
The complete circuit diagram for RFID and Keypad based Door lock and Alert System using Arduino is as follows
Code
You need to do the following changes in the code
Change the tag’s UID in the below line of code with your tag’s UID.String tagUID = “29 B9 ED 23”;Add you number in the below line of code. This line is in the last function.SIM900.println(“AT+CMGS=\”+XXXXXXXXXXXX\””); // Replace it with your mobile number
The initial password is ‘1234’.
The complete code for RFID and Keypad based Door lock and Alert System using Arduino is as follows
// Include required libraries
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SoftwareSerial.h>
#include <Servo.h>
#include <SPI.h>
// Create instances
SoftwareSerial SIM900(3, 4); // SoftwareSerial SIM900(Rx, Tx)
MFRC522 mfrc522(10, 9); // MFRC522 mfrc522(SS_PIN, RST_PIN)
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo sg90;
// Initialize Pins for led's, servo and buzzer
// Blue LED is connected to 5V
constexpr uint8_t greenLed = 7;
constexpr uint8_t redLed = 6;
constexpr uint8_t servoPin = 8;
constexpr uint8_t buzzerPin = 5;
char initial_password[4] = {'1', '2', '3', '4'}; // Variable to store initial password
String tagUID = "29 B9 ED 23"; // String to store UID of tag. Change it with your tag's UID
char password[4]; // Variable to store users password
boolean RFIDMode = true; // boolean to change modes
boolean NormalMode = true; // boolean to change modes
char key_pressed = 0; // Variable to store incoming keys
uint8_t i = 0; // Variable used for counter
// defining how many rows and columns our keypad have
const byte rows = 4;
const byte columns = 4;
// Keypad pin map
char hexaKeys[rows][columns] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Initializing pins for keypad
byte row_pins[rows] = {A0, A1, A2, A3};
byte column_pins[columns] = {2, 1, 0};
// Create instance for keypad
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup() {
// Arduino Pin configuration
pinMode(buzzerPin, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
sg90.attach(servoPin); //Declare pin 8 for servo
sg90.write(0); // Set initial position at 0 degrees
lcd.begin(); // LCD screen
lcd.backlight();
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
// Arduino communicates with SIM900 GSM shield at a baud rate of 19200
// Make sure that corresponds to the baud rate of your module
SIM900.begin(19200);
// AT command to set SIM900 to SMS mode
SIM900.print("AT+CMGF=1\r");
delay(100);
// Set module to send SMS data to serial out upon receipt
SIM900.print("AT+CNMI=2,2,0,0,0\r");
delay(100);
lcd.clear(); // Clear LCD screen
}
void loop() {
if (NormalMode == false) {
// Function to receive message
receive_message();
}
else if (NormalMode == true) {
// System will first look for mode
if (RFIDMode == true) {
// Function to receive message
receive_message();
lcd.setCursor(0, 0);
lcd.print(" Door Lock");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag ");
// 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 = "";
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) == tagUID)
{
// If UID of tag is matched.
lcd.clear();
lcd.print("Tag Matched");
digitalWrite(greenLed, HIGH);
delay(3000);
digitalWrite(greenLed, LOW);
lcd.clear();
lcd.print("Enter Password:");
lcd.setCursor(0, 1);
RFIDMode = false; // Make RFID mode false
}
else
{
// 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);
send_message("Someone Tried with the wrong tag \nType 'close' to halt the system.");
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
}
}
// If RFID mode is false, it will look for keys from keypad
if (RFIDMode == false) {
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");
sg90.write(90); // Door Opened
digitalWrite(greenLed, HIGH);
send_message("Door Opened \nIf it was't you, type 'close' to halt the system.");
delay(3000);
digitalWrite(greenLed, LOW);
sg90.write(0); // Door Closed
lcd.clear();
i = 0;
RFIDMode = true; // Make RFID mode true
}
else // If password is not matched
{
lcd.clear();
lcd.print("Wrong Password");
digitalWrite(buzzerPin, HIGH);
digitalWrite(redLed, HIGH);
send_message("Someone Tried with the wrong Password \nType 'close' to halt the system.");
delay(3000);
digitalWrite(buzzerPin, LOW);
digitalWrite(redLed, LOW);
lcd.clear();
i = 0;
RFIDMode = true; // Make RFID mode true
}
}
}
}
}
// Receiving the message
void receive_message()
{
char incoming_char = 0; //Variable to save incoming SMS characters
String incomingData; // for storing incoming serial data
if (SIM900.available() > 0)
{
incomingData = SIM900.readString(); // Get the incoming data.
delay(10);
}
// if received command is to open the door
if (incomingData.indexOf("open") >= 0)
{
sg90.write(90);
NormalMode = true;
send_message("Opened");
delay(10000);
sg90.write(0);
}
// if received command is to halt the system
if (incomingData.indexOf("close") >= 0)
{
NormalMode = false;
send_message("Closed");
}
incomingData = "";
}
// Function to send the message
void send_message(String message)
{
SIM900.println("AT+CMGF=1"); //Set the GSM Module in Text Mode
delay(100);
SIM900.println("AT+CMGS=\"+XXXXXXXXXXXX\""); // Replace it with your mobile number
delay(100);
SIM900.println(message); // The SMS text you want to send
delay(100);
SIM900.println((char)26); // ASCII code of CTRL+Z
delay(100);
SIM900.println();
delay(1000);
}
Video
Comments