打印
[STM32F4]

基于stm32f4的智能门锁

[复制链接]
383|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ym0sly|  楼主 | 2024-7-30 11:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
项目背景
在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。


项目功能要求
1、可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上
2、在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动步进电机一圈
3、可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
4、实现RFID与手机解锁(蓝牙解锁)
5、扩展:虚位密码解锁(虚位密码:自己百度)

项目所用到的主要技术:
1、IIC协议、SPI协议、串口协议
2、外部flash驱动、SD卡驱动
3、FTAFS文件系统
4、RTC实时时钟



使用特权

评论回复
沙发
ym0sly|  楼主 | 2024-7-30 11:28 | 只看该作者
元件准备
1、步进电机(带驱动模块)
型号:28BYJ4+ULN2003

使用特权

评论回复
板凳
ym0sly|  楼主 | 2024-7-30 11:31 | 只看该作者
4X4矩阵按键

使用特权

评论回复
地板
ym0sly|  楼主 | 2024-7-30 11:31 | 只看该作者
指纹模块AS608(串口控制

使用特权

评论回复
5
ym0sly|  楼主 | 2024-7-30 11:32 | 只看该作者
0.96寸OLED显示屏(IIC)
型号:7针

使用特权

评论回复
6
ym0sly|  楼主 | 2024-7-30 11:33 | 只看该作者
蓝牙模块HC-05

使用特权

评论回复
7
ym0sly|  楼主 | 2024-7-30 11:34 | 只看该作者
主控芯片STM32F407ZGT6
型号:普中最小系统板

使用特权

评论回复
8
ym0sly|  楼主 | 2024-7-30 11:34 | 只看该作者
RFID RC522 射频模块(带一张卡片) 杜邦线

使用特权

评论回复
9
ym0sly|  楼主 | 2024-7-30 11:35 | 只看该作者
项目设计
(一)原理图设计


使用特权

评论回复
10
ym0sly|  楼主 | 2024-7-30 11:36 | 只看该作者

使用特权

评论回复
11
ym0sly|  楼主 | 2024-7-30 11:36 | 只看该作者

项目所用到的主要技术:
1、IIC协议、SPI协议、串口协议
2、外部flash驱动、SD卡驱动
3、FTAFS文件系统
4、RTC实时时钟

使用特权

评论回复
12
ym0sly|  楼主 | 2024-7-30 11:36 | 只看该作者
硬件设计
根据原理图连接好硬件电路

使用特权

评论回复
13
ym0sly|  楼主 | 2024-7-30 11:36 | 只看该作者
程序设计
由于代码过长只展示部分代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "sram.h"   
#include "malloc.h"
#include "sdio_sdcard.h"   
#include "malloc.h"
#include "w25qxx.h"   
#include "ff.h"  
#include "exfuns.h"   
#include "fontupd.h"
#include "text.h"       
#include "oled.h"
#include "beep.h"
#include "button4_4.h"
#include "AS608.h"
#include "walkmotor.h"
#include "usart2.h"
#include "rtc.h"
#include "MFRC522.h"
#include "usart3.h"       
#include "stmflash.h"

#define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改

//要写入到STM32 FLASH的字符串数组
const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};
#define TEXT_LENTH sizeof(TEXT_Buffer)                                   //数组长度       
#define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
#define FLASH_SAVE_ADDR  0X0802C124         //设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区.
                                                                                //否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机.

SysPara AS608Para;//指纹模块AS608参数
u16 ValidN;//模块内有效指纹个数
u8** kbd_tbl;

void Display_Data(void);//显示时间
void Add_FR(void);        //录指纹
void Del_FR(void);        //删除指纹
int press_FR(void);//刷指纹
void ShowErrMessage(u8 ensure);//显示确认码错误信息
int password(void);//密码锁
void SetPassworld(void);//修改密码
void starting(void);//开机界面信息
u8 MFRC522_lock(void);//刷卡解锁
u8 Add_Rfid(void);                //录入
void Set_Time(void);
void Massige(void);
u8 Pwd[7]="      ";  //解锁密码1
u8 Pwd2[7]="      ";  //解锁密码2
u8 cardid[6]={0,0,0,0,0,0};  //卡号1
int Error;  //密码验证信息


//数字的ASCII码
uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//显示缓冲区
u8  dispnumber5buf[6];
u8  dispnumber3buf[4];
u8  dispnumber2buf[3];
//MFRC522数据区
u8  mfrc552pidbuf[18];
u8  card_pydebuf[2];
u8  card_numberbuf[5];
u8  card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8  card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
u8  card_readbuf[18];
//SM05-S数据区
u8  sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
//extern声明变量已在外部的C文件里定义,可以在主文件中使用
extern u8  sm05receivebuf[16];        //在中断C文件里定义
extern u8  sm05_OK;                                                        //在中断C文件里定义

u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
u8 * setup[7]={"1、录入指纹","2、删除指纹","3、修改密码","4、修改时间","5、录入卡片","6、查看信息"};

int main(void)
{
        u16 set=0;
        int key_num;
        int time1;
        int time2;                //锁屏时间
        char arrow=0;  //箭头位子
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        My_RTC_Init();                                 //初始化RTC
        RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);                //配置WAKE UP中断,1秒钟中断一次
        delay_init(168);  //初始化延时函数
        uart_init(115200);        //初始化串口1波特率为115200,用于支持USMART
        uart3_init(9600);// 蓝牙初始化
        usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
        PS_StaGPIO_Init();        //初始化FR读状态引脚
        LED_Init();                                        //初始化LED  
