设计说明
指纹锁在原先的基础上再增加联网控制功能,可以用手机来控制开锁。
相比原先的方案,电路方面有两个较大的改变。
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程序代码
  1. #define BLINKER_MIOT_LIGHT
  2. #define BLINKER_WIFI
  3. #define AB 0x00     //设置密码第一位
  4. #define BB 0x00     //设置密码第二位
  5. #define CB 0x00     //设置密码第三位
  6. #define DB 0x00     //设置密码第四位
  7. #define EB 0x00     //设置密码第五位
  8. #define FB 0x00     //设置密码第六位
  9. #include <Blinker.h>
  10. char auth[] = "******";  //设备key,打开点灯app,添加设备,选择arduino设备,选择wifi接入,这里就会获得一个密钥,把密钥填写在这里。
  11. char ssid[] = "*******";  //路由器wifi ssid
  12. char pswd[] = "*******";  //路由器wifi 密码
  13. int a;
  14. int i;
  15. int GPIO=12;//定义GPIO口用于控制电机驱动
  16. int GPIO2=13;
  17. #define BUTTON_1 "ButtonKey"
  18. BlinkerButton Button1("key1");//这里需要根据自己在BLINKER里面设置的名字进行更改
  19. char mima[6];
  20. char num[1];
  21. void kaisuo()       //开锁函数
  22. {
  23.          digitalWrite(GPIO, HIGH);
  24.          digitalWrite(GPIO2, LOW);
  25.          Blinker.delay(210);
  26.          digitalWrite(GPIO, LOW);
  27.          digitalWrite(GPIO2, LOW);
  28.          Blinker.delay(4500);
  29.          digitalWrite(GPIO, LOW);
  30.          digitalWrite(GPIO2, HIGH);
  31.          Blinker.delay(210);
  32.          digitalWrite(GPIO, LOW);
  33.          digitalWrite(GPIO2, LOW);
  34. }
  35. void passclean(void)     //密码清除函数
  36. {
  37.             i = 0;
  38.         for (i = 0; i < 6; i++)  //for循环赋值  
  39.         {   
  40.           mima[i] = 0x00;  
  41.         }
  42. }
  43. void button1_callback(const String & state)                        //电灯APP控制响应函数
  44. {
  45.     BLINKER_LOG("get button state: ", state);
  46.   if (state == BLINKER_CMD_ON) {
  47.    
  48.          kaisuo();
  49.         BlinkerMIOT.powerState("on");
  50.         BlinkerMIOT.print();
  51.     }
  52. }
  53. void miotPowerState(const String & state)                        //小米小爱同学控制响应函数
  54. {
  55.     BLINKER_LOG("need set power state: ",state);
  56.    if (state == BLINKER_CMD_ON) {
  57.         kaisuo();
  58.         BlinkerMIOT.powerState("on");
  59.         BlinkerMIOT.print();
  60.     }
  61. }
  62. void setup() {
  63.     Serial.begin(9600);
  64.     pinMode(GPIO,OUTPUT);
  65.     pinMode(GPIO2,OUTPUT);
  66.     digitalWrite(GPIO2,LOW);
  67.     digitalWrite(GPIO,LOW);
  68.     Blinker.begin(auth, ssid, pswd);
  69.     Button1.attach(button1_callback);
  70.     BlinkerMIOT.attachPowerState(miotPowerState);//这段代码一定要加,不加小爱同学控制不了,务必在回调函数中反馈该控制状态
  71. }
  72. void loop()
  73. {
  74.     Blinker.run();
  75.     while(Serial.available()>0){
  76.      
  77.         num[1]=Serial.read();
  78.         Serial.println(mima[a]);
  79.       if(num[1]==AB){       //判断接受到的数据是否符合密码A位,若符合,则将密码放入到pass数组第一位里。
  80.     mima[0] = num[1];    //以下同理
  81.     }
  82.       else if(num[1]==BB){
  83.     mima[1]= num[1];
  84.     }                  
  85.     else if(num[1]==CB){
  86.     mima[2]= num[1];
  87.     }
  88.     else if(num[1]==DB){
  89.     mima[3]= num[1];
  90.     }
  91.     else if(num[1]==EB){
  92.     mima[4]= num[1];
  93.     }
  94.     else if(num[1]==FB){
  95.     mima[5]= num[1];
  96.     }
  97.     else
  98.     {
  99.     passclean();  //清空已接收的密码。
  100.     }
  101.       
  102.       if((mima[0] == AB)&&(mima[1]==BB)&&(mima[2]==CB)&&(mima[3]==DB)&&(mima[4]==EB)&&(mima[5]==FB)){                //若密码符合则清空已接收的密码并执行开锁函数
  103.         Serial.println("ok");
  104.         passclean();
  105.         kaisuo();
  106.         
  107.       }
  108.   }
  109. }
