我们都非常熟悉电子投票机,您的投票以电子方式登记,您无需使用选票即可在选举中投票。今天,安全性是一个主要问题,还需要确保某人不能投票两次,因此可以通过引入基于指纹的投票来解决这个问题,在这种情况下,一个人可以根据他的指纹获得授权。这也将阻止虚假投票。所以今天我们正在 使用arduino构建基于指纹的生物识别投票机 。
所需组件:arduino uno指纹传感器模块按钮指示灯 -21k 电阻器 -32.2k电阻权力连接线蜂鸣器16x2 液晶显示器面包板投票机中的指纹传感器模块:指纹 传感器模块或指纹扫描仪是一种模块 ,用于捕获手指的指纹图像,然后将其转换为等效模板,并将它们保存到arduino所选id(位置)上的内存中。在这里,所有过程都由arduino控制,例如拍摄指纹图像,将其转换为模板和存储位置等。
在这个指纹投票机电路中,我们使用指纹传感器模块通过在系统中输入手指来验证真正的选民。在这里,我们使用 5 个按钮来匹配、注册/返回、删除/确定、向上和向下。注册和德尔键在这里具有双重功能。注册键用于将新的手指印模注册到系统和返回功能中。意味着当用户想要注册新手指时,他/她需要按注册键,然后lcd询问用户想要存储指纹输出的id或位置。现在,如果此时用户不想继续,那么他/她可以再次按注册键返回(这次注册键表现为后退键)。表示注册密钥同时具有注册和返回功能。del/ok 键还具有相同的双重功能,就像用户注册新手指时一样,他/她需要使用另外两个键(即向上和向下)选择手指 id 或位置,现在用户需要按 del/ok 键(这次此键的行为类似于确定)以继续使用选定的 id 或位置。匹配键用于每当选民想要投票时,他/她需要首先通过手指在指纹传感器上对真正的选民进行身份验证,如果他/她通过了此身份验证,那么他/她就可以投票。
工作说明:对于初学者来说,这个用于选举的生物识别投票系统的工作有点复杂。首先,用户需要在按钮/键的帮助下注册手指或投票者(在此代码中,选民的最大限制为 25)。为此,用户需要按register键,然后lcd要求输入手指将成为商店的位置/ id。所以现在用户需要使用向上/向下键输入id(位置)。选择位置/id 后,用户需要按确定键(del 键)。现在,液晶屏将要求将手指放在指纹模块上。现在用户需要将手指放在指纹模块上。然后液晶屏将要求将手指从指纹模块中取出,并再次要求放置手指。现在用户需要再次将手指放在指纹模块上。现在,指纹模块获取图像并将其转换为模板,并通过选定的id将其存储在指纹模块的内存中。现在选民将被登记,他/她可以投票。通过同样的方法,所有选民都可以登记到系统中。
现在,如果用户想要删除或删除任何存储的id,那么他/她需要按del键,按del键后,lcd将要求选择位置意味着选择要删除的id。现在用户需要选择id并按确定键(相同的del键)。现在lcd会让您知道手指已成功删除。
投票流程:
现在,当用户想要投票时,他/她需要按匹配键,然后蜂鸣器将发出哔哔声,led也会发光,lcd将要求将手指放在指纹模块上。现在arduino会给你三次尝试把你的手指。将手指放在指纹模块上后,指纹模块捕获手指图像,发现其id存在于系统中。如果检测到手指 id,则 lcd 将显示授权选民。这意味着用户有权投票。然后系统进入下一阶段进行投票。现在绿色led会亮起,这意味着现在选民可以通过按重新当选的键(来自本演示中的红色面包板)为他们的候选人投票。现在,如果同一选民想再次投票,那么系统将显示它 “已投票”。 表示同一选民无法再次投票,蜂鸣器将发出 5 秒的哔哔声。如果任何非注册用户想要投票,则指纹模块将不会在系统中检测到其id,lcd将显示“未找到指纹”。
这里的can1,can2,can3代表候选人1,候选人2和候选人3,他们参加了选举。
电路说明:这个基于指纹的投票机项目的电路非常简单,其中包含用于控制整个项目过程的arduino,用于注册,删除,选择id和投票目的的按钮,用于警报的蜂鸣器,用于指示的led和用于指示选民并显示结果的16x2 lcd。黄色 led 表示指纹模块已准备好拍摄手指图像,绿色 led 表示系统已准备好进行投票或查看结果。
按钮直接连接到 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 处还连接了一个蜂鸣器。16x2 lcd 配置为 4 位模式,其 rs、en、d4、d5、d6 和 d7 直接连接到 arduino 的数字引脚 d13、d12、d11、d10、d9 和 d8。
程序说明:在设置功能中,我们已经给出了定义引脚的方向,并启动了lcd和指纹模块。
之后,在 void loop() 函数中,我们等待检查键并按匹配键开始指纹进行输入并将捕获的图像id与存储的id进行比较。如果发生匹配,则继续下一步。
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;i25) 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();..... ............ ....给定函数用于投票和显示结果:
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)#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
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=0){ flag=0; for(int i=0;i25) count=0; delay(500); } else if(digitalread(down) == 0) { count--; if(count<0) count=25; delay(500); } else if(digitalread(del) == 0) { id=count; getfingerprintenroll(); for(int i=0;i25) count=0; delay(500); } else if(digitalread(down) == 0) { count--; if(count<0) count=25; delay(500); } else if(digitalread(del) == 0) { id=count; deletefingerprint(id); for(int i=0;i}
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);return p;}
}
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 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;
}
安全挑战继续成为物联网的头条新闻
用更多选择回应积极的反馈
搭载紫光展锐5G芯,中兴小鲜50重磅上市
基于WinCE的嵌入式图像采集系统设计
改善您的模数转换器系统电源抑制状况的四种方法
如何使用Arduino构建基于指纹的生物识别投票机
云存储哪个比较好
网曝三星GalaxyS10在强光下会出现声波指纹传感器轮廓
昇腾AI解决方案 成都天巡微小推超大规模交通数字底座方案 助力智慧交通
【重磅新品】极小尺寸xG27 SoC满足穿戴和互联医疗设备之无线设计
中周变压器的检测,Transformer test
未来,5G与智能交通会开启哪些新的市场成长空间?
动则百万,应届生也可年薪50万,芯片工程师为什么变的这么贵?
我们该怎样看待区块链的现在和未来
[原创] Infineon Xilinx Ultra Scale KintexFPGA开发方案
GPU运算速度比CPU快的原因 GPU和CPU的区别
浅谈预编译指令常见用法
战报!电商服务商战事焦灼,杭州碧橙一个“敢”字出彩双十一
ios10.3.2迎来正式版,值得升级吗?ios11也要来?苹果今日放出ios10.3.3测试版
D类音频功率放大器的热耗散分析