指纹锁在原先的基础上再增加联网控制功能,可以用手机来控制开锁。
相比原先的方案,电路方面有两个较大的改变。
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();
- }
- }
- }
- //使用了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芯片相关电路如下
STC15W204S最小系统PCB板相关
相关PCB文件放在帖子最后。
当PCB板焊接上AMS1117-ADJ后电阻R3不用焊接。
和SOP8引脚的一样,当接入AMS1117后,R1电阻不用焊接。