//        BEEP_Init();                    //beep初始化
        Button4_4_Init();//矩阵按键初始化
        OLED_Init();                         //oled初始化
        W25QXX_Init();                                //初始化W25Q128
       
        Walkmotor_Init(); //步进电机初始化
        my_mem_init(SRAMIN);                //初始化内部内存池
        my_mem_init(SRAMCCM);                //初始化CCM内存池
        exfuns_init();                                //为fatfs相关变量申请内存  
         f_mount(fs[0],"0:",1);                 //挂载SD卡
        f_mount(fs[1],"1:",1);                 //挂载FLASH.
        starting();//开机信息  **

        STMFLASH_Read(0X08020004,(u32*)Pwd,2);        //读取密码1
        STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //读取密码2
        STMFLASH_Read(0X080f0004,(u32*)cardid,1); //读取卡号1
         while(1)
         {
//锁屏界面
MAIN:
                        OLED_Show_Font(56,48,0);//显示锁图标
                        while(1)
                        {
                                time1++;
                                if((time1%200)==0)//时间显示:每50ms更新一次显示数据
                                {
                                        Display_Data();
                                }
                                if((time1%1000)==0)//每200ms检测一次卡片,蓝牙数据
                                {
                                        //MFRC522解锁
                                        MFRC522_Initializtion();                       
                                        Error=MFRC522_lock();
                                        if(Error==0)goto MENU;       
                                        else
                                                OLED_Show_Font(56,48,0);//锁
                                        //手机蓝牙解锁密码1
                                        Error=usart3_cherk((char*)Pwd);         
                                        if(Error==0){
                                                OLED_Clear();
                                                Show_Str(20,10,128,24,"解锁中...",24,0);       
                                                Walkmotor_ON();
                                                Show_Str(20,10,128,24,"已解锁!",24,0);
                                                goto MENU;       
                                        }
                                        else
                                                OLED_Show_Font(56,48,0);//锁
                                        //手机蓝牙解锁密码2
                                        Error=usart3_cherk((char*)Pwd2);
                                        if(Error==0){
                                                OLED_Clear();
                                                Show_Str(20,10,128,24,"解锁中...",24,0);       
                                                Walkmotor_ON();
                                                Show_Str(20,10,128,24,"已解锁!",24,0);
                                                goto MENU;       
                                        }
                                        else
                                                OLED_Show_Font(56,48,0);//锁
                                       
                                }
                                //指纹解锁
                                if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
                                {
                                                while(PS_Sta){
                                                Error=press_FR();//刷指纹
                                                if(Error==0)goto MENU;
                                                else
                                                        OLED_Show_Font(56,48,0);//锁
                                        }
                                }
                                //密码锁
                                key_num=Button4_4_Scan();        //按键扫描
                                if(key_num!=-1)
                                {
                                        Error=password();
                                        if(Error==0)goto MENU;       
                                        else
                                                OLED_Show_Font(56,48,0);//锁
                                }
                        }

使用特权

评论回复
14
ym0sly|  楼主 | 2024-7-30 11:37 | 只看该作者
上机调试
把硬件连接好之后还需要做一些准备工作:
录入指纹:
(1)程序下载之前需要给门禁一个解锁方式,门锁一共有4种解锁方式:指纹、蓝牙、卡片、密码。其中卡片需要录入过系统的才可以解锁,密码一开始保存在stm32内部flash中,内部flash做eeprom需要先初始化,解锁后在设置中更改密码或者在代码中进行初始化密码,不然密码是乱码。
(2)串口录入指纹:将串口转TTL CH340模块连接好指纹模块,用配套上位机录入自己的一个指纹。详细连接方法参考指纹模块资料
(3)解锁后就可以进行设置密码和录入卡片等操作

使用特权

评论回复
15
ym0sly|  楼主 | 2024-7-30 11:37 | 只看该作者
移植汉字库:(如果没有SD卡接口可以自己汉字取模显示)
(1)准备一个sd卡,一个读卡器,用来存储汉字库,显示到OLED
(2)找到开发资料下的SYSTEM文件夹

使用特权

评论回复
16
ym0sly|  楼主 | 2024-7-30 11:38 | 只看该作者

3)把SYSTEM文件夹复制到SD卡根目录下(一定要是根目录下)

使用特权

评论回复
17
ym0sly|  楼主 | 2024-7-30 11:38 | 只看该作者


(4)复制好之后吧SD卡插到开发板
(5)下载程序到开发板启动,如果可以显示汉字说已经移植成功。(注意:开始的化作尘&指纹锁界面是显示的图片,并不是汉字字体)

使用特权

评论回复
18
ym0sly|  楼主 | 2024-7-30 11:38 | 只看该作者
一般遇到的问题:

如果进去只显示“化作尘指纹锁”然后黑屏,那么是字库的问题
如果因为不知道密码进不去主界面,那么打开代码,将密码打印出来,然后就可以用密码解锁了,一共两个密码,任意一个都可以解锁:

因为没有考虑到字符不全是’0’- '9’的关系,密码打印出来不是数字,所以查看密码不成功

使用特权

评论回复
19
ym0sly|  楼主 | 2024-7-30 11:38 | 只看该作者
正确打开方式
步骤一:直接给密码赋值操作,然后编译下载,下载完成后输入密码“123456”是肯定可以进主界面的,然后点击修改密码,密码修改为你想要的密码“000111”,这个密码会保存到内部eeprom
,密码初始化就完成了

1、在127行加入如下代码编译下载

使用特权

评论回复
20
ym0sly|  楼主 | 2024-7-30 11:39 | 只看该作者
输入密码“123456”解锁


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

316

帖子

2

粉丝