我们都非常熟悉电子投票机,您的投票将通过电子方式进行登记,并且您无需使用选票进行选举。如今,安全是一个主要问题,还需要确保某人不能两次投票,因此可以通过引入基于指纹的投票来解决此问题,在该投票中,可以基于指纹来授权某人。这也将阻止虚假投票。因此,今天我们正在使用Arduino构建基于指纹的生物识别投票机。
还要检查我们以前使用不同微控制器的电子投票机项目:
- 使用Raspberry Pi的电子投票机
- 基于RFID的投票机
- 基于AVR单片机的电子投票机项目
- 使用Arduino的电子投票机
所需组件:
- Arduino Uno
- 指纹传感器模块
- 按按钮
- LED -2
- 1K电阻-3
- 2.2K电阻
- 功率
- 连接线
- 蜂鸣器
- 16x2 LCD
- 面包板
投票机中的指纹传感器模块:
指纹传感器模块或指纹扫描仪 是一个模块,可捕获手指的打印图像,然后将其转换为等效模板,并通过Arduino将其保存到选定ID(位置)的内存中。在这里,所有过程都是由Arduino命令的,例如拍摄指纹图像,将其转换为模板并存储位置等。
在此指纹投票机电路中,我们已使用指纹传感器模块通过在系统中输入他们的手指来验证真正的选民。在这里,我们使用5个按钮来匹配,注册/返回,删除/确定,向上和向下。此处的注册和删除键具有双重功能。 登记键 用于将新的手指印记也登记到系统和后退功能中。意味着当用户想要注册新手指时,他/她需要按注册键,然后LCD询问用户想要存储指纹输出的ID或位置。现在,如果此时用户不想继续前进,则他/她可以再次按登记键返回(这次登记键的作用与返回键相同)。表示注册密钥同时具有注册和后退功能。 DEL / OK键 还具有相同的双重功能,例如当用户注册新手指时,他/她需要使用另外两个键(即“ UP”和“ DOWN”)选择手指ID或“位置”,现在用户需要按DEL / OK键(这次此键的行为类似于OK)以继续使用选定的ID或位置。匹配密钥用于选民想要投票的任何时候,然后他/她需要先通过手指触摸指纹传感器来对真选民进行身份验证,如果他/她通过了此身份验证,那么他/她可以投票。
要了解有关注册指纹和其他东西的更多信息,请查看我们以前的有关将指纹传感器与Arduino接口的教程,并在本教程末尾查看我们的演示视频。
工作说明:
此选举用生物识别投票系统的工作 对于初学者来说有点复杂。首先,用户需要借助按钮/按键来注册手指或选民(在此代码中,选民的最大限制为25)。为此,用户需要按ENROLL键,然后LCD要求输入手指将存储的位置/ ID。因此,现在用户需要使用UP / DOWN键输入ID(位置)。选择位置/ ID后,用户需要按确定键(DEL键)。现在,LCD会要求将手指放在指纹模块上。现在,用户需要将手指放在指纹模块上。然后,LCD将要求从指纹模块中拔出手指,然后再次要求放置手指。现在,用户需要再次将手指放在指纹模块上。现在,指纹模块拍摄图像并将其转换为模板,并通过选定的ID将其存储到指纹模块的内存中。现在,选民将被注册,他/她可以投票。通过相同的方法,所有选民都可以注册到系统中。
现在,如果用户要删除或删除任何已存储的ID,则需要按DEL键,在按DEL键之后,LCD会询问选择位置,即选择要删除的ID。现在,用户需要选择ID并按OK键(相同的DEL键)。现在,LCD将通知您手指已成功删除。
投票过程:
现在,当用户想要投票时,他/她需要按匹配键,然后蜂鸣器会蜂鸣并且LED也会发光,LCD会要求将手指放在指纹模块上。现在,Arduino将为您提供三种尝试来使您的手指松动。将手指放在指纹模块上后,指纹模块捕获手指图像,发现其ID存在于系统中。如果检测到手指ID,则LCD将显示授权的Voter。这意味着用户有权投票。然后系统进入下一阶段进行投票。现在,绿色LED指示灯将发光,这意味着现在选民可以通过按下相关键(在此演示中为红色面包板)为候选人投票。现在,如果同一选民想要再次投票,则系统将显示 “已投票” 。意味着同一选民不能再次投票,并且蜂鸣器将鸣响5秒钟。如果有任何非注册用户想要投票,则指纹模块将不会在系统中检测到其ID,并且LCD会显示“未 找到指纹” 。
CAN1,CAN2,CAN3在这里代表竞选的候选人1,候选人2和候选人3。
电路说明:
基于指纹的投票机项目的电路非常简单,其中包含用于控制项目整个过程的Arduino,用于注册,删除,选择ID和投票目的的按钮,用于警告的蜂鸣器,用于指示的LED和用于指示的16x2 LCD投票并显示结果。黄色LED指示指纹模块已准备好拍摄手指图像,绿色LED指示系统已准备好进行投票或查看结果。
该按钮直接连接到引脚A0(ENROL),A1(DEL),A2(UP),A3(DOWN)和A4(Match),D5(Can1),D4(Can2),D3(Can3),D2(结果)关于地面的Arduino。黄色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。
程序说明:
在一个程序中,我们使用Adafruit指纹传感器库将 指纹模块与Arduino开发板连接。您可以在下面查看完整的代码。在这里,我们解释了Arduino程序的主要功能。
在设置功能中,我们已为定义的引脚提供了指导,并启动了LCD和指纹模块。
之后,在 void loop() 函数中,我们等待检查键并按Match键以启动指纹以进行输入,并将捕获的图像ID与存储的ID进行比较。如果发生匹配,则继续下一步。
void loop(){lcd.setCursor(0,0); lcd.print(“按匹配键”); lcd.setCursor(0,1); lcd.print(“启动系统”); digitalWrite(indVote,LOW); digitalWrite(indFinger,LOW); if(digitalRead(match)== 0){digitalWrite(蜂鸣器,高电平); 延迟(200); digitalWrite(蜂鸣器,低); digitalWrite(indFinger,HIGH); for(int i = 0; i <3; i ++)…………………………
给定void checkKeys() 函数用于检查是否按下了Enroll或DEL键,以及按下该怎么办。如果按下ENROLL键, 则调用 Enroll() 函数,而按DEL键,则将 调用 delete() 函数。
void checkKeys(){if(digitalRead(enroll)== 0){lcd.clear(); lcd.print(“请稍候”); 延迟(1000); while(digitalRead(enroll)== 0); 注册(); } else if(digitalRead(del)== 0){lcd.clear(); lcd.print(“请稍候”); 延迟(1000); 删除(); }}
给定函数用于输入要删除的ID,并调用 uint8_t deleteFingerprint(uint8_t id) 函数,该函数将从记录中删除手指。
void delet(){int count = 0; lcd.clear(); lcd.print(“删除手指”); 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; 延迟(500); }……………….
给定功能用于从所选ID的记录中删除指纹。
uint8_t deleteFingerprint(uint8_t id){uint8_t p = -1; lcd.clear(); lcd.print(“请稍候”); p = finger.deleteModel(id); 如果(p == FINGERPRINT_OK){Serial.println(“ Deleted!”); lcd.clear(); lcd.print(“ Figer已删除”); lcd.setCursor(0,1); lcd.print(“成功”); 延迟(1000); } else {Serial.print(“有问题的地方”); lcd.clear(); lcd.print(“出现问题”); lcd.setCursor(0,1); lcd.print(“稍后重试”); delay(2000); 返回p; }}
给定功能用于获取指纹图像并将其转换为模板,并通过选定的ID将其保存到指纹模块存储器中。
uint8_t getFingerprintEnroll(){int p = -1; lcd.clear(); lcd.print(“手指ID:”); lcd.print(id); lcd.setCursor(0,1); lcd.print(“放置手指”); delay(2000); while(p!= FINGERPRINT_OK){p = finger.getImage();…………………
给定功能用于投票和显示结果:
无效的Vote(){lcd.clear(); lcd.print(“请放置”); lcd.setCursor(0,1); lcd.print(“您的投票”); digitalWrite(indVote,HIGH); digitalWrite(indFinger,LOW); digitalWrite(蜂鸣器,高); 延迟(500); digitalWrite(蜂鸣器,低); 延迟(1000); while(1){if(digitalRead(sw1)== 0)…………………
查看下面的完整代码和演示视频。