DIY自制的智能门禁,指纹解锁+红外线遥控解锁。

  • DIY自制的智能门禁,指纹解锁+红外线遥控解锁。
  • 材料准备
  • 库文件
  • 代码
    • 注册指纹的代码
    • **寻找指纹并解锁**
  • 视频演示地址

DIY自制的智能门禁,指纹解锁+红外线遥控解锁。

    对于上大学的的同学来讲,困扰的问题就是回宿舍发现没钥匙,指纹解锁的面世,便是其中一种的解决方案。另外,平时躺在床上玩手机,我真的懒得下去帮同学开门!还有玩游戏玩到一半也总有人来敲门,别担心,我用遥控,成就你的梦想~。

材料准备

1. AS608指纹模块 (45元)
2. 12V电磁锁 (28元)(可替换成5V电磁锁,也就六块钱)
3. 3. Arduino UNO(官方进口版100左右,国产版12元)
4. Lcd1602 I2c(次要)
5. 红外接收头+小LED灯+ 红外遥控器+一个三脚的按键开关(几块钱)
6. 其他模块:面包板,杜邦线,220V转12V的变压器,必要的220V家用电源

7.三极管 tip122 用这个才能控制12V 1A的电源

接下来是接线

1. 指纹AS608:VCC-3.3 必须3.3不然会烧坏GND-GND
TX-RX ,RX-TX, 我分别是接的D2和D3

2. 显示屏LCD1602 I2c: VCC-5V GND-GND SDA-A4 SCL-A5

3. 12V变压器负极接arduino的GND,正极接电磁锁,

^^三极管集电极接电磁锁负极,基极接D13,发射极接GND。不懂的先了解一下三极管
毕竟我也研究了一个下午的三极管,也烧了好几根三极管。
(这里我本来运用了面包板来接线,面包板作用是让拓展电路并固定,
不用面包板也可以。)

4. 按钮是三脚高电平触发,vcc-vcc,gnd-gnd,out-4

5.红外接头和按钮差不多 vcc-vcc,gnd-gnd,out-7

6.LED小灯泡正极接8,负极gnd

接下来是

库文件

添加库中搜索
指纹库 fingerprint
红外线库 IRremote
LCD库 LiquidCrystal_I2C

代码

注册指纹的代码

#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);uint8_t id;void setup()
{Serial.begin(9600);while (!Serial);  // For Yun/Leo/Micro/Zero/...delay(100);Serial.println("\n\nAdafruit Fingerprint sensor enrollment");// set the data rate for the sensor serial portfinger.begin(57600);if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :(");while (1) { delay(1); }}
}uint8_t readnumber(void) {uint8_t num = 0;while (num == 0) {while (! Serial.available());num = Serial.parseInt();}return num;
}void loop()                     // run over and over again
{Serial.println("Ready to enroll a fingerprint!");Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");id = readnumber();if (id == 0) {// ID #0 not allowed, try again!return;}Serial.print("Enrolling ID #");Serial.println(id);while (!  getFingerprintEnroll() );
}uint8_t getFingerprintEnroll() {int p = -1;Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);while (p != FINGERPRINT_OK) {p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.println(".");break;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");break;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");break;default:Serial.println("Unknown error");break;}}// OK success!p = finger.image2Tz(1);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;}Serial.println("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");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");break;}}// 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!");} 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;}
}

在arduino IDE 打开串口,输入一个数值 例如 1 或者2 ,29 ,不可以太多,录制个数有限,一百多个,具体看AS608的数据

输入以后开始录指纹,看串口提示,成功就有提示

接下来是直入正题,

寻找指纹并解锁

三极管的作用,便是作为锁的开关