STC15W204S程序
  1. //使用了STC的资料及范例程序
  2. #include<STC15.h>
  3. #include "intrins.h"
  4. sbit key = P3^3;
  5. sbit INT1 = 0xB3;
  6. //bit FLAG;                       //1:上升沿中断 0:下降沿中断
  7. #define A 0x00           //设置密码第一位        十六进制数,比如0x22,0x89,0xEF,0x3F
  8. #define B 0x00           //设置密码第二位
  9. #define C 0x00           //设置密码第三位
  10. #define D 0x00           //设置密码第四位
  11. #define E 0x00           //设置密码第五位
  12. #define F 0x00           //设置密码第六位
  13. unsigned char code tab[]={A,B,C,D,E,F};           //密码
  14. void send(unsigned char dat)            //数据发送程序         一次发送8位,比如0x22,对应的8位二进制为00010110
  15. {
  16.            SBUF=dat;                           //将要发送的数据存入发送缓冲器中
  17.         while(TI==0);                       //若发送中断标志位没有置1(正在发送数据),就等待
  18.         TI=0;                               //若发送完成,TI自动置1,这里把它清零
  19. }
  20.                        
  21. void delay(unsigned int ms)                        //延时函数
  22. {
  23. unsigned int i,j;
  24.         for(i=ms;i>0;i--)
  25.         for(j=892;j>0;j--);
  26. }      
  27. void exint1() interrupt 1       //INT1中断入口
  28. {
  29.                                  
  30.         unsigned int k;
  31.            if(key==1)
  32.                 {
  33.                 delay(10);
  34.                 if(key==1)
  35.                 {
  36.                         for(k=0;k<6;k++)               
  37.                         {
  38.                                 send(tab[k]);              //发送数据
  39.                                 delay(1);               
  40.                         }
  41.                         delay(5000);
  42.                 }
  43.                 }
  44. }
  45. void main(void)
  46. {
  47.         TMOD=0x20;                         //定时器T工作于方式2(可自动重装的8位定时器)
  48.         SCON=0x40;                         //串口工作方式1,不允许接收
  49.         PCON=0x00;
  50.         AUXR |=0X01;                                             //启动定时器T2
  51.         AUXR |=0X04;                         //波特率不倍增
  52.         T2L =0xE0;                          //波特率为9600b/s
  53.         T2H =0xFE;
  54.         AUXR |= 0X10;                                       
  55.         key = 0;  
  56.         P0M0 = 0x00;
  57.     P0M1 = 0x00;
  58.     P1M0 = 0x00;
  59.     P1M1 = 0x00;
  60.     P2M0 = 0x00;
  61.     P2M1 = 0x00;
  62.     P3M0 = 0x00;
  63.     P3M1 = 0x00;
  64.     P4M0 = 0x00;
  65.     P4M1 = 0x00;
  66.     P5M0 = 0x00;
  67.     P5M1 = 0x00;
  68.     P6M0 = 0x00;
  69.     P6M1 = 0x00;
  70.     P7M0 = 0x00;
  71.     P7M1 = 0x00;
  72.     IT1 = 0;                    //设置INT1的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
  73. // IT1 = 1;                    //设置INT1的中断类型为仅下降沿,下降沿唤醒
  74.     EX1 = 1;                    //使能INT1中断
  75.     EA = 1;                          
  76.         while(1)
  77.         {
  78.                 PCON = 0x02;            //MCU进入掉电模式
  79.         _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  80.        _nop_();
  81.         }
  82. }

电机驱动我采用的是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