查看: 5886|回复: 35

[项目] Arduino 指纹电磁锁, 让你们再进我的工作室乱翻

[复制链接]
本帖最后由 饶厂长 于 2017-4-16 16:13 编辑

先上动图
IMG_3673.jpg 成功开锁.gif 开锁失败.gif

       本人成功开门                                                              无权限人无法开门

视频教程:
使用器材总和很便宜而且很实用。
比市面上的产品便宜好多呢, 还很有科技感。
如果安装在工作室门口是不是感觉很厉害!

教程和演示都在视频里哦, 点开看就好了


另外stl文件与Arduino代码还有接线方法全都放在附件里面啦, 快感谢厂长吧











接线图

接线图

门锁.rar

70.61 KB, 下载次数: 164, 下载积分: 创造力 -1

stl 文件

fingerprint.rar

1.53 KB, 下载次数: 151, 下载积分: 创造力 -1

指纹检测代码

enroll.rar

1.37 KB, 下载次数: 138, 下载积分: 创造力 -1

录入指纹程序

gada888  版主

发表于 2017-4-16 08:36:05

本帖最后由 gada888 于 2017-4-16 14:29 编辑

借贵宝地一用,希望lz见谅,闲着无聊,推导一下代码:
先下载Fingerprint Sensor library运行库,解压库并放到arduino 运行库里,然后在arduino里样例里打开一个如下案例,
路径如下:
Example ->Adafruit_Fingerprint→fingerprint
-------------------------
[AppleScript] 纯文本查看 复制代码
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int getFingerprintIDez();

// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
SoftwareSerial mySerial(2, 3);


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()  
{
  Serial.begin(9600);
  Serial.println("fingertest");

  // set the data rate for the sensor serial port
  finger.begin(57600);
  
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1);
  }
  Serial.println("Waiting for valid finger...");
}

void loop()                     // run over and over again
{
  getFingerprintIDez();
  delay(50);            //don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  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!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence); 
}

// returns -1 if failed, otherwise returns ID #
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)  return -1;
  
  // found a match!
  Serial.print("Found ID #"); 
Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); 
Serial.println(finger.confidence);
  return finger.fingerID; 
}


这是案例源文件,下一个跟帖是案例的修改文件。
回复 支持 0 反对 1

使用道具 举报

dsweiliang  版主

发表于 2017-4-16 08:20:11

有教程吗?
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2017-4-16 08:43:31

本帖最后由 gada888 于 2017-4-16 16:48 编辑

快照1.png

图片来自谷歌搜索
加入逻辑判断,和锁的开关之后就成了如下程序:
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int getFingerprintIDez();
bool locked = true;
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int LockPin = 2;
void setup()  
{
  Serial.begin(9600);
  Serial.println("fingertest");

  // set the data rate for the sensor serial port
  finger.begin(57600);
  
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor ");
    while (1);
  }
  Serial.println("Waiting for valid finger...");
}

void loop()                     // run over and over again
{
  getFingerprintIDez();
  delay(50);            //don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  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!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
}

// returns -1 if failed, otherwise returns ID #
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)  return -1;
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);

   if (locked == true) {
    digitalWrite(LockPin, HIGH);
    locked = false;
    delay(1000);

  } else {
    digitalWrite(LockPin, LOW);
    locked = true;
    delay(1000);
  }

  return finger.fingerID;
}
注:没测试过。但按道理应该是对的。加粗部分是新加code,程序需要微调。中间大段的测试部分可以删掉。锁的硬件电路需要设计一个简单的电流放大电路来驱动大功率电磁开关。电磁门锁通常是12V。普通一个场效应管就可以控制了。LCD不知道IIC的LCD可不可以用,如果可以,那需要根据下面的LCD IIC 代码在主程序加入几行语句,非常简单:
[AppleScript] 纯文本查看 复制代码
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for
a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Shanno");
lcd.setCursor(0,1);
lcd.print("Is Awesome!");
}
void loop()
{
}



回复 支持 反对

