设计说明
指纹锁在原先的基础上再增加联网控制功能,可以用手机来控制开锁。
相比原先的方案,电路方面有两个较大的改变。
1、 第一个就是把执行开锁程序的主控由STC15w204s换成ESP12F(ESP8266) WIFI芯片,ESP8266内部集成了主控,可以对其进行编程写入程序,来控制相关GPIO引脚。从而实现开锁关锁的功能。
2、 第二就是电路加入了3.3V和3.73V稳压,因为门锁的直接供电电压是8.35V,所以通过AMS1117-3.3来给ESP8266供电,并使用AMS1117-ADJ调出3.7V左右的电压给指纹模块和STC15w204s供电。
3.7V的电压直接接到指纹模块的电池接口,而不是接到5V的充电口,这样指纹模块在没有检测到手指时就进入低功耗待机状态。
3、 其次指纹模块里的单片机代码也进行了修改,增加了掉电功能,并通过中断唤醒,在没有开锁指令时就单片机就进入低功耗掉电模式,使总体功耗降低,并减少了发热量。
物联网方案采用了蓝灯科技的接口进行通信,代码采用Arduino安装ESP8266库和Blinker库进行编写。
电路连接是用AD画的STC15最小系统板进行连接。当然也可以采用洞洞板或搭焊的方式进行连接。
本装置安全性不高,仅用于技术学习,若您使用本装置造成了经济损失,后果自负。
总体电路连接图。
其他相关可以参考我之前发的文章门禁锁加装指纹功能
我是将元件焊接在PCB板上再进行连接。
ESP8266相关,采用电灯科技的方案,并且添加了小爱同学控制,有关小爱同学详情见https://diandeng.tech/doc/xiaoai