//岭师宿舍指纹认证,红外解锁。#include "IRremote.h"#include <Adafruit_Fingerprint.h>//指纹库
#include <LiquidCrystal_I2C.h>//I2C转接的库
#include <Wire.h>   //LCD的库const int BUTTON=4;  //声明变量,按钮接在第7针脚;
int sensorValue = digitalRead(4);
int RECV_PIN = 7;
int LED_PIN = 8;
IRrecv irrecv(RECV_PIN);decode_results results;
LiquidCrystal_I2C lcd(0x3F,16,2); //显示屏的地址,我的是0x3F 我接的是 A4 A5SoftwareSerial mySerial(2, 3);//2,3分别为RX,TX 这是设置接口 String Mingzi; //声明Mingzi(名字)为一个变量
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);//在之前的串行引脚上创建一个名为finger的Adafruit_Fingerprint对象void setup()
{ pinMode(13,OUTPUT);//设置D13为输出
digitalWrite(13,LOW);//D13设置为低电平 因为要控制三极管低电平 锁才会锁住,如果为高 三极管通了,锁相当于通电,锁就开了,lcd.init();            //      初始化      lcd.backlight();     //       调亮显示屏的背景 Serial.begin(9600);while (!Serial); delay(100);Serial.println("\n\nAdafruit finger detect test");pinMode(BUTTON,INPUT_PULLUP);//定义BUTTON为输出模式;Serial.begin(9600);irrecv.enableIRIn(); //红外线接收的初始化pinMode(LED_PIN, OUTPUT);digitalWrite(LED_PIN, HIGH);finger.begin(57600);delay(5);if (finger.verifyPassword()) {lcd.setCursor(0,0);lcd.print("Found fingerprint");lcd.setCursor(0,1);lcd.print("    sensor!");Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor ");lcd.setCursor(0,0);
lcd.print("Unable to found");
lcd.setCursor(0, 1);
lcd.print("Sensor");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Check Connections");while (1) { delay(1); }}finger.getTemplateCount();Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");Serial.println("Waiting for valid finger...");lcd.clear();lcd.setCursor(0,0);
lcd.print("Waiting for ");
lcd.setCursor(0, 1);
lcd.print("valid finger...");
}void loop()
{if (digitalRead(BUTTON) == HIGH) {digitalWrite(LED_PIN, sensorValue);sensorValue = !sensorValue;while (digitalRead(BUTTON) == HIGH );}if (digitalRead(LED_PIN) == HIGH){if (irrecv.decode(&results)) {Serial.println(results.value, HEX);if (results.value == 0xFFA25D||results.value == 0xE318261B ) //开锁
{digitalWrite(13,HIGH);} else if (results.value == 0xFF629D||results.value == 0x511DBB ) //关锁{
digitalWrite(13,LOW);
}irrecv.resume(); // Receive the next value}delay(100);}getFingerprintIDez();delay(50);           }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!return finger.fingerID;
}// 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);lcd.clear();lcd.setCursor(0,0);lcd.print("Found ID #");lcd.print(finger.fingerID);if(finger.fingerID == 1){Mingzi ="MR.Zhang";}//名字系统else if(finger.fingerID == 2){Mingzi = "SHI";}lcd.setCursor(0,1);lcd.print("Welcome ");lcd.print(Mingzi); digitalWrite(13,HIGH);//开锁
delay(3000);//延迟三秒
digitalWrite(13,LOW);//关锁return finger.fingerID;
}

打开串口 按上小手,可以看见指纹被匹配到,和对匹配的指纹给出的相应的信心程度

名字系统是可以修改的,显示在lcd1602上,须自行添加

制作过程也出现了不少问题,如图片和视频中,我用的三极管 其实已经烧坏了好几个,功率太小不能用,还是要买大功率的三极管或者达林顿管都可以。

注册指纹后,就是验证指纹,指纹验证后会自动开锁三秒钟,然后遥控开锁是需要这个遥控的按键的频率,我设置的是这个遥控的第一个键和第二个键开关锁。

*记得看完点一下赞哦~~~~

舵机控制门锁 ☑

视频演示地址

== b站视频演示:==

控制电磁锁的完整展示: https://www.bilibili.com/video/av93886822
舵机控制宿舍门锁的短暂演示 : https://www.bilibili.com/video/BV1K54y1y7Cf/

制作 By—KVG

2022/11/09 对此前大一的小项目进行补充修正

评论区有网友说用继电器代替三极管,这是一种最简单的方法,
还有一种就是用达林顿管tip122代替三极管,支持的功率更大。
这个项目本身是用arduino的第三方指纹库做的,实际上本人也只是调用了api来实现功能而已,适合完全新手或者外行人兴趣开发用,想入行嵌入式建议直接干各种国产32芯片,或者支持linux系统的arm芯片,学习操作系统+单片机才是关键。

