Attendance Record System

I have been given a task to build an attendance system for staff. The requirements are quite straight-forward. It needs to be standalone (without computer), fingerprint is preferred, record real time and the record should be in SD card.

1.0 Introduction

There has been various kinds of attendance record system in the market, RFID-based, fingerprint scanning-based and barcode-based, etc. Talking about this attendance system, you may think that it is quite complex and hard to build it. However, after you read this article, you may change your perception. In this tutorial, we are going to demonstrate how to make a simple attendance system using Cytron current on-sale product including Arduino Mega board, SM630 fingerprint module, Breakout Board Micro SD and other devices such as LCD display shield and RTC (Real Time Clock).

1.1 Feature

The objective of this tutorial is to build an example of standalone attendance record system.

In this project, we add a buzzer in the system to indicate the completion of attendance record process. For example, one beep sound indicates login success and 2 beep sounds means logout. If there are 3 beep sounds, error occurs such as improper installation of microSD card, unfound employee fingerprint, etc.

In the circuit, user just needs to connect one leg (longer leg) of buzzer to 5V and another to GND.

User can customize their own indicator systems. User can even include some visual indicatiors like LEDs.

2.23 Fingerprint Module UART Connection

The figure below shows the connection between the connector and Arduino prototyping shield.

2.24 RTC module

User can either directly solder the module to prototyping shield or solder a 5 pin or 6 pin header on the shield for easy removal of the module like we did. This RTC module stores current time information with the power of a coin cell lithium battery.

Note**: Removal of the battery will instantly erase the information stored and reset the time. Handle with care!

We are going to use 4 pins only :VCC, SCL, SDA and GND. Leave others as not connected.

While inserting battery, make sure the side of battery with “+” sign attached to the surface of coin cell holder with “+” sign.

3.0 Programming

Below is the flow diagram sketch of the designed system. The full sketch can be downloaded here.

Basically the programming involves 4 major parts:

fingerprintscanning process and teaching process

information storing and accessing with fingerprint module and micro SD,

time settings and display

menu interface for time setup, fingerprint teaching ,etc.

i) FINGERPRINT SCANNING AND TEACHING

How does SM630 Fingerprint module work? It is using packet data communication. If we wants the module to carry out some operations, we need to send a string of bytes in serial to the device ascommand. After the device receives the data bytes, it will send back a string of bytes in serial asresponse. It is our job to do some programming to ‘write’ and ‘read’ these bytes to determine the outcome of the device.

Generally the communication packet includes the following:

packet head – 2 bytes

packet flag – 1 byte

packet length – 1 byte

packet content – N bytes

checksum – 1 byte

Let say we want to add fingerprint at position(id) 2, what should we send?

checksum : 0xFA (low byte of total sum from packet head to packet content data)

So we should send a string of data bytes {0x4D,0x58,0x01,0x03,0x40,0x00,0x02,0xFA} in serial to the fingerprint module.

This is just a brief explanation on the working principle of fingerprint module. To know more details on how to communicate with the module and execute other functions, user can refer to the SM630 Fingerprint Module User’s Manual.

Below is the sample code of sending command and receive response. This sample code is not optimized to full functionality. User can play around to add in more functions or modify the program for the best performance.

byte cmd refers to which command the user wants to execute.For example: if user wants to add fingerprint, cmd should be 0x40. int number refers to fingerprint id(position) in the module. If the command doesn’t require id number, just put any number.

The command should not be sent if id/position is more than 767 (the module can only store up to the 768 fingerprints only), or else you will receive parameter error from device.

Initialize the serial communication at baud rate 57600 as stated in user manual.

packet_content will be determined by the cmd value you just inserted. Most of the command has packet content length of 3 bytes. Search fingerprint and empty database are the exceptions.

Determine high byte and low byte of the id number.

Declare an array of bytes with variable size to be sent to module and initialize it.

Start putting appropriate values to the array. 0x4D as first byte, 0x58 as second byte and so forth. Please refer to fingerprint module user manual to verify the correctness of packet data.

Calculate the checksum for first time.

If the packet content length equal or more than 3 bytes, add high byte of number as 5th byte and low byte as 6th byte. Calculate the checksum. Take note that commands with packet content length less than 3 bytes will not go through this part.

If the command is search fingerprint command, shift value from 5th byte to 7th byte and 6th byte to 8th byte. Now 5th byte and 6th byte should be replaced with high byte and low byte of a number respectively where this number is the number that module will start searching from. Here we put 0 in both bytes, thus searching will start from 0. Recalculate the checksum.

addfp_count – this variable is made for adding fingerprint process. Adding fingerprint process requires 2 responses to be successful. addfp_count determines when the function ends.

Create a temporary array for received packets. Initialise the array with the size of 9.

Read and store the received bytes. When 4th byte is read, total data packet length is determined.

Determine high byte and low byte of the id number.

Declare an array of bytes with variable size to be sent to module and initialize it.