ESP8266程序代码
#define BLINKER_MIOT_LIGHT
  • #define BLINKER_WIFI
  • #define AB 0x00     //设置密码第一位
  • #define BB 0x00     //设置密码第二位
  • #define CB 0x00     //设置密码第三位
  • #define DB 0x00     //设置密码第四位
  • #define EB 0x00     //设置密码第五位
  • #define FB 0x00     //设置密码第六位
  • #include <Blinker.h>
  • char auth[] = "******";  //设备key,打开点灯app,添加设备,选择arduino设备,选择wifi接入,这里就会获得一个密钥,把密钥填写在这里。
  • char ssid[] = "*******";  //路由器wifi ssid
  • char pswd[] = "*******";  //路由器wifi 密码
  • int a;
  • int i;
  • int GPIO=12;//定义GPIO口用于控制电机驱动
  • int GPIO2=13;
  • #define BUTTON_1 "ButtonKey"
  • BlinkerButton Button1("key1");//这里需要根据自己在BLINKER里面设置的名字进行更改
  • char mima[6];
  • char num[1];
  • void kaisuo()       //开锁函数
  • {
  •          digitalWrite(GPIO, HIGH);
  •          digitalWrite(GPIO2, LOW);
  •          Blinker.delay(210);
  •          digitalWrite(GPIO, LOW);
  •          digitalWrite(GPIO2, LOW);
  •          Blinker.delay(4500);
  •          digitalWrite(GPIO, LOW);
  •          digitalWrite(GPIO2, HIGH);
  •          Blinker.delay(210);
  •          digitalWrite(GPIO, LOW);
  •          digitalWrite(GPIO2, LOW);
  • }
  • void passclean(void)     //密码清除函数
  • {
  •             i = 0;
  •         for (i = 0; i < 6; i++)  //for循环赋值  
  •         {   
  •           mima[i] = 0x00;  
  •         }
  • }
  • void button1_callback(const String & state)                        //电灯APP控制响应函数
  • {
  •     BLINKER_LOG("get button state: ", state);
  •   if (state == BLINKER_CMD_ON) {
  •    
  •          kaisuo();
  •         BlinkerMIOT.powerState("on");
  •         BlinkerMIOT.print();
  •     }
  • }
  • void miotPowerState(const String & state)                        //小米小爱同学控制响应函数
  • {
  •     BLINKER_LOG("need set power state: ",state);
  •    if (state == BLINKER_CMD_ON) {
  •         kaisuo();
  •         BlinkerMIOT.powerState("on");
  •         BlinkerMIOT.print();
  •     }
  • }
  • void setup() {
  •     Serial.begin(9600);
  •     pinMode(GPIO,OUTPUT);
  •     pinMode(GPIO2,OUTPUT);
  •     digitalWrite(GPIO2,LOW);
  •     digitalWrite(GPIO,LOW);
  •     Blinker.begin(auth, ssid, pswd);
  •     Button1.attach(button1_callback);
  •     BlinkerMIOT.attachPowerState(miotPowerState);//这段代码一定要加,不加小爱同学控制不了,务必在回调函数中反馈该控制状态
  • }
  • void loop()
  • {
  •     Blinker.run();
  •     while(Serial.available()>0){
  •      
  •         num[1]=Serial.read();
  •         Serial.println(mima[a]);
  •       if(num[1]==AB){       //判断接受到的数据是否符合密码A位,若符合,则将密码放入到pass数组第一位里。
  •     mima[0] = num[1];    //以下同理
  •     }
  •       else if(num[1]==BB){
  •     mima[1]= num[1];
  •     }                  
  •     else if(num[1]==CB){
  •     mima[2]= num[1];
  •     }
  •     else if(num[1]==DB){
  •     mima[3]= num[1];
  •     }
  •     else if(num[1]==EB){
  •     mima[4]= num[1];
  •     }
  •     else if(num[1]==FB){
  •     mima[5]= num[1];
  •     }
  •     else
  •     {
  •     passclean();  //清空已接收的密码。
  •     }
  •       
  •       if((mima[0] == AB)&&(mima[1]==BB)&&(mima[2]==CB)&&(mima[3]==DB)&&(mima[4]==EB)&&(mima[5]==FB)){                //若密码符合则清空已接收的密码并执行开锁函数
  •         Serial.println("ok");
  •         passclean();
  •         kaisuo();
  •         
  •       }
  •   }
  • }
  • 复制代码
    STC15W204S程序
    //使用了STC的资料及范例程序
  • #include<STC15.h>
  • #include "intrins.h"
  • sbit key = P3^3;
  • sbit INT1 = 0xB3;
  • //bit FLAG;                       //1:上升沿中断 0:下降沿中断
  • #define A 0x00           //设置密码第一位        十六进制数,比如0x22,0x89,0xEF,0x3F
  • #define B 0x00           //设置密码第二位
  • #define C 0x00           //设置密码第三位
  • #define D 0x00           //设置密码第四位
  • #define E 0x00           //设置密码第五位
  • #define F 0x00           //设置密码第六位
  • unsigned char code tab[]={A,B,C,D,E,F};           //密码
  • void send(unsigned char dat)            //数据发送程序         一次发送8位,比如0x22,对应的8位二进制为00010110
  • {
  •            SBUF=dat;                           //将要发送的数据存入发送缓冲器中
  •         while(TI==0);                       //若发送中断标志位没有置1(正在发送数据),就等待
  •         TI=0;                               //若发送完成,TI自动置1,这里把它清零
  • }
  •                        
  • void delay(unsigned int ms)                        //延时函数
  • {
  • unsigned int i,j;
  •         for(i=ms;i>0;i--)
  •         for(j=892;j>0;j--);
  • }      
  • void exint1() interrupt 1       //INT1中断入口
  • {
  •                                  
  •         unsigned int k;
  •            if(key==1)
  •                 {
  •                 delay(10);
  •                 if(key==1)
  •                 {
  •                         for(k=0;k<6;k++)               
  •                         {
  •                                 send(tab[k]);              //发送数据
  •                                 delay(1);               
  •                         }
  •                         delay(5000);
  •                 }
  •                 }
  • }
  • void main(void)
  • {
  •         TMOD=0x20;                         //定时器T工作于方式2(可自动重装的8位定时器)
  •         SCON=0x40;                         //串口工作方式1,不允许接收
  •         PCON=0x00;
  •         AUXR |=0X01;                                             //启动定时器T2
  •         AUXR |=0X04;                         //波特率不倍增
  •         T2L =0xE0;                          //波特率为9600b/s
  •         T2H =0xFE;
  •         AUXR |= 0X10;                                       
  •         key = 0;  
  •         P0M0 = 0x00;
  •     P0M1 = 0x00;
  •     P1M0 = 0x00;
  •     P1M1 = 0x00;
  •     P2M0 = 0x00;
  •     P2M1 = 0x00;
  •     P3M0 = 0x00;
  •     P3M1 = 0x00;
  •     P4M0 = 0x00;
  •     P4M1 = 0x00;
  •     P5M0 = 0x00;
  •     P5M1 = 0x00;
  •     P6M0 = 0x00;
  •     P6M1 = 0x00;
  •     P7M0 = 0x00;
  •     P7M1 = 0x00;
  •     IT1 = 0;                    //设置INT1的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
  • // IT1 = 1;                    //设置INT1的中断类型为仅下降沿,下降沿唤醒
  •     EX1 = 1;                    //使能INT1中断
  •     EA = 1;                          
  •         while(1)
  •         {
  •                 PCON = 0x02;            //MCU进入掉电模式
  •         _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  •        _nop_();
  •         }
  • }
  • 复制代码

    电机驱动我采用的是MX608E芯片相关电路如下
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg
    STC15W204S最小系统PCB板相关
    相关PCB文件放在帖子最后。
    当PCB板焊接上AMS1117-ADJ后电阻R3不用焊接。
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg

    和SOP8引脚的一样,当接入AMS1117后,R1电阻不用焊接。
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwMDE4NzE3,size_16,color_FFFFFF,t_70.jpg