如何使用Arduino构建基于指纹的生物识别投票机-arduino指纹密码锁

投票流程:

现在,当用户想要投票时,他/她需要按匹配键,然后蜂鸣器将发出哔哔声,LED也会发光,LCD将要求将手指放在指纹模块上。现在Arduino会给你三次尝试把你的手指。将手指放在指纹模块上后,指纹模块捕获手指图像,发现其ID存在于系统中。如果检测到手指 ID,则 LCD 将显示授权选民。这意味着用户有权投票。然后系统进入下一阶段进行投票。现在绿色LED会亮起,这意味着现在选民可以通过按重新当选的键(来自本演示中的红色面包板)为他们的候选人投票。现在,如果同一选民想再次投票,那么系统将显示它 “已投票”。 表示同一选民无法再次投票,蜂鸣器将发出 5 秒的哔哔声。如果任何非注册用户想要投票,则指纹模块将不会在系统中检测到其ID,LCD将显示“未找到指纹”。

如何使用Arduino构建基于指纹的生物识别投票机-arduino指纹密码锁

这里的CAN1,CAN2,CAN3代表候选人1,候选人2和候选人3,他们参加了选举。

电路说明:

这个基于指纹的投票机项目的电路非常简单,其中包含用于控制整个项目过程的Arduino,用于注册,删除,选择ID和投票目的的按钮,用于警报的蜂鸣器,用于指示的LED和用于指示选民并显示结果的16×2 LCD。黄色 LED 表示指纹模块已准备好拍摄手指图像,绿色 LED 表示系统已准备好进行投票或查看结果。

如何使用Arduino构建基于指纹的生物识别投票机-arduino指纹密码锁

按钮直接连接到 Arduino 的引脚 A0(注册)、A1(DEL)、A2(向上)、A3(向下)和 A4(匹配)、D5(Can1)、D4(Can2)、D3(Can3)、D2(结果)相对于接地。黄色 LED 通过 1k 电阻连接到 Arduino 的数字引脚 D7 相对于接地,绿色 LED 以相同的方法连接到 Arduino 的 D6。指纹模块的 Rx 和 Tx 直接连接到 Arduino 的串行引脚 Tx 和 Rx。5v 电源用于为取自 Arduino 板的指纹模块供电。A5 处还连接了一个蜂鸣器。16×2 LCD 配置为 4 位模式,其 RS、EN、D4、D5、D6 和 D7 直接连接到 Arduino 的数字引脚 D13、D12、D11、D10、D9 和 D8。

程序说明:

在设置功能中,我们已经给出了定义引脚的方向,并启动了LCD和指纹模块。

