Professional Documents
Culture Documents
By bengchet 12
Arduino Sensor
September 2, 2013
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 board, SM630 fingerprint module, Arduino
Ethernet Shield and other devices such as LCD display shield and RTC (Real Time Clock).
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 1/31
2/27/2018 Attendance Record System – Tutorial by Cytron
1.1 Feature
The objective of this tutorial is to build an example of standalone attendance record system.
Electronic components:
Indicator:
1 x Buzzer-PCB Mount
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 2/31
2/27/2018 Attendance Record System – Tutorial by Cytron
Power System:
1 x diode 1N5822
1 x 25V 220uF cap
1 x 25V 10uF cap
2 x 0.1uF cap
1 x LM7805 voltage regulator
1 x transistor TIP42C
1 x 3R3 resistor
1 x HL2527 DC Plug
connecting wires
Before stacking up, we need build a circuit consists of all necessary systems on prototyping shield.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 3/31
2/27/2018 Attendance Record System – Tutorial by Cytron
For your information, we have been experimenting the built-in power system but it turned out that
current output is not enough for the current project. The use of LCD keypad shield and Ethernet
shield consumes significant amount of current. The external power system is required to provide
additional current.
User can use the sample power system circuit below. This power system can provide up to 8
Amps, and it shouldn’t be a problem to this project.The user can also make their own power
system if it is appropriate.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 4/31
2/27/2018 Attendance Record System – Tutorial by Cytron
In the circuit above, we only connect the 5V from Arduino board to the power system output. User
can connect DC plug voltage output to on board Vin for other uses. Ethernet shield has an
embedded 5V to 3V3 DC power system so for those users who want to use 3V3 applications don’t
need to build another one.
2.22 Indicator
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.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 5/31
2/27/2018 Attendance Record System – Tutorial by Cytron
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.
You can either use jumper wires to connect to the legs of female header pin, or solder 2 wires
onto the board as SDA and SCL wires.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 6/31
2/27/2018 Attendance Record System – Tutorial by Cytron
Connect the SDA wire to pin 20 and SCL to pin21. There should labels for you as guidance.
While inserting battery, make sure the side of battery with “+” sign attached to the
surface of coin cell holder with “+” sign.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 7/31
2/27/2018 Attendance Record System – Tutorial by Cytron
It should be something like photo below if you stack prototyping shield onto Ethernet shield.
Modification 2: Connect pin 4 on prototyping shield to pin A3. We are going to use pin A3 as D4
for LCD.
3.0 Programming
Below is the flow diagram sketch of the designed system. The full sketch can be downloaded here.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 8/31
2/27/2018 Attendance Record System – Tutorial by Cytron
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 as command. After the device receives the data bytes, it will send back a string of bytes
in serial as response. It is our job to do some programming to ‘write’ and ‘read’ these bytes to
determine the outcome of the device.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 9/31
2/27/2018 Attendance Record System – Tutorial by Cytron
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.
Sending command
}
Serial.end();
return success;
}
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.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 13/31
2/27/2018 Attendance Record System – Tutorial by Cytron
_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.
int id = 10;
_cmd (DELETE_FINGERPRINT,id);
_respond(DELETE_FINGERPRINT);
The codes above allows user to delete fingerprint with id 10 if the process is successful.
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.
char* rdFlash(int id,int type,byte num) This function is customized and int id
{ and type are used to determine the
Serial.begin(57600); starting address for the data to be
if(num>128) {msg("too big");return 0;} read. User can modify these 2
parameters. byte num refers to the
byte rd_data[9]; length of data you want to read.
byte checksum = 0;
byte i; Initialise the serial communication.
Same as before, only 128 bytes are
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 15/31
2/27/2018 Attendance Record System – Tutorial by Cytron
y y
allowed to be read at one time.
rd_data[0] = 0x4D;
rd_data[1] = 0x58; Initialise an array to store the bytes to
rd_data[2] = 0x10; be sent to the module and put
rd_data[3] = 0x04; necessary values to each byte to
rd_data[4] = 0x62; initiate reading data from module.
rd_data[5] = ((id-1)*ADDR + type)/256;
rd_data[6] = ((id-1)*ADDR + type)%256; rd_data[5] refers to the high byte of
rd_data[7] = num; address and rd_data[6] refers to low
for(i=0;i<8;i++) checksum+= rd_data[i]; byte of address. User may modify
these 2 lines.
rd_data[8] = checksum;
Serial.write(rd_data,sizeof(rd_data)); send the data bytes to module and
delay(1); waiting for response.
char rx[6];
while(Serial.available()==0){} First response is to check whether it is
packet error or not.
Serial.readBytes(rx,6);
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.
#include <SdFat.h>
#define chipSelect 4 //CS pin for microSD
Sd2Card card;
SdVolume vol;
SdFat sd;
Program Program
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 16/31
2/27/2018 Attendance Record System – Tutorial by Cytron
description
This
function is
to check
SD card
condition
and returns
true value
if card is
detected.
card.init is
to initialise
the card
and vol.init
is to
initialise
the
boolean checkSDCard() accessing
{ volume of
boolean SDCard_status = card.init(SPI_HALF_SPEED,chipSelect); the card.
if (!SDCard_status||!vol.init(&card)) Both
{ functions
//do something here if card is not detected returns
} true if the
process is
uint32_t volumesize= vol.blocksPerCluster()*vol.clusterCount()*512; completed.
uint32_t freespace = 512*vol.freeClusterCount()*vol.blocksPerCluster(); It is
advisable
//check free space available to check
if(freespace==0) these 2
//do something here if memory is full functions
else if(freespace<0.1*volumesize) to see
//do something here if memory is nearly full whether
the card is
detected or
return true; 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
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 17/31
2/27/2018 Attendance Record System – Tutorial by Cytron
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.
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
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 19/31
2/27/2018 Attendance Record System – Tutorial by Cytron
#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;
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 20/31
2/27/2018 Attendance Record System – Tutorial by Cytron
printDigits(hour(tim));
Program Program d
else
{
Time_Display();
}
if(localKey==Select)
{
if(time_update==true)
setTime(hour(),minute(),0,day(),month(),year());
RTC.set(now());
msg("UPDATING TIME");
}
else if(localKey==Left)
{
if(--lcd_pos<0) lcd_pos = 5;
delay(pb_delay);
}
else if(localKey==Right)
{
if(++lcd_pos>5) lcd_pos = 0;
delay(pb_delay);
}
else if(localKey==Up)
{
switch(lcd_pos)
{
case 0: day_update++; if(day_update>31) day_update=1;break;
case 1: month_update++; if(month_update>12) month_update =1;break;
case 2: year_update++; if(year_update>2100) year_update = 2013;break;
case 3: hour_update++;
if(isAM()==1){if(hour_update>11) hour_update =0;}
else if(isPM()==1){if(hour_update>23) hour_update =12;}
time_update = 1;break;
case 4: min_update++;if(min_update>59) min_update =0;
time_update = 1;break;
case 5: if(isAM()==1)hour_update+=12;else hour_update-=12;break;
}
setTime(hour_update,min_update,sec_update,day_update,
month_update,year_update);
Time_Display();
delay(pb_delay);
}
else if(localKey==Down)
{
switch(lcd_pos)
{
case 0: day_update--;if(day_update<1) day_update = 31;break;
case 1: month_update--;if(month_update<1) month_update = 12;break;
case 2: year_update--; if(year_update<2013) year_update = 2013;break;
case 3: hour_update--;
if(isAM()==1){if(hour_update<0) hour_update =11;}
else if(isPM()==1) {if(hour_update<12) hour_update =23;}
time_update = 1;break;
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 22/31
2/27/2018 Attendance Record System – Tutorial by Cytron
In this project we also create a menu interface for fingerprint teaching process and time setup and
Below is the sample code of a simple interface.
//global variables for admin menu and interface To use this interfa
byte choice[2]; user just need to kn
byte page_no; how many options th
needed to be created
void admin() the menu. Let say if
{ options are neede
int category = 0; change the value
int page = 0; page_no in vo
int localKey; selection() to
Page_no determin
how many options y
selection(category,page);// display first page want to set in t
while(1) menu.
{
if(reset_)
{ In void menu(), it is
user to design the pa
category-=1; for each menu optio
page = choice[category]; The most common w
selection(category,page); is to display the title
reset_=false; the menu.
}
localKey = keypad.getKey(); In void selectio
under case 1, user c
switch(localKey) add extra functions th
{ dedicated
case Left: page--; choice[category], l
if(page<0) page = 0; “else
else if(page>page_no-1) page = page_no-1; if(choice[category]==
selection(category,page); {delay(pb_delay);//ad
delay(200); function here
break; choice[category] is t
menu option y
case Right: page++; selected, if you choo
if(page<0) page = 0; first menu optio
else if(page>page_no-1) page = page_no-1; choice[category] will
selection(category,page); 0, then you can execu
delay(200); whatever function y
want in this menu.
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 23/31
2/27/2018 Attendance Record System – Tutorial by Cytron
break;
case Select:
choice[++category] = page;
choice[category-1] = choice[category];
lcd.clear();
selection(category,page);
delay(200);
break;
case 1:
if(choice[category]==0){delay(pb_delay);//add function here}
else if(choice[category]==1){delay(pb_delay);//add function here}
else if(choice[category]==2){delay(pb_delay);//add function here}
else if(choice[category]==3){delay(pb_delay);//add function here}
else if(choice[category]==4){delay(pb_delay);//add function here}
//user can add more function here
reset_ = true;
break;
}
}
void menu(int page){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Menu ");
lcd.print(page+1);lcd.print(":");
switch(page)
{
case 0: //customise first page// break;
case 1: //customise second page// break;
case 2: //customise third page// break;
case 3: //customise forth page// break;
case 4: //customise fifth page// break;
//user can add more here
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 24/31
2/27/2018 Attendance Record System – Tutorial by Cytron
}
}
All the codes above are just part of the full source code and are taken as guidance for user to learn
After you have finished programming and everything else, just plug in DC adapter (to DC plug you
If you are not sure whether the power system works, just use multimeter to measure the voltage a
If everything is on, you are not done yet. Fingerprint and RTC module are new and you need to do
Fingerprint module now is free of data (except for its own ID and logo). You can teach it to read an
If you are interested, you can make a container for the system. Nicer look and more 'professional'!
5.0 Precautions
After you run the system for a while, you will find that the power system is quite warm. Don't worr
That's all! Hope you can enjoy it to develop your own attendance record system. There
Attachment:
- Attendance System
BUY
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 25/31
2/27/2018 Attendance Record System – Tutorial by Cytron
Fingerprint Reader
SHIELD-LCD
RTC Module
Ethernet Shield
Prototyping Shield
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 26/31
2/27/2018 Attendance Record System – Tutorial by Cytron
Arduino Mega
RELATED POSTS
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 27/31
2/27/2018 Attendance Record System – Tutorial by Cytron
COMMENTS (12)
HANI
November 28, 2013 at 3:55 pm
SALEH
February 28, 2014 at 5:34 am
how to retrieve the fingers IDs and it’s time to be used in other application on PC
MANUAKKU
September 11, 2014 at 2:30 pm
i’m using arduino due and finger print module FPS_GT511C3,,can i use this code.what else i
have to do?
SHAILESH KUKANA
September 15, 2014 at 4:45 pm
Shall we complete same project and some modification in the code with AT89S51
IRFAN JUNAID
February 7, 2015 at 11:04 pm
Read flash
Write flash
https://tutorial.cytron.io/2013/09/02/attendance-record-system/ 31/31