Arduino Nano+AS608指纹门禁系统

article/2025/8/29 9:02:50

100元制作宿舍指纹门禁系统

    • 效果图:
    • 硬件清单
    • 各个模块连接
    • 程序流程图
    • 驱动文件以及配置烧录环境
        • 驱动文件
        • 配置编译器
    • 局部源码
    • **演示视频**
    • 更新内容
    • 完整源码下载:

效果图:

效果图
在这里插入图片描述
这里用的是电容式的AS608指纹模块

  • 这里用的是电容式的AS608指纹模块

硬件清单

名称用途
Arduino Nano开发板 处理各种数据
ESP8266 WIFI模块用于数据远程传输
AS608指纹模块用于采集指纹
MG90S舵机用于带动门锁
OLED0.96显示系统信息
4x4矩阵按键操作交互
USB电源模块为多级和开发板供电
DHT11温度传感器采集环境温度与湿度

合计100元

各个模块连接

在这里插入图片1述
这里接线图中的是光学式AS608指纹模块 接线方式与电容式版本大同小异

程序流程图

在这里插入图片描述

驱动文件以及配置烧录环境

驱动文件

Arduino CH340驱动
链接:https://pan.baidu.com/s/1Jo0fVYdAcBBleallQAm4wg
提取码:2021

配置编译器

Arduino IDE1.8.15
链接:https://pan.baidu.com/s/1OUqRsGI-ZgVyFzZ3q8QqFg
提取码:2021
依次勾选开发板型号、端口号
在这里插入图片描述
在这里插入图片描述

随后按快捷键Ctrl+U即可编译并烧录

局部源码

