Volgens onderzoekers van de Pen State University vertrouwen mensen eerder machines dan mensen, wat waarschijnlijk blijkt uit het feit dat we onze pinautomaat zo gemakkelijk aan een machine onthullen. Tegenwoordig, in de wereld waar AI, machine learning, chatbots, slimme luidsprekers, robots enz. Actief vorderen, zal deze synergie tussen mens en robot alleen maar toenemen. Tegenwoordig wordt alles om ons heen, van tolheffers op bruggen tot kassamedewerkers, vervangen door machines om het werk gemakkelijker en efficiënter te doen. Om de fase bij te houden, zullen we in dit project een biometrisch aanwezigheidssysteem bouwen met behulp van AVR-microcontrollers ter vervanging van de handmatige procedure van aanwezigheidsregistratie. Dit systeem zal betrouwbaarder en efficiënter zijn omdat het tijd zou besparen en ontwijkers zou vermijden.
Aanwezigheidssystemen voor vingerafdrukken zijn al direct vanaf de markt beschikbaar, maar wat is er leuker dan er een te bouwen? We hebben ook eerder een breed scala aan aanwezigheidssystemen gebouwd, van een eenvoudig op RFID gebaseerd aanwezigheidssysteem tot een op IoT gebaseerd biometrisch aanwezigheidssysteem met Arduino en Raspberry Pi. In dit project hebben we de vingerafdrukmodule en AVR (atmega32) gebruikt om aanwezigheid te registreren. Door een vingerafdruksensor te gebruiken, wordt het systeem veiliger voor de gebruikers. De volgende secties leggen de technische details uit van het maken van een op vingerafdrukken gebaseerd biometrisch aanwezigheidssysteem met behulp van AVR.
Vereiste componenten
- Atmega32 -1
- Vingerafdrukmodule (R305) -1
- Drukknop of membraanknoppen - 4
- LED's -2
- 1K weerstand -2
- 2.2K weerstand -1
- Voeding 12v adapter
- Draden aansluiten
- Zoemer -1
- 16x2 LCD -1
- PCB of broodplank
- RTC-module (ds1307 of ds3231) -1
- LM7805 -1
- 1000uf, 10uf condensator -1
- Burgstips man vrouw
- DC JACK (optioneel)
- BC547 Transistor -1
In dit circuit van het aanwezigheidssysteem voor vingerafdrukken hebben we de vingerafdruksensormodule gebruikt om de identiteit van een persoon of werknemer te verifiëren door hun vingerafdrukinvoer in het systeem te nemen. Hier gebruiken we 4 druktoetsen om vingerafdrukgegevens vast te leggen , te verwijderen, te verhogen en te verlagen . Sleutel 1 wordt gebruikt voor de inschrijving van een nieuwe persoon in het systeem. Dus wanneer de gebruiker een nieuwe vinger wil registreren, moet hij / zij op toets 1 drukken en vervolgens vraagt het LCD hem / haar om twee keer een vinger op de vingerafdruksensor te plaatsen en vervolgens om een werknemers-ID. Evenzo heeft toets 2 een dubbele functie, zoals wanneer de gebruiker een nieuwe vinger registreert, dan moet hij / zij een vingerafdruk-ID selecterendoor nog twee toetsen te gebruiken, namelijk 3 en 4. Nu moet de gebruiker op toets 1 drukken (deze keer gedraagt deze toets zich als OK) om verder te gaan met de geselecteerde ID. En sleutel 2 wordt ook gebruikt voor het resetten of verwijderen van gegevens uit EEPROM van microcontroller.
De vingerafdruksensormodule legt de afbeelding van de vingerafdruk vast en converteert deze naar de equivalente sjabloon en slaat ze op in het geheugen volgens de geselecteerde ID door de microcontroller. Het hele proces wordt aangestuurd door de microcontroller, zoals het maken van een foto van een vingerafdruk; converteer het naar sjablonen en sla het op als ID enz. U kunt ook deze andere vingerafdruksensorprojecten bekijken, waar we een vingerafdruksensorbeveiligingssysteem en een stemmachine met vingerafdruksensor hebben gebouwd.
Schakelschema
Het volledige schakelschema voor een op vingerafdruk gebaseerd aanwezigheidssysteemproject wordt hieronder weergegeven. Het heeft een Atmega32-microcontroller voor het besturen van het hele proces van het project. De druk- of membraanknop wordt gebruikt voor het registreren, verwijderen, selecteren van ID's voor aanwezigheid, een zoemer wordt gebruikt voor indicatie en een 16x2 LCD om de gebruiker te instrueren over het gebruik van de machine.
Zoals weergegeven in het schakelschema, zijn de druk- of membraanknoppen rechtstreeks verbonden met pin PA2 (ENROLL-toets 1), PA3 (DEL-toets 2), PA0 (UP-toets 3), PA1 (DOWN-toets 4) van de microcontroller ten opzichte van de aarde of PA4. En een LED is aangesloten op pin PC2 van microcontroller met betrekking tot aarde via een 1k-weerstand. Rx en Tx van de vingerafdrukmodule rechtstreeks aangesloten op seriële pin PD1 en PD3 van de microcontroller. 5v-voeding wordt gebruikt voor het voeden van het hele circuit met behulp van de LM7805-spanningsregelaardie wordt aangedreven door 12v dc adapter. Op pin PC3 is ook een zoemer aangesloten. Een 16x2 LCD-scherm is geconfigureerd in 4-bit-modus en de RS, RW, EN, D4, D5, D6 en D7 zijn rechtstreeks aangesloten op pin PB0, PB1, PB2, PB4, PB5, PB6, PB7 van de microcontroller. RTC-module is aangesloten op I2Cpin PC0 SCL en PC1 SDA. En PD7 wordt gebruikt als zachte UART Tx-pin om de huidige tijd te krijgen.
Hoe Fingerprint Attendance System werkt
Telkens wanneer de gebruiker zijn vinger over de vingerafdrukmodule plaatst, legt de vingerafdrukmodule een vingerbeeld vast en zoekt hij of er een ID is gekoppeld aan deze vingerafdruk in het systeem. Als een vingerafdruk-ID wordt gedetecteerd, toont het LCD-scherm Aanwezigheid geregistreerd en tegelijkertijd piept de zoemer één keer.
Naast de vingerafdrukmodule hebben we ook een RTC-module gebruikt voor tijd- en datumgegevens. Tijd en datum lopen continu in het systeem, dus Microcontroller kan de tijd en datum opnemen wanneer een echte gebruiker zijn vinger op de vingerafdruksensor plaatst en ze vervolgens opslaan in de EEPROM in de toegewezen geheugenplaats.
De gebruiker kan de aanwezigheidsgegevens downloaden door toets 4 ingedrukt te houden. Sluit de voeding aan op het circuit en wacht en na enige tijd zal het LCD-scherm 'Downloaden….' tonen. En de gebruiker kan de aanwezigheidsgegevens zien via een seriële monitor, hier in deze codesoftware is UART geprogrammeerd op pin PD7-pin20 als Tx om gegevens naar de terminal te sturen. De gebruiker heeft ook een TTL naar USB-converter nodig om de aanwezigheidsgegevens via een seriële terminal te bekijken.
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.