门锁.jpg

动动你的小手制作一款炫酷的指纹解锁门禁吧。此作者酷安社区 @ aiwyq ,成本约 100 元 (消耗品另算)!

硬件清单

名称 / 价格名称 / 价格
开发板 Arduino nano15 元DHT11 温度模块5 元
指纹模块 AS60850 元0.96 OLED 显示器10 元
MG90S 舵机8 元4x4 轻触按键3 元
可变电压模块8 元单排杜邦胶壳 2.54mm1x1 (100 个) 1x2 (50 个)
线材 10 米3 元杜邦公簧片 (50 个)2.54MM 杜邦母簧片 (100 个)

1. 烧录代码

将 arduino nano 板连接电脑并装好 Arduino IDE 以及驱动.......(详细这里不多赘述)

代码

/********请提前装好以下库文件 工具-管理库(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;    // By ZYB  2021 02.02
    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);
                    else
                        sprintf(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);
                    else
                        sprintf(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()
{
                           //
    u8 ensure,i;           // 验证指纹并开锁 函数
    char str[20];          // By ZYB  2021 02.02
    char cishu[5];        //
    char wendu[15];
    char shidu[15];
    u8g.firstPage();
    do
    {
        u8g.drawXBMP(32,24,64,16,State5);  /* 字串 请按手指   64x16  */
    }
    while(u8g.nextPage());
    while(1)
    {
        ensure=finger.getImage();
        if(ensure==0x00)//获取图像成功
        {
            ensure=finger.image2Tz();
            if(ensure==0x00) //生成特征成功
            {
                ensure=finger.fingerFastSearch();
                if(ensure==0x00)//搜索成功
                {
                    MG90S();
                    q++;
                    sprintf(str,"ID:%d Score:%d",finger.fingerID,finger.confidence);
                    sprintf(cishu,"%d",q);
                    u8g.firstPage();
                    do
                    {
                        u8g.setFont(u8g_font_6x10); // 选择字体
                        u8g.drawXBMP(16,16,96,16,State13);  //显示指纹搜索成功
                        u8g.drawStr(100,16,cishu);
                        u8g.drawStr(1,46,str);
                    }
                    while(u8g.nextPage());
//                    Serial.println("OPEN");

                    delay(401);
                    key_num=key_scan(0);
                    if(key_num==1)
                    {
                        break;
                    }

                    t = dht.readTemperature();
                    h = dht.readHumidity();
                    delay(100);
                    sprintf(wendu,"%dC",t);
                    sprintf(shidu,"%d",h);

                    u8g.firstPage();
                    do
                    {
                        u8g.setFont(u8g_font_6x10);
                        u8g.drawXBMP(0,0,128,64,HOME);  /* 图片 主页  128x64  */
                        u8g.drawStr(100,32,wendu);
                        u8g.drawStr(100,46,shidu);
                        u8g.drawStr(120,46,"%");
                    }
                    while(u8g.nextPage());
                }
                else
                {
                    u8g.firstPage();
                    do
                    {
                        u8g.drawXBMP(16,16,96,16,State14); //State14_字串 未搜索到指纹 96x16
                    }
                    while(u8g.nextPage());

                    delay(600);
                    u8g.firstPage();
                    do
                    {
                        u8g.setFont(u8g_font_6x10);
                        u8g.drawXBMP(0,0,128,64,HOME);  /* 图片 主页  128x64  */
                        u8g.drawStr(100,32,wendu);
                        u8g.drawStr(100,46,shidu);
                        u8g.drawStr(120,46,"%");
                    }
                    while(u8g.nextPage());
                    //break;
                }
            }
            else
            {
                //ShowErrMessage(ensure);
            }
        }
        delay(200);
    }
}


void Del_FR()          /
{  
                       //选择删除指纹函数
    u8  ensure;        //By ZYB  2021 02.02
    u8 ID_NUM=0;       /
    char str2[10];
    sprintf(str2,"ID=0%d",ID_NUM);
    u8g.firstPage();
    do
    {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr(44,62,str2);
        u8g.drawXBMP(1,0,128,48,State15);  //显示字模汉字
    }
    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);
            else
                sprintf(str2,"ID=%d",ID_NUM);
            u8g.firstPage();
            do
            {
                u8g.drawStr(44,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);
            else
                sprintf(str2,"ID=%d",ID_NUM);
            u8g.firstPage();
            do
            {
                u8g.drawStr(44,62,str2);

            }
            while(u8g.nextPage());

        }
        if(key_num==1)
            goto MENU ; //返回主页面
        if(key_num==5)
        {
            key_num=0;
            ensure=finger.emptyDatabase();//清空指纹库
            if(ensure==0)
            {
                u8g.firstPage();
                do
                {
                    u8g.drawXBMP(8,16,80,16,State17);  //显示字模汉字
                    u8g.drawXBMP(88,16,32,16,State19);  //显示字模汉字
                }
                while(u8g.nextPage());

            }
            else
            {
                u8g.firstPage();
                do
                {
                    u8g.drawXBMP(8,16,80,16,State17);  //显示字模汉字
                    u8g.drawXBMP(88,16,32,16,State20);  //显示字模汉字

                }
                while(u8g.nextPage());

            }
            delay(1500);
            goto MENU ; //返回主页面
        }
    }
    ensure=finger.deleteModel(ID_NUM);//删除单个指纹
    if(ensure==0)
    {
        u8g.firstPage();
        do
        {
            u8g.drawXBMP(16,16,64,16,State18);  //显示字模汉字
            u8g.drawXBMP(80,16,32,16,State19);  //显示字模汉字
        }
        while(u8g.nextPage());


    }
    else
    {
        u8g.firstPage();
        do
        {
            u8g.drawXBMP(16,16,64,16,State18);  //显示字模汉字
            u8g.drawXBMP(80,16,32,16,State20);  //显示字模汉字

        }
        while(u8g.nextPage());

    }
    delay(1500);
MENU:
    key_num=0;
}


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); //开启串口通信 波特率9600
    finger.begin(57600); //设置AS608波特率 57600
    MENU();
}

void loop()
{

    key_num = key_scan(0);
    if(key_num == 1)            //按下K1键 调用Add_FR()
    {
        key_num = 0;
        Add_FR();
        MENU();
    }

    if(key_num == 2)            //按下K2键 调用Del_FR();
    {
        key_num = 0;
        Del_FR();
        MENU();
    }

    if(key_num == 3)            //按下K3键 调用Press_FR()
    {
        key_num = 0;
        Press_FR();
        MENU();
    }
}

完整代码在文章底部下载

成功将代码刷入

程序流程图:

2. 硬件接线

烧录完成后就可以接线了,接线图:

然后就可以开机咯

至此教程结束,接下来就是安装问题。考验你的动手能力时候到了 title=

材料和参考:

100元制作宿舍指纹解锁门禁 来自:aiwyq

指纹代码文件

原作者视频教程 100元制作宿舍指纹解锁门禁

如果觉得我的文章对你有用,可以赞助本站,使本站更好的发展