/**************更新内容*************************************** 更新于2021年5月27日  B站这个视频终于10万播放量了* 更新一下新的代码叭:* * 将之前的u8g2库更改为u8g库;* 功能不变的下精简优化了代码 减少体积30%* Arduino Nano ROM占用由99%降低至69%;* 优化系统里流畅度;* 提高系统稳定性;* --------------------------------------------------------* By: Zyb * Bilibili: aiwyq* Coolapk:  aiwyq* VX /Phone: 17820488893*             2021 05.27**********************************************************       *//********请提前装好以下库文件 工具-管理库(Ctrl+Shift+I)*******/
/**********U8glib库 DHT11库 Adafruit_Fingerprint**********/
/***报错请自行找原因***/
#include <U8glib.h>             //u8g库 用于0.96 OLED IIC显示器 修改于21年5.24 原为u8g库
#include <Adafruit_Fingerprint.h>//AS608指纹库
#include<DHT.h>//温湿度传感  #include "font.h"                //调用同目录下的字库
DHT dht(7,DHT11);//温湿度data接脚
#ifdef U8X8_HAVE_HW_I2C
#endif
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);  // I2C / TWI
#define x_coordinate 40
#define KEY1 2
#define KEY2 3
#define KEY3 4
#define KEY4 5
#define KEY5 6
SoftwareSerial mySerial(11,12);//新建一个名为mySerial的软串口 并将11号引脚作为RX端 12号引脚作为TX端
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
u16 q=1024,t,h;     //累计开门次数、温度、湿度
u8 key_num=0;void key_init()
{pinMode(KEY1, INPUT_PULLUP);pinMode(KEY2, INPUT_PULLUP);pinMode(KEY3, INPUT_PULLUP);pinMode(KEY4, INPUT_PULLUP);pinMode(KEY5, INPUT_PULLUP);
}u8 key_scan(u8 mode)
{static u8 key_up=1;//按键按松开标志if(mode)key_up=1;  //支持连按if(key_up&&(digitalRead(KEY1)==0||digitalRead(KEY2)==0||digitalRead(KEY3)==0||digitalRead(KEY4)==0||digitalRead(KEY5)==0)){delay(10);key_up=0;if(digitalRead(KEY1)==0)return 1;else if(digitalRead(KEY2)==0)return 2;else if(digitalRead(KEY3)==0)return 3;else if(digitalRead(KEY4)==0)return 4;else if(digitalRead(KEY5)==0)return 5;}else if(digitalRead(KEY1)==1&&digitalRead(KEY2)==1&&digitalRead(KEY3)==1&&digitalRead(KEY4)==1&&digitalRead(KEY5)==1)key_up=1;return 0;// 无按键按下
}void MG90S()//MG90S舵机PWM脉冲
{for(int i=1; i<51; i++){servopulse(75);delay(10);}delay(1444);for(int i=1; i<51; i++){servopulse(10);delay(10);}
}void servopulse(int angle)//MG90S舵机PWM脉冲
{int pulsewidth = (angle * 11) + 500;digitalWrite(9, HIGH);delayMicroseconds(pulsewidth);digitalWrite(9, LOW);delayMicroseconds(20000 - pulsewidth);
}/**
@添加指纹
*/
void Add_FR()      
{  u8 i,ensure,processnum=0;    u8 ID_NUM=0;        char str2[10];while(1){switch (processnum){case 0:i++;u8g.firstPage();do{u8g.drawXBMP(32,24,64,16,State5);  /* 字串 请按手指   64x16  */}while(u8g.nextPage());ensure=finger.getImage();if(ensure==FINGERPRINT_OK){ensure=finger.image2Tz(1);//生成特征if(ensure==FINGERPRINT_OK){u8g.firstPage();do{u8g.drawXBMP(32,24,64,16,State6);  /* 字串 指纹正常  64x16  */}while(u8g.nextPage());// Serial.println(" 000 is true");i=0;processnum=1;//跳到第二步}else {};}else {};break;case 1:i++;u8g.firstPage();do{u8g.drawXBMP(32,24,64,16,State7);  /* 字串 再按一次   64x16  */}while(u8g.nextPage());ensure=finger.getImage();if(ensure==FINGERPRINT_OK){ensure=finger.image2Tz(2);//生成特征if(ensure==FINGERPRINT_OK){u8g.firstPage();do{u8g.drawXBMP(32,24,64,16,State6);  /* 字串 指纹正常  64x16  */}while(u8g.nextPage());i=0;processnum=2;//跳到第三步}else {};}else {};break;case 2:u8g.firstPage();do{u8g.drawXBMP(32,24,64,16,State8);/* 字串 创建模板   64x16  */}while(u8g.nextPage());ensure=finger.createModel();if(ensure==FINGERPRINT_OK){u8g.firstPage();do{u8g.drawXBMP(16,24,96,16,State9);  /* 字串 模板创建成功   96x16  */}while(u8g.nextPage());processnum=3;//跳到第四步}else{u8g.firstPage();do{u8g.drawXBMP(16,24,96,16,State10);  /* 字串 模板创建失败   96x16  */}while(u8g.nextPage());i=0;processnum=0;//跳回第一步}delay(500);break;case 3:u8g.firstPage();do{u8g.drawXBMP(1,0,128,48,State11);/* 字串  按K4加,按K2减 按K3保存 0=< ID <=99 128x48*/u8g.setFont(u8g_font_6x10); // 选择字体u8g.drawStr(40,62,"ID=00");}while(u8g.nextPage());while(key_num!=3){key_num=key_scan(0);if(key_num==2){key_num=0;if(ID_NUM>0)ID_NUM--;if(ID_NUM<10)sprintf(str2,"ID=0%d",ID_NUM);elsesprintf(str2,"ID=%d",ID_NUM);u8g.firstPage();do{u8g.setFont(u8g_font_6x10); // 选择字体u8g.drawXBMP(1,0,128,48,State11);u8g.drawStr(40,62,str2);}while(u8g.nextPage());}if(key_num==4){key_num=0;if(ID_NUM<99)ID_NUM++;if(ID_NUM<10)sprintf(str2,"ID=0%d",ID_NUM);elsesprintf(str2,"ID=%d",ID_NUM);u8g.firstPage();do{u8g.setFont(u8g_font_6x10);u8g.drawStr(40,62,str2);u8g.drawXBMP(1,0,128,48,State11);}while(u8g.nextPage());}}key_num=0;ensure=finger.storeModel(ID_NUM);//储存模板if(ensure==0x00){u8g.firstPage();do{u8g.drawXBMP(16,24,96,16,State12);  /* 字串 录入指纹成功   96x16  */}while(u8g.nextPage());Serial.println("FR receive OK");delay(1500);return ;}else{processnum=0;}break;}delay(400);if(i==10)//超过5次没有按手指则退出{break;}}
}void Press_FR()
{...
}void Del_FR()  
{...
}void MENU()
{u8g.firstPage();do{u8g.setFont(u8g_font_6x10); // 选择字体u8g.drawXBMP(4,0,112,16,State1);  //显示字模汉字   /* 竹401指纹门禁  128x16  */u8g.drawXBMP(40,16,64,16,State2);/* 字串 添加指纹   64x16  */u8g.drawXBMP(40,32,64,16,State3);/* 字串 删除指纹   64x16  */u8g.drawXBMP(40,48,64,16,State4);/* 字串 验证指纹   64x16  */u8g.drawStr(22,30,"K1");u8g.drawStr(22,46,"K2");u8g.drawStr(22,62,"K3");}while(u8g.nextPage());Serial.println("一切准备就绪....");Serial.println("By Zhongyanbin");
}void setup()
{// put your setup code here, to run once:key_init();dht.begin();//开启温湿度u8g.begin();       //开启OLED通信Serial.begin(9600); //开启串口通信 波特率9600finger.begin(57600); //设置AS608波特率 57600MENU();
}void loop()
{...
}

在这里插入图片描述

演示视频

在这里插入图片描述

  • 添加指纹/删除指纹/开锁步骤↓
  • B站完整版4K60帧详细视频演示操作/安装教程:BV1Yy4y187wshttps://b23.tv/Vm2rDE
  • 感谢各位的支持 让此视频达到了10w热度
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

更新内容

  • 更新于2021年5月27日 B站这个视频终于10万播放量了
  • 更新一下新的代码叭:
  • 将之前的u8g2库更改为u8g库;
  • 功能不变的下精简优化了代码 减少体积30%
  • Arduino Nano ROM占用由99%降低至69%;
  • 优化系统里流畅度;
  • 提高系统稳定性;
    第一篇csdn帖子

欢迎各位大佬指正

完整源码下载:

https://github.com/aiwyq/Arduino-fingerprint


http://chatgpt.dhexx.cn/article/Dgw4X0WB.shtml

相关文章

ATECC608A的完美兼容国产替代芯片

工程师强烈推荐的一款ATECC608A的完美兼容替代加密芯片&#xff1a;MOD8ID MOD8ID是一款MODSEMI推出的高安全等级加密芯片&#xff0c;真正做到了软硬件P2P兼容ATECC608系列&#xff0c;也就是说不需要改变主机端原有的Cryptolib库&#xff0c;甚至无需更改任何代码和硬件即可…

基于stm32f103c8t6及AS608-----指纹锁项目

一、关于本项目&#xff1a; 本文适合于初学者&#xff0c;大佬还请勿喷&#xff0c;欢迎提出意见&#xff0c;有纰漏之处将及时纠正。在浅学了stmf103c8t6后&#xff0c;想着依据现在所拥有的知识和能力做一个小项目。在了解到有关宿舍指纹锁的相关内容&#xff0c;对该功能的…

【基于STM32F103+AS608的智能打卡系统】

基于STM32F103AS608的智能打卡系统 工程源码链接 链接&#xff1a;https://pan.baidu.com/s/1RRc03nTrcTp--xfQnv2r9Q?pwdin9p 提取码&#xff1a;in9p --来自百度网盘超级会员V5的分享一、功能描述基于STM32F013AS608实行的智能打卡系统 1》进行打卡功能 2》指纹添加&…

as608指令c语言,单片机+AS608的使用,并带程序

之前在AS608的使用上走了许多弯路,这次希望身为初学者的我们可以吸取经验,特此介绍AS608. 指纹模块AS608的使用: 1脚红线:Vcc,连接3.3V电源供电,勿接3.3V以上电源 2脚黄线:接单片机串口TX端 3脚白线:接单片机串口RX端 4脚黑线:GND,3.3V电源的GND 5脚蓝线:模块触摸…

STM32+AS608指纹模块

前言&#xff1a;这个串口逻辑有点问题&#xff0c;要是用串口做命令输入端的话要自己改一下串口逻辑&#xff0c;串口只是调试能不能用指纹模块的功能&#xff0c;后期不需要串口发命令所以没怎么写串口的命令逻辑 1.AS608的资料挺全的&#xff0c;就是按照他给的来写命令&…

AS608与单片机握手失败、与上位机通讯失败

简言&#xff1a;本人在使用AS608模块时遇到了握手失败、通讯失败的问题&#xff0c;尝试网上各种方法未果后&#xff0c;换了一个AS608模块&#xff0c;问题解决。 一、与单片机握手失败 检查代码中的波特率是否为9600&#xff0c;再通过上位机将AS608的波特率改为与代码相同…

vue+vantUI实现单选、多选题(上一题、下一题)

vue+vantUI实现单选、多选题(上一题、下一题) <template><div class="exam-online"><div class="table-list2"><div v-for="(item,index) in questionList" :key="index"><div v-if="currentNum===…

答题微信小程序实现(4):数据库题库的调用/上一题、下一题/题量length的获取

不积跬步无以至千里&#xff0c;不计小流无以成江海。 本来想直接上选择题的&#xff0c;但步子就有点太大了&#xff0c;不是一点点来的。选择题除了题库的调用外&#xff0c;还需要判断答案对错&#xff0c;涉及到if语句&#xff0c;这个if语句应该单独写一个&#xff0c;对…

vue实现调查问卷一页一题,上一题下一题形式

使用了vant组件的radio 单选框 官网https://youzan.github.io/vant/#/zh-CN/radio 效果图 效果图 做出来的效果图就是上面那样 一页一题 附上代码&#xff1a; <template><div class"second"><!-- 问卷题 --><div v-for"(item,index) in…

leetcode每日一题

目录 &#x1f3c6;重新格式化电话号码 &#x1f453;①麻烦解法 &#x1f453;②使用库函数降维打击 每日鸡汤&#xff1a; &#x1f680;有志者自有千计万计&#xff0c;无志者只感千难万难。 &#x1f3c6;重新格式化电话号码 给你一个字符串形式的电话号码 number 。n…

题题题题题1

js 基本数据类型 7 种原始类型Boolean、Number、String、Null、Undefined、Symbol&#xff08;es6&#xff09;、BigInt、Object Symbol的理解 symbol是在es6中引入的基本数据类型、它表示的是一个独一无二的值&#xff0c;主要是来解决命名冲突的问题&#xff0c;它的使用场…

下午第一题

2017上半年 阅读下列说明和图&#xff0c;回答问题1至问题4&#xff0c;将解答填入答题纸的对应栏内。 【说明】 某医疗器械公司作为复杂医疗产品的集成商&#xff0c;必须保持高质量部件的及时供应。为了实现这一目标&#xff0c;该公司欲开发一采购系统。系统的主要功能如下:…

JS实现答题上一题下一题

以下是实现效果图 JS块代码 var TRUE_COUNT 0//正确的题数var count 10;//当前所在题数var thisURL document.URL;var getval thisURL.split(?)[1];var titleType getval.split("")[1];//获取题目typevar class_radio "selection";//选择按钮var ur…

js、jq实现答题上一题下一题

一、以下是效果图 说明&#xff1a;第一题只有一个“下一题”按钮&#xff0c;中间题目有两个按钮“上一题”“下一题”&#xff0c;最后一题按钮改为“提交”&#xff1b; 二、代码 js代码&#xff08;jquery需要自行引入&#xff09; var number document.getElementsByCl…

vue 简单实现上一题下一题问答效果

1.先来看下效果&#xff08;左上展示题目数量以及当前题序号&#xff0c;当第一题时只有下一题按钮&#xff0c;未回答问题时无法点击下一题&#xff0c;且回答结果展示错误或正确的颜色&#xff09; ​​​​ 2.接下来我们来看下html是怎么写的吧 <!-- 左边数据 --><…

MybatisPlus自动填充(建立、更新时间)

准备 1、建立user表 DROP TABLE IF EXISTS user;CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY …

Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate

操作数据库映射实体类时&#xff0c;通常需要记录createTime和updateTime&#xff0c;如果每个对象新增或修改去都去手工操作创建时间、更新时间&#xff0c;会显得比较繁琐。 Springboot jpa提供了自动填充这两个字段的功能&#xff0c;简单配置一下即可。CreatedDate、LastM…

win10如何关闭自动更新及修改更新时间

关于win10如何关闭自动更新&#xff0c;有以下三个方法&#xff0c;但其效果明显不同。 当然&#xff0c;可用度最高的肯定放到最前面。 其中方法一实用性最强&#xff0c;方法二有时候没什么用&#xff0c;方法三可以延缓较长一段时间更新&#xff0c;方法四可以设置更新时间…

mybatis自动生成更新时间和创建时间

开发中&#xff0c;每次修改数据或者添加一条数据都要手动改变一次创建时间或者更新时间&#xff0c;有一说一挺麻烦的 数据表里面的创建时间和更改时间字段 更新update和insert要想自动生成的话实体类要加上TableField 然后创建MyMetaObjectHandler类&#xff0c;实现Meta…

Ubuntu修改时区和更新时间

更新时区 先查看当前系统时间 rootubuntu:/# date -R Thu, 12 Aug 2021 01:41:48 0000 结果时区是&#xff1a;-0000 我需要的是东八区&#xff0c;这儿显示不是&#xff0c;所以需要设置一个时区 运行tzselect tzselect在这里我们选择亚洲 Asia&#xff0c;确认之后选择中…