使用道具 举报

dsweiliang  版主

发表于 2017-4-16 10:01:03

本帖最后由 gada888 于 2017-4-16 11:22 编辑
gada888 发表于 2017-4-16 08:43
图片来自谷歌搜索
加入逻辑判断,和锁的开关之后就成了如下程序:
#include

有办法令手指碰到感应器,感应器再触发感应吗,省电
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2017-4-16 11:23:18

本帖最后由 gada888 于 2017-4-16 11:26 编辑
dsweiliang 发表于 2017-4-16 10:01
有办法令手指碰到感应器,感应器再触发感应吗,省电

============
可以吧,arduino有个sleep命令,可以让程序不工作时处于休眠状态。需要加入LowPower.h库。
回复 支持 反对

使用道具 举报

dsweiliang  版主

发表于 2017-4-16 13:38:33

gada888 发表于 2017-4-16 11:23
============
可以吧,arduino有个sleep命令,可以让程序不工作时处于休眠状态。需要加入LowPower.h库。
...

好的
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-4-16 16:06:51


视频今天贴上了
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-4-16 16:14:31

本帖最后由 gada888 于 2017-4-16 16:44 编辑
gada888 发表于 2017-4-16 08:43
图片来自谷歌搜索
加入逻辑判断,和锁的开关之后就成了如下程序:
#include

不建议接在0、1口, 下载程序不方便
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-4-16 16:14:48

本帖最后由 gada888 于 2017-4-16 16:43 编辑
gada888 发表于 2017-4-16 11:23
============
可以吧,arduino有个sleep命令,可以让程序不工作时处于休眠状态。需要加入LowPower.h库。
...

我用的是按钮唤醒
回复 支持 反对

使用道具 举报

Rockets  NPC

发表于 2017-4-18 16:58:30

感觉是做雷神之锤的节奏啊。
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-4-20 11:52:30

Rockets 发表于 2017-4-18 16:58
感觉是做雷神之锤的节奏啊。

怎么讲? 没看懂。
回复 支持 反对

使用道具 举报

QQ358698005  学徒

发表于 2017-4-22 09:31:59

指纹识别模块多少钱一个?可以贴下链接吗
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|
来自手机

发表于 2017-4-23 00:09:51

QQ358698005 发表于 2017-4-22 09:31
指纹识别模块多少钱一个?可以贴下链接吗

淘宝搜 100块左右
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2017-4-23 07:05:40

gada888 发表于 2017-4-16 08:43
图片来自谷歌搜索
加入逻辑判断,和锁的开关之后就成了如下程序:
#include

感谢感谢
回复 支持 反对

使用道具 举报

Rockets  NPC

发表于 2017-4-24 12:17:46

饶厂长 发表于 2017-4-20 11:52
怎么讲? 没看懂。

国外有个朋友做了一个雷神之锤,用的和你的原理是一样的,用指纹来控制电磁铁。只有验证的人才能切断电磁铁工作,拿起雷神之锤。
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-4-25 18:09:51

Rockets 发表于 2017-4-24 12:17
国外有个朋友做了一个雷神之锤,用的和你的原理是一样的,用指纹来控制电磁铁。只有验证的人才能切断电磁 ...

好创意啊, 可以考虑搞一个
回复 支持 反对

使用道具 举报

iooops  版主

发表于 2017-4-30 23:36:15

感觉好666啊

瞻仰一下大神 = =
回复 支持 反对

使用道具 举报

饶厂长  中级技师
 楼主|

发表于 2017-5-1 16:44:53

iooops 发表于 2017-4-30 23:36
感觉好666啊

瞻仰一下大神 = =

刚接触不久 最近在研究这些
回复 支持 反对

使用道具 举报

yahoocz  学徒

发表于 2017-6-1 19:19:45

看看
回复 支持 反对

使用道具 举报

nicho  版主

发表于 2017-6-3 20:09:24

指纹识别不错呀~~
回复 支持 反对

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4 Licensed

QQ