智能门锁
一、项目背景
在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。
二、项目功能介绍
1.可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上
2.在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动直流电机
3.可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
4.实现RFID与手机解锁(蓝牙解锁)
5.系统支持低功耗处理
项目所用到的技术:
1.IIC协议、SPI协议、串口协议
2.外部flash驱动
3.RTC实时时钟
三、元件准备
1、直流电机
2、4X4矩阵按键
3、指纹模块AS608(串口控制)
4、0.96寸OLED显示屏(IIC)
5、蓝牙模块HC-05
6、主控芯片STM32F407ZET6
7、RFID RC522 射频模块
8、杜邦线
四、项目设计
(一)原理图设计
(二)硬件设计
(三)程序设计
由于代码过长只展示部分代码文章来源:https://www.toymoban.com/news/detail-511276.html
#include "stm32f4xx.h"
#include "beep.h"
#include "key.h"
#include "delay.h"
#include "led.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"
#include "sr04.h"
#include "dht11.h"
#include "iwdg.h"
#include "exti.h"
#include "adc.h"
//#include "iic.h"
#include "usart2.h"
#include "door.h"
SysPara AS608Para;//指纹模块AS608参数
u16 ValidN;//模块内有效指纹个数
unsigned char i;
u8 rx_flag = 0; //rx_flag = 1表示接受数据完成
u8 rx_data = 0;
char buffer[32] = {0}, rx_buffer[32] = {0};
u8 count = 0, rx_i = 0;
#define usart2_baund 57600//串口2波特率,根据指纹模块波特率更改
u16 sleeptime = 0;//休眠时间
void USART1_IRQHandler(void)
{
//判断接收中断标志是否为1
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//清空标志位
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//接受数据 先赋值再加
buffer[count++] = USART_ReceiveData(USART1);
//判断接受的字符是否为 ':'
if(buffer[count-1] == ':')
{
//buffer循环赋值给rx_buffer, 但不需要赋值':' 过滤结束标志
for(rx_i=0; rx_i<(count-1); rx_i++)
{
rx_buffer[rx_i] = buffer[rx_i];
}
memset(buffer, 0, sizeof(buffer));
//确保下一帧存放位置从buffer[0]开始
count = 0;
rx_flag = 1;
}
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
int i = 0;
extern const unsigned char BMP1[];
u8 key_num = 16,ensure;
Delay_Init();
My_RTC_Init(); //初始化RTC
Walkmotor_Init();
Led_Init();
//指纹串口2
usart2_init(usart2_baund);
Usart1_Init(9600);
//4*4矩阵键盘
Keyborad_Init();
//OLED显示屏
I2C_Configuration();
OLED_Init();
OLED_CLS();
//NFC
MFRC522_Initializtion();
AntennaOff();
PS_StaGPIO_Init(); //初始化FR读状态引脚
OLED_CLS();
//未检测到模块
while(PS_HandShake(&AS608Addr))//与AS608模块握手
{
printf("woshou\r\n");
OLED_CLS();
OLED_ShowStr(32,4,"Error",1);
delay_s(2);
OLED_CLS();
OLED_ShowStr(8,4,"Wait...",2);
delay_s(2);
}
OLED_CLS();
OLED_ShowStr(40,3,"Hello!",2);
ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
ensure=PS_ReadSysPara(&AS608Para); //读参数
delay_s(1);
OLED_CLS();
while(1)
{
MAIN: //A 10 B 11 C 12 D 13 * 14 # 15
//蓝牙解锁
if(rx_flag == 1)
{
printf("rx_buffer:%s\r\n", rx_buffer);
if(strcmp(rx_buffer, "open") == 0)
{
LED0_ON;
OLED_CLS();//清屏
//解锁中
for(i=11;i<14;i++)
{
OLED_ShowCN(32+(i-11)*16,3,i);//测试显示中文
}
OLED_ShowStr(80,3,"...",2);
//开锁
Walkmotor_ON();
OLED_CLS();//清屏
//已解锁
for(i=10;i<13;i++)
{
OLED_ShowCN(32+(i-10)*16,3,i);//测试显示中文
}
OLED_ShowStr(80,3,"!",2);
delay_s(1);
Menu();
}
if(strcmp(rx_buffer, "close") == 0)
{
Walkmotor_OFF();
LED0_OFF;
//解锁失败
}
//清空数组
// memset(rx_buffer, 0, sizeof(rx_buffer));
rx_flag = 0;
}
if(PS_Sta) //检测PS_Sta状态,如果有手指按下
{
delay_ms(20);
press_FR();//刷指纹
}
for(i=0;i<4;i++)
{
OLED_ShowCN(32+i*16,0,i);//测试显示中文
}
key_num = Key_scan();
Display_Data();
sleeptime++;
//超时锁屏
/*******************************************************/
if(sleeptime == 70)
{
OLED_OFF();//测试OLED休眠
}
if(key_num == 15)
{
OLED_ON();
sleeptime = 0;
}
/*******************************************************/
if(key_num != 16 && key_num != 15)
{
OLED_CLS();
while(1)
{
key_num = Key_scan();
//智能门锁
for(i=0;i<4;i++)
{
OLED_ShowCN(32+i*16,0,i);//测试显示中文
}
//数字
for(i=4;i<6;i++)
{
OLED_ShowCN(16+(i-4)*16,3,i);//测试显示中文
}
//指纹
for(i=6;i<8;i++)
{
OLED_ShowCN(80+(i-6)*16,3,i);//测试显示中文
}
//卡片
for(i=8;i<10;i++)
{
OLED_ShowCN(16+(i-8)*16,6,i);//测试显示中文
}
OLED_ShowStr(80,6,"D:QUIT",2);
switch (key_num )
{
case 10: //数字密码
{
OLED_ShowStr(0,3,"->",2);
while(1)
{
key_num = Key_scan();
if(key_num == 15)
{
OLED_CLS();
password();
break ;
}
if(key_num == 14)
{
OLED_CLS();
break ;
}
}
break ;
}
case 11: //指纹解锁
{
OLED_ShowStr(64,3,"->",2);
while(1)
{
key_num = Key_scan();
if(key_num == 15)
{
OLED_CLS();
//请按指纹
for(i=38;i<40;i++)
{
OLED_ShowCN(32+(i-38)*16,3,i);//测试显示中文
}
for(i=6;i<8;i++)
{
OLED_ShowCN(64+(i-6)*16,3,i);//测试显示中文
}
delay_s(2);
if(PS_Sta) //检测PS_Sta状态,如果有手指按下
{
press_FR();//刷指纹
break ;
}
}
if(key_num == 14)
{
OLED_CLS();
break ;
}
}
break ;
}
case 12:
{
OLED_ShowStr(0,6,"->",2);
while(1)
{
key_num = Key_scan();
if(key_num == 15)
{
OLED_CLS();
//请刷卡片
for(i=38;i<39;i++)
{
OLED_ShowCN(32+(i-38)*16,3,i);//测试显示中文
}
for(i=40;i<41;i++)
{
OLED_ShowCN(48+(i-40)*16,3,i);//测试显示中文
}
for(i=8;i<10;i++)
{
OLED_ShowCN(64+(i-8)*16,3,i);//测试显示中文
}
delay_s(1);
MFRC522Test();
OLED_CLS();
break;
}
if(key_num == 14)
{
OLED_CLS();
break ;
}
}
break ;
}
case 13:
{
OLED_ShowStr(64,6,"->",2);
while(1)
{
key_num = Key_scan();
if(key_num == 15)
{
OLED_CLS();
goto MAIN;
}
if(key_num == 14)
{
OLED_CLS();
break ;
}
}
break ;
}
}
}
}
delay_ms(20);
}
}
五、项目展示
【基于STM32F4智能门锁】 https://www.bilibili.com/video/BV1L84y1i7sP/?share_source=copy_web&vd_source=b08c2377f74ba9c4fdcaec33930efbb5文章来源地址https://www.toymoban.com/news/detail-511276.html
到了这里,关于基于STM32F407的智能门锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!