In attendance system, search fingerprint command is constantly sent to module. If there is no finger on screen within about 10 secs, time out response will be received. Before this response is received, the program will continue in this loop(red highlighted). And also once the command is sent, fingerprint module will not receive any other commands and do anything until the response for the current command is given out. Therefore user can put in some functions like time display.

Check the 6th byte of received data and carry out functions according to response code

//add something here is the place where you can put your own functions like light up LED, make beep sound from buzzer or display words on LCD

this function is boolean/bool type, which returns value of success. User may modify the function to any appropriate types and return something in which user think is useful for next operation. User may change to void type to return nothing.

If search fingerprint is successful, 6th and 7th bytes will be the id number that module returns for corresponding fingerprint. User may want to define a variable to store the number. In this tutorial, we declare a global variableworker_id to store the number.

Fingerprint Searching

These 2 functions allows user to carry out fingerprint searching and teaching process. If user wants to start searching process, user can write the following lines in the program.

_cmd (SEARCH_FINGERPRINT,100); _respond(SEARCH_FINGERPRINT);

These lines send a command to the module to search for matching fingerprint designated from id 0 to 100 and gives appropriate response.

Fingerprint Teaching

For fingerprint teaching process like adding fingerprint, user may write the following codes

int id = 10; _cmd (ADD_FINGERPRINT,id); _respond(ADD_FINGERPRINT);

The codes above allows user to add fingerprint with id 10 if the response indicates the process is successful. You can check the response from _respond function. You can also write a program to select a value for int id so you can add fingerprint with any id number less than 768. You can utilise the navigation buttons on LCD keypad shield to do so.

The code for deleting fingerprint is almost similar to adding fingerprint:

The codes above allows user to delete fingerprint with id 10 if the process is successful.

ii) INFORMATION STORING AND ACCESSING

Write and read info using SM630 fingerprint module

SM630 fingerprint module has 64K bytes user flash memory to store necessary information. It can serve as extra storage if user knows how to utilise this function. Below are the sample codes on how to write strings data into fingerprint flash memory and read data from it.

This function is customized and int id and type are used to determine the address for the data to be stored. User can modify these 2 parameters.

Initialise the serial communication and convert string to char array.

According to user manual, only 128 bytes are allowed to be written at one time.

Initialise an array to store the bytes to be sent to the module and put necessary values to each byte.

wr_data[5] refers to the high byte of address and wr_data[6] refers to low byte of address. User may modify these 2 lines.

send the data bytes to module and waiting for response.

First response is to check whether it is packet error or not.

Second response is to check whether writing data to memory is successful or not.

Take note**: 1 address only stores 1 byte of data. Let say you want to store “Cytron” string, 7 consecutive addresses are needed (including null character). In this function you only have to send the starting address to the module. If you want to store multiple data, consider to plan the address properly or else you will find the data overlapped.

This function is customized and int id and type are used to determine the starting address for the data to be read. User can modify these 2 parameters. byte num refers to the length of data you want to read.

Initialise the serial communication. Same as before, only 128 bytes are allowed to be read at one time.

Initialise an array to store the bytes to be sent to the module and put necessary values to each byte to initiate reading data from module.

rd_data[5] refers to the high byte of address and rd_data[6] refers to low byte of address. User may modify these 2 lines.

send the data bytes to module and waiting for response.

First response is to check whether it is packet error or not.

Second response from module contains the data bytes the user requests from address. User can create a variable to store these data bytes. Here we declare function as char array type and will return the data if the function ends. User can modify the function type to suit their application.

Note**: the only thing you have to care about is the num value. Make sure that you know the size of the data you want to read. Let say you want to read “Ahmad” from module you can set num = 8, 6 for the data(including null terminator) and 2 for extra length.

Write and read info using micro SD

There are a few things you have to do before you proceed.

First you have to make sure pin 4 and pin 10 from Ethernet Shield is not connected with the same pins of LCD Keypad Shield. If you haven’t modified and disconnected these pins, you may refer to the instructions shown in 2.3 Hardware Setup.

Second, please include the latest SD library in your Arduino library directory. The file can be found and downloaded at the end of this tutorial. In this tutorial we are using this library.

Below are the sample codes for accessing,writing and reading data from micro SD.

This function is to check SD card condition and returns true value if card is detected.

card.init is to initialize the card and vol.init is to initialize the accessing volume of the card. Both functions returns true if the process is completed. It is advisable to check these 2 functions to see whether the card is detected or not.

In this function, calculation of total volume size and free space available is included. User can use this to check the availability of the card to store data.

Write/Store data to microSD

This is the example on how we store employee’s login and logout information in our company. User may modify it to suit their application.

This function is to store strings to a file in microSD. String dataString is the employee’s login and logout string info ready to be stored.

Highlighted lines are the codes to convert string to const char* type. This string is the target filename.

