- Potrebne komponente
- Kružni dijagram
- Kako funkcionira sustav praćenja otisaka prstiju
- Code Explanation
Prema istraživačima sa Sveučilišta Pen Pen, ljudi će vjerojatnije vjerovati strojevima ljudima, što je vjerojatno vidljivo iz toga što smo tako lako otkrili svoj pin ATM-a stroju. Danas, u svijetu u kojem AI, Strojno učenje, Chat botovi, pametni zvučnici, roboti itd. Aktivno napreduju, ova sinergija između ljudi i robota tek će se povećati. Danas od naplatnika mostova do naplatnih blagajni sve oko nas zamjenjuju strojevi kako bi posao bio lakši i učinkovitiji. Da bismo išli u korak s fazom, u ovom ćemo projektu izgraditi sustav biometrijskog pohađanja koji koristi AVR mikrokontrolere kako bi zamijenio ručni postupak pohađanja nastave. Ovaj će sustav biti pouzdaniji i učinkovitiji jer će uštedjeti vrijeme i izbjeći izmicanje.
Sustavi za prisustvo prstima su već dostupni izravno s tržišta, ali što je zabavnije od izrade? Također smo ranije izradili široku paletu Attendance sustava, od jednostavnog Attendance temeljenog na RFID-u do biometrijskog Attendance sustava koji se temelji na IoT-u koristeći Arduino i Raspberry Pi. U ovom smo projektu koristili modul za otiske prstiju i AVR (atmega32) za registraciju prisutnosti. Korištenjem senzora otiska prsta sustav će postati sigurniji za korisnike. Sljedeći odjeljci objašnjavaju tehničke detalje izrade Biometrijskog sustava pohađanja pomoću otiska prsta pomoću AVR-a.
Potrebne komponente
- Atmega32 -1
- Modul otiska prsta (r305) -1
- Gumb ili membranski gumbi - 4
- LED diode -2
- 1K otpornik -2
- Otpor 2.2K -1
- Napajanje 12v adapter
- Spajanje žica
- Zujalica -1
- LCD 16x2 -1
- PCB ili ploča za kruh
- RTC modul (ds1307 ili ds3231) -1
- LM7805 -1
- 1000uf, 10uf kondenzator -1
- Burgstips muško žensko
- DC JACK (neobavezno)
- BC547 Tranzistor -1

U ovom krugu sustava za prisustvo na otiscima prstiju koristili smo modul Senzor za otisak prsta da bismo provjerili identitet osobe ili zaposlenika uzimajući njegov otisak prsta u sustavu. Ovdje koristimo 4 tipke za upis, brisanje, povećanje i smanjenje podataka o otiscima prstiju . Ključ 1 koristi se za upis nove osobe u sustav. Dakle, kada korisnik želi upisati novi prst, tada mora pritisnuti tipku 1, a zatim LCD traži da dva puta stavi prst na senzor otiska prsta, a zatim traži ID zaposlenika. Slično tome, tipka 2 ima dvostruku funkciju, na primjer kada korisnik upiše novi prst, tada mora odabrati ID otiska prstakorištenjem još dvije tipke, naime 3 i 4. Sada korisnik treba pritisnuti tipku 1 (ovaj put se ova tipka ponaša kao u redu) da bi nastavio s odabranim ID-om. A tipka 2 također se koristi za resetiranje ili brisanje podataka s EEPROM-a mikrokontrolera.
Modul senzora otiska prsta snima otisak prsta, a zatim ga pretvara u ekvivalentni predložak i sprema u svoju memoriju prema odabranom ID-u mikrokontrolera. Sav postupak zapovijeda mikrokontrolerom, poput snimanja otiska prsta; pretvorite ga u predloške i pohranite kao ID itd. Također možete provjeriti ove druge projekte senzora otiska prsta, gdje smo izgradili sigurnosni sustav senzora otiska prsta i stroj za glasanje senzora otiska prsta.

Kružni dijagram
Kompletna shema sklopa za projekt sustava pohađanja zasnovan na otiscima prstiju prikazan je u nastavku. Ima Atmega32 mikrokontroler za kontrolu cjelokupnog procesa projekta. Pritisni ili membranska tipka koristi se za registraciju, brisanje, odabir ID-ova za prisustvo, zujalica se koristi za indikaciju i LCD 16x2 kako bi se korisnici uputili kako se koristi stroj.

Kao što je prikazano na shemi spojeva, tipke s gumbom ili membrane izravno su povezane na pin PA2 (tipka ENROLL 1), PA3 (tipka DEL 2), PA0 (tipka GORE 3), PA1 (tipka DOLJE 4) mikrokontrolera u odnosu na masu ili PA4. I LED je spojen na pin PC2 mikrokontrolera s obzirom na masu kroz 1k otpornik. Rx i Tx modula otiska prsta izravno su povezani na serijski pin PD1 i PD3 mikrokontrolera. Opskrba 5v koristi se za napajanje cijelog kruga pomoću regulatora napona LM7805koje napaja 12v jednosmjerni adapter. Zujalica je također spojena na pin PC3. LCD 16x2 konfiguriran je u 4-bitnom načinu rada, a njegovi RS, RW, EN, D4, D5, D6 i D7 izravno su povezani na pin PB0, PB1, PB2, PB4, PB5, PB6, PB7 mikrokontrolera. RTC modul povezan je na I2Cpin PC0 SCL i PC1 SDA. A PD7 se koristi kao meka UART Tx igla za dobivanje trenutnog vremena.
Kako funkcionira sustav praćenja otisaka prstiju
Kad god korisnik stavi prst preko modula otiska prsta, tada modul otiska prsta snima sliku prsta i pretražuje je li neki ID povezan s tim otiskom u sustavu. Ako se otkrije ID otiska prsta, LCD će prikazati prisutnost i istovremeno će se oglasiti zvučni signal.

Uz modul otiska prsta, koristili smo i RTC modul za podatke o vremenu i datumu. Vrijeme i datum kontinuirano se izvode u sustavu, tako da mikrokontroler može uzeti vrijeme i datum kad god pravi korisnik stavi prst preko senzora otiska prsta, a zatim ih spremiti u EEPROM na dodijeljeni prostor memorije.
Korisnik može preuzeti podatke o nazočnosti pritiskom i držanjem tipke 4. Spojite napajanje na strujni krug i pričekajte, a nakon nekog vremena na LCD-u će se prikazati "Preuzimanje….". I korisnik može vidjeti podatke o prisutnosti preko serijskog monitora, ovdje je u ovom kodnom softveru UART programiran na pin PD7-pin20 kao Tx za slanje podataka na terminal. Korisnik također treba pretvarač TTL u USB da bi vidio podatke o prisutnosti preko serijskog terminala.
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.
