|
499Adafruit Industries LLC
|
x 1 | |
|
ESP-WROOM-32 |
x 1 |
|
DiptraceDiptrace
|
RFID BASED STUDENTS ATTENDENCE MONITORING SYSTEM
In classrooms, time is wasted in roll calls as it is done manually. In this proposed system, authorized student is given an RFID tag. By placing their RFID tags on the reader, students or workers can immediately verify their attendance. Thus, the data stored in this card is referred as the identification/attendance of the person. Once the student places the card in front of the RFID card reader, it reads the data and verifies it with the data stored.And the buzzer beeps while scanning the RFID tag. If the data matches, then it displays a message on the LCD confirming the entry of that student else displays a message denying the attendance. The status of a student’s attendance can be retrieved from this system by pressing the status button interfaced to the microcontroller. Finally, his/her data with date and time is stored in a google sheet. This particular google sheet show the date, time and the stored data in the RFID tag. Hence, a lot of time is saved as all the students attendance is directly stored in the data base. It will produce a real time attendance monitoring system that can be accessed by various parties, such as lecturer, campus administration and parents.
#include <SPI.h>
#include <MFRC522.h>
//--------------------------------------------------
//GPIO 0 --> D3
//GPIO 2 --> D4
const uint8_t RST_PIN = D3;
const uint8_t SS_PIN = D4;
int BUZZER = 2;
//--------------------------------------------------
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
//--------------------------------------------------
/* Be aware of Sector Trailer Blocks */
int blockNum = 4;
byte block_data[16];
/* Create array to read data from Block */
/* Length of buffer should be 4 Bytes
more than the size of Block (16 Bytes) */
byte bufferLen = 18;
byte readBlockData[18];
//--------------------------------------------------
MFRC522::StatusCode status;
//--------------------------------------------------
void setup()
{
//------------------------------------------------------
//Initialize serial communications with PC
Serial.begin(9600);
//------------------------------------------------------
//Initialize SPI bus
SPI.begin();
//------------------------------------------------------
//Initialize MFRC522 Module
mfrc522.PCD_Init();
Serial.println("Scan a MIFARE 1K Tag to write data...");
//------------------------------------------------------
}
/****************************************************************************************************
* loop() function
****************************************************************************************************/
void loop()
{
//------------------------------------------------------------------------------
/* Prepare the ksy for authentication */
/* All keys are set to FFFFFFFFFFFFh at chip delivery from the factory */
for (byte i = 0; i < 6; i++){
key.keyByte[i] = 0xFF;
}
//------------------------------------------------------------------------------
/* Look for new cards */
/* Reset the loop if no new card is present on RC522 Reader */
if ( ! mfrc522.PICC_IsNewCardPresent()){return;}
//------------------------------------------------------------------------------
/* Select one of the cards */
if ( ! mfrc522.PICC_ReadCardSerial()) {return;}
//------------------------------------------------------------------------------
Serial.print("\n");
Serial.println("**Card Detected**");
/* Print UID of the Card */
Serial.print(F("Card UID:"));
for (byte i = 0; i < mfrc522.uid.size; i++){
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.print("\n");
/* Print type of card (for example, MIFARE 1K) */
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
------------------------------------------------------------------------------
blockNum =4;
toBlockDataArray("211EC206"); //ID
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =5;
toBlockDataArray("Madhumithra"); //First Name
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =6;
toBlockDataArray("S"); //Last Name
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =8;
toBlockDataArray("Shanmugavel.M"); //Father Name
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =9;
toBlockDataArray("24-09-2003"); //Date of Birth
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =10;
toBlockDataArray("8526267629"); //Phone Number
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
blockNum =12;
toBlockDataArray("Pollachi"); //Address
WriteDataToBlock(blockNum, block_data);
ReadDataFromBlock(blockNum, readBlockData);
dumpSerial(blockNum, readBlockData);
// tone(BUZZER, 1000, 1000);
}
/****************************************************************************************************
* Writ() function
****************************************************************************************************/
void WriteDataToBlock(int blockNum, byte blockData[])
{
Serial.print("Writing data on block ");
Serial.print(blockNum);
//------------------------------------------------------------------------------
/* Authenticating the desired data block for write access using Key A */
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK){
Serial.print("Authentication failed for Write: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//------------------------------------------------------------------------------
else {
Serial.println("Authentication success");
}
//------------------------------------------------------------------------------
/* Write data to the block */
status = mfrc522.MIFARE_Write(blockNum, blockData, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print("Writing to Block failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else
{Serial.println("Data was written into Block successfully");}
//------------------------------------------------------------------------------
}
/****************************************************************************************************
* ReadDataFromBlock() function
****************************************************************************************************/
void ReadDataFromBlock(int blockNum, byte readBlockData[])
{
Serial.print("Reading data from block ");
Serial.println(blockNum);
//------------------------------------------------------------------------------
/* Authenticating the desired data block for Read access using Key A */
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
//------------------------------------------------------------------------------
if (status != MFRC522::STATUS_OK){
Serial.print("Authentication failed for Read: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else {
Serial.println("Authentication success");
}
//------------------------------------------------------------------------------
/* Reading data from the Block */
status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
if (status != MFRC522::STATUS_OK){
Serial.print("Reading failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else {
Serial.println("Block was read successfully");
}
//------------------------------------------------------------------------------
}
/****************************************************************************************************
* dumpSerial() function
****************************************************************************************************/
void dumpSerial(int blockNum, byte blockData[])
{
Serial.print("\n");
Serial.print("Data in Block:");
Serial.print(blockNum);
Serial.print(" --> ");
for (int j=0 ; j<16 ; j++){
Serial.write(readBlockData[j]);
}
Serial.print("\n");Serial.print("\n");
}
/****************************************************************************************************
* dumpSerial() function
****************************************************************************************************/
void toBlockDataArray(String str)
{
byte len = str.length();
if(len > 16) len = 16;
for (byte i = 0; i < len; i++) block_data[i] = str[i];
for (byte i = len; i < 16; i++) block_data[i] = ' ';
}
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <MFRC522.h>
#include <HTTPSRedirect.h>
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//---------------------------------------------------------------------------------------------------------
// Enter Google Script Deployment ID:
const char *GScriptId = "AKfycbwTtq4rcL8zUaB8rjExY9KYo26q_n0hVqkiEdjS9YEBtfRg5C80OWvEVK2Hv5YUEj8ivw";
//---------------------------------------------------------------------------------------------------------
// Enter network credentials:
const char* ssid = "ECE";
const char* password = "62806280";
//---------------------------------------------------------------------------------------------------------
// Enter command (insert_row or append_row) and your Google Sheets sheet name (default is Sheet1):
String payload_base = "{\"command\": \"insert_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
String payload = "";
//---------------------------------------------------------------------------------------------------------
// Google Sheets setup (do not edit)
const char* host = "script.google.com";
const int httpsPort = 443;
const char* fingerprint = "";
String url = String("/macros/s/") + GScriptId + "/exec";
HTTPSRedirect* client = nullptr;
//------------------------------------------------------------
// Declare variables that will be published to Google Sheets
String student_id;
//------------------------------------------------------------
int blocks[] = {4,5,6,8,9, 10, 12};
#define total_blocks (sizeof(blocks) / sizeof(blocks[0]))
//------------------------------------------------------------
#define RST_PIN 0 //D3
#define SS_PIN 2 //D4
#define BUZZER 4 //D2
//------------------------------------------------------------
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
MFRC522::StatusCode status;
//------------------------------------------------------------
/* Be aware of Sector Trailer Blocks */
int blockNum = 2;
/* Create another array to read data from Block */
/* Legthn of buffer should be 2 Bytes more than the size of Block (16 Bytes) */
byte bufferLen = 18;
byte readBlockData[18];
//------------------------------------------------------------
/****************************************************************************************************
* setup Function
****************************************************************************************************/
void setup() {
//----------------------------------------------------------
Serial.begin(9600);
delay(10);
Serial.println('\n');
//----------------------------------------------------------
SPI.begin();
//----------------------------------------------------------
//initialize lcd screen
lcd.init();
// turn on the backlight
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Connecting to");
lcd.setCursor(0,1); //col=0 row=0
lcd.print("WiFi...");
//----------------------------------------------------------
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.print(ssid); Serial.println(" ...");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
//----------------------------------------------------------
// Use HTTPSRedirect class to create a new TLS connection
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
client->setPrintResponseBody(true);
client->setContentTypeHeader("application/json");
//----------------------------------------------------------
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Connecting to");
lcd.setCursor(0,1); //col=0 row=0
lcd.print("Google ");
delay(5000);
//----------------------------------------------------------
Serial.print("Connecting to ");
Serial.println(host);
//----------------------------------------------------------
// Try to connect for a maximum of 5 times
bool flag = false;
for(int i=0; i<5; i++){
int retval = client->connect(host, httpsPort);
//*************************************************
if (retval == 1){
flag = true;
String msg = "Connected. OK";
Serial.println(msg);
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print(msg);
delay(2000);
break;
}
//*************************************************
else
Serial.println("Connection failed. Retrying...");
//*************************************************
}
//----------------------------------------------------------
if (!flag){
//____________________________________________
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Connection fail");
//____________________________________________
Serial.print("Could not connect to server: ");
Serial.println(host);
delay(5000);
return;
//____________________________________________
}
//----------------------------------------------------------
delete client; // delete HTTPSRedirect object
client = nullptr; // delete HTTPSRedirect object
//----------------------------------------------------------
}
/****************************************************************************************************
* loop Function
****************************************************************************************************/
void loop() {
//----------------------------------------------------------------
static bool flag = false;
if (!flag){
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
flag = true;
client->setPrintResponseBody(true);
client->setContentTypeHeader("application/json");
}
if (client != nullptr){
if (!client->connected())
{client->connect(host, httpsPort);}
}
else{Serial.println("Error creating client object!");}
//----------------------------------------------------------------
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Scan your Tag");
/* Initialize MFRC522 Module */
mfrc522.PCD_Init();
/* Look for new cards */
/* Reset the loop if no new card is present on RC522 Reader */
if ( ! mfrc522.PICC_IsNewCardPresent()) {return;}
/* Select one of the cards */
if ( ! mfrc522.PICC_ReadCardSerial()) {return;}
/* Read data from the same block */
Serial.println();
Serial.println(F("Reading last data from RFID..."));
//----------------------------------------------------------------
String values = "", data;
/*
//creating payload - method 1
//----------------------------------------------------------------
ReadDataFromBlock(blocks[0], readBlockData); //student id
data = String((char*)readBlockData); data.trim();
student_id = data;
//----------------------------------------------------------------
ReadDataFromBlock(blocks[1], readBlockData); //first name
data = String((char*)readBlockData); data.trim();
first_name = data;
//----------------------------------------------------------------
ReadDataFromBlock(blocks[2], readBlockData); //last name
data = String((char*)readBlockData); data.trim();
last_name = data;
//----------------------------------------------------------------
ReadDataFromBlock(blocks[3], readBlockData); //phone number
data = String((char*)readBlockData); data.trim();
phone_number = data;
//----------------------------------------------------------------
ReadDataFromBlock(blocks[4], readBlockData); //address
data = String((char*)readBlockData); data.trim();
address = data; data = "";
//----------------------------------------------------------------
values = "\"" + student_id + ",";
values += first_name + ",";
values += last_name + ",";
values += phone_number + ",";
values += address + "\"}";
//----------------------------------------------------------------*/
//creating payload - method 2 - More efficient
for (byte i = 0; i < total_blocks; i++) {
ReadDataFromBlock(blocks[i], readBlockData);
//*************************************************
if(i == 0){
data = String((char*)readBlockData);
data.trim();
student_id = data;
values = "\"" + data + ",";
}
//*************************************************
else if(i == total_blocks-1){
data = String((char*)readBlockData);
data.trim();
values += data + "\"}";
}
//*************************************************
else{
data = String((char*)readBlockData);
data.trim();
values += data + ",";
}
}
//----------------------------------------------------------------
// Create json object string to send to Google Sheets
// values = "\"" + value0 + "," + value1 + "," + value2 + "\"}"
payload = payload_base + values;
//----------------------------------------------------------------
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Publishing Data");
lcd.setCursor(0,1); //col=0 row=0
lcd.print("Please Wait...");
//----------------------------------------------------------------
// Publish data to Google Sheets
Serial.println("Publishing data...");
Serial.println(payload);
if(client->POST(url, host, payload)){
// do stuff here if publish was successful
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Student ID: "+student_id);
lcd.setCursor(0,1); //col=0 row=0
lcd.print("Present");
}
//----------------------------------------------------------------
else{
// do stuff here if publish was not successful
Serial.println("Error while connecting");
lcd.clear();
lcd.setCursor(0,0); //col=0 row=0
lcd.print("Failed.");
lcd.setCursor(0,1); //col=0 row=0
lcd.print("Try Again");
}
//----------------------------------------------------------------
// a delay of several seconds is required before publishing again
delay(5000);
tone(BUZZER, 1000, 1000);
}
/****************************************************************************************************
*
****************************************************************************************************/
/****************************************************************************************************
* ReadDataFromBlock() function
****************************************************************************************************/
void ReadDataFromBlock(int blockNum, byte readBlockData[])
{
//----------------------------------------------------------------------------
/* Prepare the ksy for authentication */
/* All keys are set to FFFFFFFFFFFFh at chip delivery from the factory */
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
//----------------------------------------------------------------------------
/* Authenticating the desired data block for Read access using Key A */
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
//----------------------------------------------------------------------------s
if (status != MFRC522::STATUS_OK){
Serial.print("Authentication failed for Read: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//----------------------------------------------------------------------------
else {
Serial.println("Authentication success");
}
//----------------------------------------------------------------------------
/* Reading data from the Block */
status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
if (status != MFRC522::STATUS_OK) {
Serial.print("Reading failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//----------------------------------------------------------------------------
else {
readBlockData[16] = ' ';
readBlockData[17] = ' ';
Serial.println("Block was read successfully");
}
//----------------------------------------------------------------------------
}
RFID BASED STUDENTS ATTENDENCE MONITORING SYSTEM
*PCBWay community is a sharing platform. We are not responsible for any design issues and parameter issues (board thickness, surface finish, etc.) you choose.
- Comments(0)
- Likes(0)
- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by Engineer
-
-
-
kmMiniSchield MIDI I/O - IN/OUT/THROUGH MIDI extension for kmMidiMini
123 0 0 -
DIY Laser Power Meter with Arduino
172 0 2 -
-
-
Box & Bolt, 3D Printed Cardboard Crafting Tools
162 0 2 -