- Các thành phần bắt buộc
- Sơ đồ mạch
- Cách thức hoạt động của Hệ thống chấm công bằng vân tay
- Code Explanation
Theo các nhà nghiên cứu từ Đại học Pen State, con người có xu hướng tin tưởng vào máy móc hơn là con người, điều này có thể thấy rõ là chúng ta để lộ mã pin ATM của mình vào máy một cách dễ dàng. Ngày nay, trong thế giới mà AI, Machine learning, Chat bot, Smart Speakers, Robots, v.v. đang tích cực phát triển, sức mạnh tổng hợp giữa con người và robot chỉ có thể tăng lên. Ngày nay, từ nhân viên thu phí qua cầu đến thu ngân thanh toán, mọi thứ xung quanh chúng ta đều được thay thế bằng máy móc để hoàn thành công việc dễ dàng và hiệu quả hơn. Để theo kịp giai đoạn này, trong dự án này, chúng tôi sẽ xây dựng một hệ thống Chấm công bằng hệ thống đo lường sinh học sử dụng vi điều khiển AVR để thay thế cho quy trình điểm danh thủ công. Hệ thống này sẽ đáng tin cậy và hiệu quả hơn vì nó sẽ tiết kiệm thời gian và tránh bị kẻ gian.
Hệ thống chấm công bằng vân tay đã có sẵn trực tiếp từ thị trường, nhưng còn gì thú vị hơn việc xây dựng một hệ thống? Chúng tôi cũng đã xây dựng nhiều Hệ thống chấm công trước đó từ hệ thống chấm công đơn giản dựa trên RFID đến hệ thống chấm công sinh trắc học dựa trên IoT sử dụng Arduino và Raspberry Pi. Trong dự án này, chúng tôi đã sử dụng Mô-đun vân tay và AVR (atmega32) để đăng ký tham dự. Bằng cách sử dụng cảm biến vân tay, hệ thống sẽ trở nên an toàn hơn cho người dùng. Các phần sau giải thích các chi tiết kỹ thuật của việc tạo Hệ thống chấm công sinh trắc học dựa trên dấu vân tay bằng AVR.
Các thành phần bắt buộc
- Atmega32 -1
- Mô-đun vân tay (r305) -1
- Nút nhấn hoặc nút màng - 4
- Đèn LED -2
- Điện trở 1K -2
- Điện trở 2,2K -1
- Bộ đổi nguồn 12v
- Kết nối dây
- Buzzer -1
- 16x2 LCD -1
- PCB hoặc Bread Board
- Mô-đun RTC (ds1307 hoặc ds3231) -1
- LM7805 -1
- Tụ 1000uf, 10uf -1
- Burgstips nam nữ
- DC JACK (tùy chọn)
- Bóng bán dẫn BC547 -1
Trong mạch hệ thống chấm công bằng vân tay này, chúng tôi đã sử dụng mô-đun Cảm biến vân tay để xác thực danh tính của một người hoặc nhân viên bằng cách lấy đầu vào là dấu vân tay của họ trong hệ thống. Ở đây chúng tôi đang sử dụng 4 nút nhấn để đăng ký, Xóa, Tăng và Giảm dữ liệu in bằng ngón tay . Khóa 1 được sử dụng để đăng ký một người mới vào hệ thống. Vì vậy, khi người dùng muốn đăng ký một ngón tay mới, họ cần nhấn phím 1 sau đó màn hình LCD sẽ yêu cầu họ đặt ngón tay lên cảm biến vân tay hai lần sau đó yêu cầu ID nhân viên. Tương tự, phím 2 có chức năng kép, như khi người dùng đăng ký ngón tay mới, sau đó họ cần chọn ID in ngón taybằng cách sử dụng hai phím khác là 3 và 4. Bây giờ người dùng cần nhấn phím 1 (lúc này phím này hoạt động giống như OK) để tiếp tục với ID đã chọn. Và phím 2 cũng được sử dụng để thiết lập lại hoặc xóa dữ liệu khỏi EEPROM của vi điều khiển.
Mô-đun cảm biến vân tay ghi lại hình ảnh in của ngón tay và sau đó chuyển đổi nó thành mẫu tương đương và lưu chúng vào bộ nhớ của nó theo ID được chọn bởi vi điều khiển. Tất cả quá trình được chỉ huy bởi bộ vi điều khiển, giống như chụp ảnh dấu tay; chuyển đổi nó thành các mẫu và lưu trữ dưới dạng ID, v.v. Bạn cũng có thể xem các dự án cảm biến vân tay khác này, nơi chúng tôi đã xây dựng hệ thống bảo mật cảm biến vân tay và máy bỏ phiếu cảm biến vân tay.
Sơ đồ mạch
Sơ đồ mạch hoàn chỉnh cho dự án hệ thống chấm công dựa trên dấu vân tay, được hiển thị bên dưới. Nó có vi điều khiển Atmega32 để kiểm soát tất cả các quá trình của dự án. Nút nhấn hoặc nút màng được sử dụng để đăng ký, xóa, chọn ID để tham dự, bộ rung được sử dụng để chỉ báo và màn hình LCD 16x2 để hướng dẫn người dùng cách sử dụng máy.
Như thể hiện trong sơ đồ mạch, các nút nhấn hoặc màng được kết nối trực tiếp với chân PA2 (phím ENROLL 1), PA3 (phím DEL 2), PA0 (phím LÊN 3), PA1 (phím XUỐNG 4) của vi điều khiển so với mặt đất hoặc PA4. Và một đèn LED được kết nối tại chân PC2 của vi điều khiển đối với mặt đất thông qua một điện trở 1k. Rx và Tx của module vân tay kết nối trực tiếp tại chân nối tiếp PD1 và PD3 của vi điều khiển. Nguồn 5v được sử dụng để cấp nguồn cho toàn mạch bằng cách sử dụng bộ điều chỉnh điện áp LM7805được cung cấp bởi bộ chuyển đổi DC 12v. Một bộ rung cũng được kết nối ở chân PC3. Màn hình LCD 16x2 được cấu hình ở chế độ 4 bit và RS, RW, EN, D4, D5, D6 và D7 của nó được kết nối trực tiếp tại chân PB0, PB1, PB2, PB4, PB5, PB6, PB7 của vi điều khiển. Mô-đun RTC được kết nối tại I2Cpin PC0 SCL và PC1 SDA. Và PD7 được sử dụng làm chân UART Tx mềm để lấy thời gian hiện tại.
Cách thức hoạt động của Hệ thống chấm công bằng vân tay
Bất cứ khi nào người dùng đặt ngón tay lên trên mô-đun vân tay thì mô-đun vân tay sẽ ghi lại hình ảnh ngón tay và tìm kiếm xem có ID nào được liên kết với dấu vân tay này trong hệ thống hay không. Nếu ID vân tay được phát hiện thì màn hình LCD sẽ hiển thị Đã đăng ký điểm danh và đồng thời còi sẽ phát ra tiếng bíp một lần.
Cùng với mô-đun vân tay, chúng tôi cũng đã sử dụng mô-đun RTC cho dữ liệu Ngày và giờ. Thời gian và ngày tháng đang chạy liên tục trong hệ thống, vì vậy, Vi điều khiển có thể lấy ngày giờ bất cứ khi nào người dùng thực sự đặt ngón tay lên cảm biến vân tay và sau đó lưu chúng vào EEPROM ở khe bộ nhớ được phân bổ.
Người dùng có thể tải dữ liệu chấm công xuống bằng cách nhấn và giữ phím 4. Kết nối nguồn điện với mạch và chờ một lúc sau, màn hình LCD sẽ hiển thị 'Đang tải xuống….'. Và người dùng có thể xem dữ liệu chấm công qua màn hình nối tiếp, ở đây phần mềm mã này UART được lập trình tại chân PD7-pin20 như Tx để gửi dữ liệu đến thiết bị đầu cuối. Người dùng cũng cần một bộ chuyển đổi TTL sang USB để xem dữ liệu chấm công qua thiết bị đầu cuối nối tiếp.
And if the user wants to delete all the data then he/she has to press and hold key 2 and then connect power and wait for some time. Now after some time LCD will show ‘Please wait…’ and then ‘Record Deleted successfully’. These two steps are not shown in demonstration video given in the end.
Code Explanation
Complete code along with the video for this biometric attendance system is given at the end. Code of this project is a little bit lengthy and complex for beginner. Hence we have tried to take descriptive variables to make good readability and understanding. First of all, we have included some necessary header file then written macros for different-different purpose.
#define F_CPU 8000000ul #include #include
After this, we have declared some variables and arrays for fingerprint command and response. We have also added some functions for fetching and setting data to RTC.
void RTC_stp() { TWCR=(1<
Then we have some functions for LCD which are responsible to drive the LCD. LCD driver function is written for 4-bit mode drive. Followed by that we also have some UART driver functions which are responsible for initializing UART and exchanging data between fingerprint sensor and microcontroller.
void serialbegin() { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB=(1<
Now we have some more UART function but they are software UART. It is used for transferring saved data to the computer via serial terminal. These functions are delay-based and don’t use any type of interrupt. And for UART only tx signal will work and we have hardcoded baud rate for soft UART as 9600.
void SerialSoftWrite(char ch) { PORTD&=~(1<<7); _delay_us(104); for(int i=0;i<8;i++) { if(ch & 1) PORTD-=(1<<7); else PORTD&=~(1<<7); _delay_us(104); ch>>=1; } PORTD-=(1<<7); _delay_us(104); } void SerialSoftPrint(char *str) { while(*str) { SerialSoftWrite(*str); str++; } }
Followed by that we have functions that are responsible for displaying the RTC time in the LCD. The below given functions are used for writing attendance data to EEPROM and reading attendance data from EEPROM.
int eeprom_write(unsigned int add,unsigned char data) { while(EECR&(1<
The below function is responsible for reading fingerprint image and convert them in template and matching with already stored image and show result over LCD.
void matchFinger() { // lcdwrite(1,CMD); // lcdprint("Place Finger"); // lcdwrite(192,CMD); // _delay_ms(2000); if(!sendcmd2fp((char *)&f_detect,sizeof(f_detect))) { if(!sendcmd2fp((char *)&f_imz2ch1,sizeof(f_imz2ch1))) { if(!sendcmd2fp((char *)&f_search,sizeof(f_search))) { LEDHigh; buzzer(200); uint id= data; id<<=8; id+=data; uint score=data; score<<=8; score+=data; (void)sprintf((char *)buf1,"Id: %d",(int)id); lcdwrite(1,CMD); lcdprint((char *)buf1); saveData(id); _delay_ms(1000); lcdwrite(1,CMD); lcdprint("Attendance"); lcdwrite(192,CMD); lcdprint("Registered"); _delay_ms(2000); LEDLow; }
Followed by that we have a function that is used for enrolling a new finger and displaying the result or status on LCD. Then the below function is used for deleting stored fingerprint from the module by using id number and show status of the same.
void deleteFinger() { id=getId(); f_delete=id>>8 & 0xff; f_delete=id & 0xff; f_delete=(21+id)>>8 & 0xff; f_delete=(21+id) & 0xff; if(!sendcmd2fp(&f_delete,sizeof(f_delete))) { lcdwrite(1,CMD); sprintf((char *)buf1,"Finger ID %d ",id); lcdprint((char *)buf1); lcdwrite(192, CMD); lcdprint("Deleted Success"); } else { lcdwrite(1,CMD); lcdprint("Error"); } _delay_ms(2000); }
Below function is responsible for sending attendance data to serial terminal via soft UART pin PD7 and TTL to USB converter.
/*function to show attendence data on serial moinitor using softserial pin PD7*/ void ShowAttendance() { char buf; lcdwrite(1,CMD); lcdprint("Downloding…."); SerialSoftPrintln("Attendance Record"); SerialSoftPrintln(" "); SerialSoftPrintln("S.No ID1 ID2 Id3 ID4 ID5 "); //serialprintln("Attendance Record"); //serialprintln(" "); //serialprintln("S.No ID1 ID2 Id3 ID4 ID5"); for(int cIndex=1;cIndex<=8;cIndex++) { sprintf((char *)buf,"%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d ", cIndex, eeprom_read((cIndex*6)),eeprom_read((cIndex*6)+1),eeprom_read((cIndex*6)+2),eeprom_read((cIndex*6)+3),eeprom_read((cIndex*6)+4),eeprom_read((cIndex*6)+5), eeprom_read((cIndex*6)+48),eeprom_read((cIndex*6)+1+48),eeprom_read((cIndex*6)+2+48),eeprom_read((cIndex*6)+3+48),eeprom_read((cIndex*6)+4+48),eeprom_read((cIndex*6)+5+48), eeprom_read((cIndex*6)+96),eeprom_read((cIndex*6)+1+96),eeprom_read((cIndex*6)+2+96),eeprom_read((cIndex*6)+3+96),eeprom_read((cIndex*6)+4+96),eeprom_read((cIndex*6)+5+96), eeprom_read((cIndex*6)+144),eeprom_read((cIndex*6)+1+144),eeprom_read((cIndex*6)+2+144),eeprom_read((cIndex*6)+3+144),eeprom_read((cIndex*6)+4+144),eeprom_read((cIndex*6)+5+144), eeprom_read((cIndex*6)+192),eeprom_read((cIndex*6)+1+192),eeprom_read((cIndex*6)+2+192),eeprom_read((cIndex*6)+3+192),eeprom_read((cIndex*6)+4+192),eeprom_read((cIndex*6)+5+192)); SerialSoftPrintln(buf); //serialprintln(buf); } lcdwrite(192,CMD); lcdprint("Done"); _delay_ms(2000); }
Below function is used for deleting all the attendance data from the microcontroller’s EEPROM.
void DeleteRecord() { lcdwrite(1,CMD); lcdprint("Please Wait…"); for(int i=0;i<255;i++) eeprom_write(i,10); _delay_ms(2000); lcdwrite(1,CMD); lcdprint("Record Deleted"); lcdwrite(192,CMD); lcdprint("Successfully"); _delay_ms(2000); }
In the main function we will initialize all the used module and gpio pins. Finally, all-controlling event are performed in this as shown below
while(1) { RTC(); // if(match == LOW) // { matchFinger(); // } if(enrol == LOW) { buzzer(200); enrolFinger(); _delay_ms(2000); // lcdinst(); } else if(delet == LOW) { buzzer(200); getId(); deleteFinger(); _delay_ms(1000); } } return 0; }
The complete working set-up is shown in the video linked below. Hope you enjoyed the project and learnt something new. If you have any questions leave them in the comment section or use the forums for other technical questions.