KVG制作-【Arduino指纹解锁 智能家居系列-01】DIY自制的智能门禁,AS608指纹解锁+红外线遥控解锁。附演示视频。
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指纹解锁+红外线遥控解锁。附演示视频。相关推荐
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
[Android开发-智能家居系列](三):手机连接WIFI模块 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有两个方 ...
- 【Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
[Android开发-智能家居系列](二):用手机对WIFI模块进行配置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010924834/art ...
- 智能家居系列之Home Assistant
智能家居系列之Home Assistant 智能家居话题本身就是一个技术领域,它的目的是让智能家居变得更加简单,更加实用. 系列定位 本系列的定位是智能家居入门系列. 背景 最近看了下家中的智能家居设 ...
- I-000 智能家居系列--需求梳理
智能家居系列 1 智能家居 2 系统框架 3 组成部分 4 开发思路 5 当前的进展 1 智能家居 智能家居的目的旨在提高人们的生活水平,确保人们的生活更加舒适. 2 系统框架 下图只是初版,在具体的 ...
- 智能家居系列之智能家居平台设计
系列介绍 很久没有写文章了,近来断断续续地在思考一些东西.在去工作的地铁上,终于想好,决定分享自己在智能家居方面的思考.本系列文章计划分为7部分,不排除会对部分内容合并. 智能门锁 中控屏 智能音箱 ...
- 【Android开发—智能家居系列】(一):智能家居原理
来到JCZB公司的第二天,就接到了开发类似于小米智能家庭APP的任务.组长让我在手机上安装上此款APP,给了我个小米智能插座,就让我开始了解需求.这便开启了我的智能家居旅程.说实话,我也真是out的无 ...
- Homekit智能家居系列一智能触摸面板开关
触摸开关,即通过触摸方式控制的墙壁开关,其感官场景如同我们的触屏手机,只需手指轻轻一点即可达到控制电器的目的,随着人们生活品质的提高,触摸开关将逐渐将换代传统机械按键开关. 触摸开关控制原理 触摸开关 ...
- [智能家居] 手把手教你自制HomeAssistant人体感应器
文章目录 前言 一.硬件篇 1.ESP-01S 串口WIFI模块 2. HC-SR501 人体感应传感器 3. 5V2A充放电一体模块 4. 1.8V-5V转3.3V升降压模块 5. type-C 转 ...
- 【Android开发—智能家居系列】(四):UDP通信发送指令
思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...
最新文章
- Thrift RPC 系列教程(3)——模块化
- nyoj68三点顺序
- mysql blob 导出_mysql blob导出文本解密 | 学步园
- 人工智能到底是个啥,这几本书讲得透透得!
- 第一小节 初识面向对象
- matlab dotchart,MATLAB中如何用对数方式显示图形坐标?
- 可用于Asp.net的嵌入式数据库SqlCE4.0试用笔记
- 组播协议——IGMP v2报文头介绍
- 关于明星投票系统的作业分享
- 启动vsftpd失败是什么原因_消防排烟风机不启动的原因是什么呢?
- Java5国际认证SCJP试题精解,Java 5国际认证SCJP试题精解
- visio2003字号与word中的字号对应关系
- 什么是瑞利分布和准静态平坦衰落信道?
- uniapp——如何在项目中使用阿里字体图标
- UWB-DW1000 在8位单片机上移植使用
- 【JUC】什么是ABA问题?
- 计算机类非全日制研究生
- HTML期末学生大作业-在线电影网站html+css+javascript
- 洛谷P4084 [USACO17DEC]Barn Painting G 题解
- 使用jquery获取url及url参数的方法
热门文章
- 《中国企业家》杂志:卫哲第二道伤疤
- PLC信号处理系列之RC低通滤波器(梯形图)
- 第三组第一次团队会议
- stm32f1_MCP41010_正相放大器
- 黎曼猜想有可能证明哥德巴赫猜想
- 价值500元的canvas图表是什么样的?
- 摘自:《设计心理学3:情感设计》 — 〔美〕唐纳德·A·诺曼(Donald Arthur Norman)
- 微型计算机系统原理接口与EDA设计技术,微型计算机系统与接口
- 菜鸟的数据分析学习记005 ---------EB520X--------离散选择模型与联合分析
- CHIL-SQL-LCASE() 函数