If the file doesn’t exist, create a new one. FunctiondateTimeCallback(dateTime) is to detemine the time when the file is created, so that when user is accessing the file using computer or other devices, he or she can see the proper created time and date for the file. If this function is not called, the date will be incorrect. This function is only working with the installation of RTC_module.

O_WRITE only in file open will cause the data in existing file to be overwritten. To store data without overwritting the existing data, useO_WRITE|O_APPEND instead.

This function is to read employees’ info from a file named “admin.csv” in microSD.

dataFile.read() reads character by character. If no data can’t be read(at the end of file), data will be < 0.

This function also implements wrFlash function. The data read will be stored in fingerprint module flash memory.

An temporary array with size 5 is declared to store worker’s data, one for one type (although only 3 types to be stored).

The file read is in CSV format (comma separated), thus this algorithm uses comma to separate read data and store into different array.

If next line is reached, the arrays are reset so that new data can be stored. next line will be indicated by int data 13(carriage return)and 10(new line feed). User can refer to ASCII code table.

There is also a SD library function call fgets() which reads line by line. In this project some of the functions implement this. User can have a guide.

iii) TIME SETTINGS AND DISPLAY

Include the libraries below in your program. DS3231 RTC module is almost similar to DS1307 RTC and both chip are I2C devices and have the same working principle. Thus DS1307 library can be used for this project. Wire.h is for I2C configuration, LiquidCrystal.h is for LCD display and LCD_Key.h is for LCD Keypad button.

#include <Time.h> #include <DS1307RTC.h> #include <Wire.h> #include <LiquidCrystal.h> #include <LCD_Key.h> //define keycode #define None 0 #define Select 1 #define Left 2 #define Up 3 #define Down 4 #define Right 5 LiquidCrystal lcd(8, 9, A3, 5, 6, 7); LCD_Key keypad; Setup – Sync the system time with RTC void setup() { …………………// lcd.begin(16,2); Wire.begin(); setSyncProvider(RTC.get); //……………….. } Remember to include setSyncProvider(RTC.get) in void setup() to synchronize the system time with RTC time. In this project, we are actually using the system time from Arduino to do time-critical application. Time.h library will handle this job for us and give us specific details about the time like year,month,day,week day, hour, minute and second. Without RTC sync, the system time will reset after the system is off even though we have set it to the right time. Current Time Display

This function is to change and set the current time and update the time to RTC module. This function implements LCD display function and LCD navigation buttons from LCD_Key.h library.

In this program, left and right buttons are used to switch to specific type like day, month,year,hour,minute and AM/PM. Up and down buttons are used to change the value. Select button is to update the set time to RTC module.

Highlighted part is to blink the time type user current choose to change and serves as indicator

pb_delay is delay time set. Here pb_delay = 200;

iv) MENU INTERFACE In this project we also create a menu interface for fingerprint teaching process and time setup and it requires navigation buttons on LCD Keypad Shield. Below is the sample code of a simple interface.

To use this interface, user just need to know how many options that needed to be created in the menu. Let say if 4 options are needed, change the value of page_no in void selection() to 4. Page_no determines how many options you want to set in the menu.

In void menu(), it is for user to design the page for each menu option. The most common way is to display the title of the menu.

In void selection() under case 1, user can add extra functions that dedicated to choice[category], like “else if(choice[category]==5){delay(pb_delay);//add function here}”. choice[category] is the menu option you selected, if you choose first menu option, choice[category] will be 0, then you can execute whatever function you want in this menu.

In void RTC set(),it is reset time.

All the codes above are just part of the full source code and are taken as guidance for user to learn how the system works. In order for whole project to run, you can download sample full source code at the end of this tutorial.4.0 Nearly finish… After you have finished programming and everything else, just plug in DC adapter (to DC plug you soldered, not that from Arduino main board) and turn on the power. If you are not sure whether the power system works, just use multimeter to measure the voltage at pin 5V. The voltage should be 5V. If everything is on, you are not done yet. Fingerprint and RTC module are new and you need to do something. As for RTC module, you will find that the date shown on LCD display will be different from current time ( should be 01-01-00). All you need to to do is go to time setup (I believe you have made a way to reach that menu and it is advisable to remove any verification process first for easy setup) and set up your time. If you have done this before finishing this project, then just skip it. Fingerprint module now is free of data (except for its own ID and logo). You can teach it to read and store fingerprints or any information you want to store in the module. If you are interested, you can make a container for the system. Nicer look and more ‘professional’! The container we are using is the unwanted power supply casing. Now your attendance system is ready to serve!!! 5.0 Precautions After you run the system for a while, you will find that the power system is quite warm. Don’t worry too much about the heat, components can withstand it. But of course don’t bake up the whole thing by putting it in warm place or in a small closed container. Getting the board too hot will probably damage the thing and resetting the system rapidly. Put the system in cool place or place with open air. That’s all! Hope you can enjoy it to develop your own attendance record system. There are so much more to learn and explore its possible potentials. Have fun! 😎 Attachment: – Attendance System -Library