KVG制作-【Arduino指纹解锁 智能家居系列-01】DIY自制的智能门禁,AS608指纹解锁+红外线遥控解锁。附演示视频。相关推荐

  1. 【Android开发—智能家居系列】(三):手机连接WIFI模块

    [Android开发-智能家居系列](三):手机连接WIFI模块 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有两个方 ...

  2. 【Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    [Android开发-智能家居系列](二):用手机对WIFI模块进行配置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010924834/art ...

  3. 智能家居系列之Home Assistant

    智能家居系列之Home Assistant 智能家居话题本身就是一个技术领域,它的目的是让智能家居变得更加简单,更加实用. 系列定位 本系列的定位是智能家居入门系列. 背景 最近看了下家中的智能家居设 ...

  4. I-000 智能家居系列--需求梳理

    智能家居系列 1 智能家居 2 系统框架 3 组成部分 4 开发思路 5 当前的进展 1 智能家居 智能家居的目的旨在提高人们的生活水平,确保人们的生活更加舒适. 2 系统框架 下图只是初版,在具体的 ...

  5. 智能家居系列之智能家居平台设计

    系列介绍 很久没有写文章了,近来断断续续地在思考一些东西.在去工作的地铁上,终于想好,决定分享自己在智能家居方面的思考.本系列文章计划分为7部分,不排除会对部分内容合并. 智能门锁 中控屏 智能音箱 ...

  6. 【Android开发—智能家居系列】(一):智能家居原理

    来到JCZB公司的第二天,就接到了开发类似于小米智能家庭APP的任务.组长让我在手机上安装上此款APP,给了我个小米智能插座,就让我开始了解需求.这便开启了我的智能家居旅程.说实话,我也真是out的无 ...

  7. Homekit智能家居系列一智能触摸面板开关

    触摸开关,即通过触摸方式控制的墙壁开关,其感官场景如同我们的触屏手机,只需手指轻轻一点即可达到控制电器的目的,随着人们生活品质的提高,触摸开关将逐渐将换代传统机械按键开关. 触摸开关控制原理 触摸开关 ...

  8. [智能家居] 手把手教你自制HomeAssistant人体感应器

    文章目录 前言 一.硬件篇 1.ESP-01S 串口WIFI模块 2. HC-SR501 人体感应传感器 3. 5V2A充放电一体模块 4. 1.8V-5V转3.3V升降压模块 5. type-C 转 ...

  9. 【Android开发—智能家居系列】(四):UDP通信发送指令

    思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...

最新文章

  1. Thrift RPC 系列教程(3)——模块化
  2. nyoj68三点顺序
  3. mysql blob 导出_mysql blob导出文本解密 | 学步园
  4. 人工智能到底是个啥,这几本书讲得透透得!
  5. 第一小节 初识面向对象
  6. matlab dotchart,MATLAB中如何用对数方式显示图形坐标?
  7. 可用于Asp.net的嵌入式数据库SqlCE4.0试用笔记
  8. 组播协议——IGMP v2报文头介绍
  9. 关于明星投票系统的作业分享
  10. 启动vsftpd失败是什么原因_消防排烟风机不启动的原因是什么呢?
  11. Java5国际认证SCJP试题精解,Java 5国际认证SCJP试题精解
  12. visio2003字号与word中的字号对应关系
  13. 什么是瑞利分布和准静态平坦衰落信道?
  14. uniapp——如何在项目中使用阿里字体图标
  15. UWB-DW1000 在8位单片机上移植使用
  16. 【JUC】什么是ABA问题?
  17. 计算机类非全日制研究生
  18. HTML期末学生大作业-在线电影网站html+css+javascript
  19. 洛谷P4084 [USACO17DEC]Barn Painting G 题解
  20. 使用jquery获取url及url参数的方法

热门文章

  1. 《中国企业家》杂志:卫哲第二道伤疤
  2. PLC信号处理系列之RC低通滤波器(梯形图)
  3. 第三组第一次团队会议
  4. stm32f1_MCP41010_正相放大器
  5. 黎曼猜想有可能证明哥德巴赫猜想
  6. 价值500元的canvas图表是什么样的?
  7. 摘自:《设计心理学3:情感设计》 — 〔美〕唐纳德·A·诺曼(Donald Arthur Norman)
  8. 微型计算机系统原理接口与EDA设计技术,微型计算机系统与接口
  9. 菜鸟的数据分析学习记005 ---------EB520X--------离散选择模型与联合分析
  10. CHIL-SQL-LCASE() 函数