之后,在 void loop() 函数中,我们等待检查键并按匹配键开始指纹进行输入并将捕获的图像ID与存储的ID进行比较。如果发生匹配,则继续下一步。 复制voidloop() { lcd.setCursor(0,0); lcd.print(“Press Match Key “); lcd.setCursor(0,1); lcd.print(“to start system”); digitalWrite(indVote, LOW); digitalWrite(indFinger, LOW); if(digitalRead(match)==0) { digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); digitalWrite(indFinger, HIGH); for(int i=0;i<3;i++) ….. ….. ……. ….

给定 void checkKeys() 函数用于检查是否按下注册或 DEL 键以及按下时该怎么做。如果按下 ENROL 键,则调用 Enroll( ) 函数并按下 DEL 键,则调用 delete() 函数。 复制voidcheckKeys() { if(digitalRead(enroll) == 0) { lcd.clear(); lcd.print(“Please Wait”); delay(1000); while(digitalRead(enroll) == 0); Enroll(); } elseif(digitalRead(del) == 0) { lcd.clear(); lcd.print(“Please Wait”); delay(1000); delet(); } }

给定函数用于输入要删除的 ID 并调用uint8_t *deleteFingerprint(uint8_t id) *函数,该函数将从记录中删除手指。 复制void delet() { intcount=0; lcd.clear(); lcd.print(“Delete Finger “); lcd.setCursor(0,1); lcd.print(“Location:”); while(1) { lcd.setCursor(9,1); lcd.print(count); if(digitalRead(up) == 0) { count++; if(count>25) count=0; delay(500); } …. ….. ….. …..

给定功能用于从所选ID的记录中删除指纹。 复制uint8_t deleteFingerprint(uint8_t id) { uint8_t p = -1; lcd.clear(); lcd.print(“Please wait”); p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { Serial.println(“Deleted!”); lcd.clear(); lcd.print(“Figer Deleted”); lcd.setCursor(0,1); lcd.print(“Successfully”); delay(1000); } else { Serial.print(“Something Wrong”); lcd.clear(); lcd.print(“Something Wrong”); lcd.setCursor(0,1); lcd.print(“Try Again Later”); delay(2000); return p; } }

给定功能用于获取指纹图像并将其转换为模板,并通过选定的ID将其保存到指纹模块存储器中。 复制uint8_t getFingerprintEnroll() { int p = -1; lcd.clear(); lcd.print(“finger ID:”); lcd.print(id); lcd.setCursor(0,1); lcd.print(“Place Finger”); delay(2000); while (p != FINGERPRINT_OK) { p = finger.getImage(); ….. ….. ……. ….

给定函数用于投票和显示结果: 复制voidVote() { lcd.clear(); lcd.print(“Please Place”); lcd.setCursor(0,1); lcd.print(“Your Vote”); digitalWrite(indVote, HIGH); digitalWrite(indFinger, LOW); digitalWrite(buzzer, HIGH); delay(500); digitalWrite(buzzer, LOW); delay(1000); while(1) { if(digitalRead(sw1)==0)

#include

#include

LiquidCrystal lcd(13,12,11,10,9,8);

#include

uint8_t id;

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial);

#define enroll 14

#define del 15

#define up 16

#define down 17

#define match 18

#define indVote 6

#define sw1 5

#define sw2 4

#define sw3 3

#define resultsw 2

#define indFinger 7

#define buzzer 19

#define records 25

int vote1,vote2,vote3;

int flag;

void setup()

{ 复制delay(1000); pinMode(enroll, INPUT_PULLUP); pinMode(up, INPUT_PULLUP); pinMode(down, INPUT_PULLUP); pinMode(del, INPUT_PULLUP); pinMode(match, INPUT_PULLUP); pinMode(sw1, INPUT_PULLUP); pinMode(sw2, INPUT_PULLUP); pinMode(sw3, INPUT_PULLUP); pinMode(resultsw, INPUT_PULLUP); pinMode(buzzer, OUTPUT); pinMode(indVote, OUTPUT); pinMode(indFinger, OUTPUT);

lcd.begin(16,2);

if(digitalRead(resultsw) ==0)

{ 复制for(int i=0;i<records;i++) eeprom.write(i+<span=””>10,0xff); EEPROM.write(0,0); EEPROM.write(1,0); EEPROM.write(2,0); lcd.clear(); lcd.print(“System Reset”); delay(1000);

} 复制lcd.clear(); lcd.print(“Voting Machine”); lcd.setCursor(0,1); lcd.print(“by Finger Print”); delay(2000); lcd.clear(); lcd.print(“Circuit Digest”); lcd.setCursor(0,1); lcd.print(“Saddam Khan”); delay(2000);

if(EEPROM.read(0) == 0xff)

EEPROM.write(0,0); 复制if(EEPROM.read(1) == 0xff)

EEPROM.write(1,0); 复制if(EEPROM.read(1) == 0xff)

EEPROM.write(1,0); 复制//finger.begin(57600);Serial.begin(57600); lcd.clear(); lcd.print(“Finding Module”); lcd.setCursor(0,1); delay(1000); if (finger.verifyPassword()) { //Serial.println(“Found fingerprint sensor!”);lcd.clear(); lcd.print(“Found Module “); delay(1000); } else { //Serial.println(“Did not find fingerprint sensor :(“);lcd.clear(); lcd.print(“module not Found”); lcd.setCursor(0,1); lcd.print(“Check Connections”); while (1); }

lcd.clear();

lcd.setCursor(0,0);

lcd.print(“Cn1”);

lcd.setCursor(4,0);

lcd.print(“Cn2”);

lcd.setCursor(8,0);

lcd.print(“Cn3”);

lcd.setCursor(12,0);

lcd.print(“Cn4”);

lcd.setCursor(0,1);

vote1=EEPROM.read(0);

lcd.print(vote1);

lcd.setCursor(6,1);

vote2=EEPROM.read(1);

lcd.print(vote2);

lcd.setCursor(12,1);

vote3=EEPROM.read(2);

lcd.print(vote3);

delay(2000);

}

void loop()

{

lcd.setCursor(0,0);

lcd.print(“Press Match Key “);

lcd.setCursor(0,1);

lcd.print(“to start system”);

digitalWrite(indVote, LOW);

digitalWrite(indFinger, LOW);

if(digitalRead(match)==0)

{

digitalWrite(buzzer, HIGH);

delay(200);

digitalWrite(buzzer, LOW);

digitalWrite(indFinger, HIGH);

for(int i=0;i<3;i++)

{ 复制lcd.clear(); lcd.print(“Place Finger”); delay(2000); int result=getFingerprintIDez(); if(result>=0) { flag=0; for(int i=0;i<records;i++) <span=””> { </records;i++)> if(result == EEPROM.read(i+10)) { lcd.clear(); lcd.print(“Authorised Voter”); lcd.setCursor(0,1); lcd.print(“Please Wait….”); delay(1000); Vote(); EEPROM.write(i+10, 0xff); flag=1; return; } } if(flag == 0) { lcd.clear(); lcd.print(“Already Voted”); //lcd.setCursor(0,1); //lcd.print(“”) digitalWrite(buzzer, HIGH); delay(5000); digitalWrite(buzzer, LOW); return; } }

}

lcd.clear();

}

checkKeys();

delay(1000);

}

void checkKeys()

{

if(digitalRead(enroll) == 0)

{ 复制lcd.clear(); lcd.print(“Please Wait”); delay(1000); while(digitalRead(enroll) == 0); Enroll();

}

else if(digitalRead(del) == 0)

{ 复制lcd.clear(); lcd.print(“Please Wait”); delay(1000); delet();

}

}

void Enroll()

{

int count=0;

lcd.clear();

lcd.print(“Enter Finger ID:”);

while(1)

{ 复制lcd.setCursor(0,1); lcd.print(count); if(digitalRead(up) == 0) { count++; if(count>25) count=0; delay(500); } elseif(digitalRead(down) == 0) { count–; if(count<0) count=25; delay(500); } elseif(digitalRead(del) == 0) { id=count; getFingerprintEnroll(); for(int i=0;i<records;i++) {=”” if(eeprom.<span=””>read(i+10) == 0xff) { EEPROM.write(i+10, id); break; } } return; } elseif(digitalRead(enroll) == 0) { return; }

}

}

void delet()

{

int count=0;

lcd.clear();

lcd.print(“Enter Finger ID”);

while(1)

{ 复制lcd.setCursor(0,1); lcd.print(count); if(digitalRead(up) == 0) { count++; if(count>25) count=0; delay(500); } elseif(digitalRead(down) == 0) { count–; if(count<0) count=25; delay(500); } elseif(digitalRead(del) == 0) { id=count; deleteFingerprint(id); for(int i=0;i<records;i++) {=”” if(eeprom.<span=””>read(i+10) == id) { EEPROM.write(i+10, 0xff); break; } } return; } elseif(digitalRead(enroll) == 0) { return; }

}

}

uint8_t getFingerprintEnroll()

{

int p = -1;

lcd.clear();

lcd.print(“finger ID:”);

lcd.print(id);

lcd.setCursor(0,1);

lcd.print(“Place Finger”);

delay(2000);

while (p != FINGERPRINT_OK)

{ 复制p = finger.getImage(); switch (p) { case FINGERPRINT_OK: //Serial.println(“Image taken”); lcd.clear(); lcd.print(“Image taken”); break; case FINGERPRINT_NOFINGER: //Serial.println(“No Finger”); lcd.clear(); lcd.print(“No Finger”); break; case FINGERPRINT_PACKETRECIEVEERR: //Serial.println(“Communication error”); lcd.clear(); lcd.print(“Comm Error”); break; case FINGERPRINT_IMAGEFAIL: //Serial.println(“Imaging error”); lcd.clear(); lcd.print(“Imaging Error”); break; default: //Serial.println(“Unknown error”); lcd.clear(); lcd.print(“Unknown Error”); break; }

}

// OK success!

p = finger.image2Tz(1);

switch (p) { 复制case FINGERPRINT_OK: //Serial.println(“Image converted”); lcd.clear(); lcd.print(“Image converted”); break; case FINGERPRINT_IMAGEMESS: //Serial.println(“Image too messy”); lcd.clear(); lcd.print(“Image too messy”); return p; case FINGERPRINT_PACKETRECIEVEERR: //Serial.println(“Communication error”); lcd.clear(); lcd.print(“Comm Error”); return p; case FINGERPRINT_FEATUREFAIL: //Serial.println(“Could not find fingerprint features”); lcd.clear(); lcd.print(“Feature Not Found”); return p; case FINGERPRINT_INVALIDIMAGE: //Serial.println(“Could not find fingerprint features”); lcd.clear(); lcd.print(“Feature Not Found”); return p; default: //Serial.println(“Unknown error”); lcd.clear(); lcd.print(“Unknown Error”); return p;

}

//Serial.println(“Remove finger”);

lcd.clear();

lcd.print(“Remove Finger”);

delay(2000);

p = 0;

while (p != FINGERPRINT_NOFINGER) { 复制p = finger.getImage();

}

//Serial.print(“ID “); //Serial.println(id);

p = -1;

//Serial.println(“Place same finger again”);

lcd.clear(); 复制lcd.print(“Place Finger”); lcd.setCursor(0,1); lcd.print(” Again”);

while (p != FINGERPRINT_OK) { 复制p = finger.getImage(); switch (p) { case FINGERPRINT_OK: //Serial.println(“Image taken”);break; case FINGERPRINT_NOFINGER: //Serial.print(“.”);break; case FINGERPRINT_PACKETRECIEVEERR: //Serial.println(“Communication error”);break; case FINGERPRINT_IMAGEFAIL: //Serial.println(“Imaging error”);break; default: //Serial.println(“Unknown error”);return; }

}

// OK success!

p = finger.image2Tz(2);

switch (p) { 复制case FINGERPRINT_OK: //Serial.println(“Image converted”); break; case FINGERPRINT_IMAGEMESS: //Serial.println(“Image too messy”); return p; case FINGERPRINT_PACKETRECIEVEERR: //Serial.println(“Communication error”); return p; case FINGERPRINT_FEATUREFAIL: //Serial.println(“Could not find fingerprint features”); return p; case FINGERPRINT_INVALIDIMAGE: //Serial.println(“Could not find fingerprint features”); return p; default: //Serial.println(“Unknown error”); return p;

}

// OK converted!

//Serial.print(“Creating model for #”); //Serial.println(id);

p = finger.createModel();

if (p == FINGERPRINT_OK) { 复制//Serial.println(“Prints matched!”);

} else if (p == FINGERPRINT_PACKETRECIEVEERR) { 复制//Serial.println(“Communication error”);return p;

} else if (p == FINGERPRINT_ENROLLMISMATCH) { 复制//Serial.println(“Fingerprints did not match”);return p;

} else { 复制//Serial.println(“Unknown error”);return p;

}

//Serial.print(“ID “); //Serial.println(id);

p = finger.storeModel(id);

if (p == FINGERPRINT_OK) { 复制//Serial.println(“Stored!”);lcd.clear(); lcd.print(“Stored!”); delay(2000);

} else if (p == FINGERPRINT_PACKETRECIEVEERR) { 复制//Serial.println(“Communication error”);return p;

} else if (p == FINGERPRINT_BADLOCATION) { 复制//Serial.println(“Could not store in that location”);return p;

} else if (p == FINGERPRINT_FLASHERR) { 复制//Serial.println(“Error writing to flash”);return p;

}

else { 复制//Serial.println(“Unknown error”);return p;

}

}

int getFingerprintIDez()

{

uint8_t p = finger.getImage();

if (p != FINGERPRINT_OK)

return -1;

p = finger.image2Tz();

if (p != FINGERPRINT_OK)

return -1;

p = finger.fingerFastSearch();

if (p != FINGERPRINT_OK)

{

lcd.clear();

lcd.print(“Finger Not Found”);

lcd.setCursor(0,1);

lcd.print(“Try Later”);

delay(2000);

return -1;

}

// found a match!

//Serial.print(“Found ID #”);

//Serial.print(finger.fingerID);

return finger.fingerID;

}

uint8_t deleteFingerprint(uint8_t id)

{

uint8_t p = -1;

lcd.clear();

lcd.print(“Please wait”);

p = finger.deleteModel(id);

if (p == FINGERPRINT_OK)

{ 复制//Serial.println(“Deleted!”);lcd.clear(); lcd.print(“Figer Deleted”); lcd.setCursor(0,1); lcd.print(“Successfully”); delay(1000);

}

else

{ 复制//Serial.print(“Something Wrong”); lcd.clear(); lcd.print(“Something Wrong”); lcd.setCursor(0,1); lcd.print(“Try Again Later”); delay(2000); returnp;

}

}

void Vote()

{

lcd.clear();

lcd.print(“Please Place”);

lcd.setCursor(0,1);

lcd.print(“Your Vote”);

digitalWrite(indVote, HIGH);

digitalWrite(indFinger, LOW);

digitalWrite(buzzer, HIGH);

delay(500);

digitalWrite(buzzer, LOW);

delay(1000);

while(1)

{ 复制if(digitalRead(sw1)==0) { vote1++; voteSubmit(1); EEPROM.write(0, vote1); while(digitalRead(sw1)==0); return; } if(digitalRead(sw2)==0) { vote2++; voteSubmit(2); EEPROM.write(1, vote2); while(digitalRead(sw2)==0); return; } if(digitalRead(sw3)==0) { vote3++; voteSubmit(3); EEPROM.write(2, vote3); while(digitalRead(sw3)==0); return; } if(digitalRead(resultsw)==0) { lcd.clear(); lcd.setCursor(0,0); lcd.print(“Can1”); lcd.setCursor(6,0); lcd.print(“Can2”); lcd.setCursor(12,0); lcd.print(“Can3”); for(int i=0;i<3;i++) { lcd.setCursor(i*6,1); lcd.print(EEPROM.read(i)); } delay(2000); int vote=vote1+vote2+vote3; if(vote) { if((vote1 > vote2 && vote1 > vote3)) { lcd.clear(); lcd.print(“Can1 Wins”); delay(2000); lcd.clear(); } else if(vote2 > vote1 && vote2 > vote3) { lcd.clear(); lcd.print(“Can2 Wins”); delay(2000); lcd.clear(); } else if((vote3 > vote1 && vote3 > vote2)) { lcd.clear(); lcd.print(“Can3 Wins”); delay(2000); lcd.clear(); } else { lcd.clear(); lcd.print(” Tie Up Or “); lcd.setCursor(0,1); lcd.print(” No Result “); delay(1000); lcd.clear(); } } else { lcd.clear(); lcd.print(“No Voting….”); delay(1000); lcd.clear(); } vote1=0;vote2=0;vote3=0;vote=0; lcd.clear(); return; }

}

digitalWrite(indVote, LOW);

}

void voteSubmit(int cn)

{

lcd.clear();

if(cn == 1) 复制lcd.print(“Can1”);

else if(cn == 2) 复制lcd.print(“Can2”);

else if(cn == 3) 复制lcd.print(“Can3”);

lcd.setCursor(0,1);

lcd.print(“Vote Submitted”);

digitalWrite(buzzer , HIGH);

delay(1000);

digitalWrite(buzzer, LOW);

digitalWrite(indVote, LOW);

return;

} 复制 </records;i++)> </records;i++)> </records;i++)>

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:如何使用Arduino构建基于指纹的生物识别投票机-arduino指纹密码锁 https://www.yhzz.com.cn/a/5240.html

上一篇 2023-04-11 23:47:06
下一篇 2023-04-12 00:05:34

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。