门禁锁加装指纹及联网控制功能

设计说明
指纹锁在原先的基础上再增加联网控制功能,可以用手机来控制开锁。
相比原先的方案,电路方面有两个较大的改变。
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原创,转载请附上本文网址。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值