设计说明
指纹锁在原先的基础上再增加联网控制功能,可以用手机来控制开锁。
相比原先的方案,电路方面有两个较大的改变。
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芯片相关电路如下
STC15W204S最小系统PCB板相关
相关PCB文件放在帖子最后。
当PCB板焊接上AMS1117-ADJ后电阻R3不用焊接。
和SOP8引脚的一样,当接入AMS1117后,R1电阻不用焊接。
参考文章
基于arduino用esp8266和继电器实现小爱同学开关灯
ESP8266-12F引脚接法
关联文章门禁锁加装指纹功能
点击此处下载STC15最小系统板
个人网站文章
--------------------------------本教程由光阴似水1204原创,转载请附上本文网址。