你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32项目设计:基于stm32f4的智能门锁

[复制链接]
STMCU小助手 发布时间:2022-8-15 19:57
一、项目背景
在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。

XYT~RODDVGH34KJ`94H}H}C.png

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

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

三、元件准备
1、步进电机(带驱动模块)
型号:28BYJ4+ULN2003

20200627204259600.png

2、4X4矩阵按键


RA$A1)4_EZX@TPQV7Y68`LJ.png

3、指纹模块AS608(串口控制)

4、0.96寸OLED显示屏(IIC)
型号:7针

MF3N86_UCB`5(1~0$K{THYJ.png

5、蓝牙模块HC-05

R(XAFOM63WB{J[HMWL1N~XV.png

6、主控芯片STM32F407ZGT6
型号:普中最小系统板



1@W5_5G5@}Y)RAD(`0CFD~K.png

7、RFID RC522 射频模块(带一张卡片)



C{]X1_Q53]IALFCN[YC$ZEH.png

8、杜邦线

四、项目设计
(一)原理图设计

~(PND}ZH68[T_TG}7TE41GW.png



ZA(9UI@$QLAX1_{0]3OX$PJ.png


GF3P7SIX{0}E%HX@4MFOTSP.png


(二)硬件设计
根据原理图连接好硬件电路


(%OM_R9PH@35LP]Y89~~9U7.png

(三)程序设计
由于代码过长只展示部分代码:


  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "sram.h"   
  6. #include "malloc.h"
  7. #include "sdio_sdcard.h"   
  8. #include "malloc.h"
  9. #include "w25qxx.h"   
  10. #include "ff.h"  
  11. #include "exfuns.h"   
  12. #include "fontupd.h"
  13. #include "text.h"        
  14. #include "oled.h"
  15. #include "beep.h"
  16. #include "button4_4.h"
  17. #include "AS608.h"
  18. #include "walkmotor.h"
  19. #include "usart2.h"
  20. #include "rtc.h"
  21. #include "MFRC522.h"
  22. #include "usart3.h"        
  23. #include "stmflash.h"

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

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

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

  34. void Display_Data(void);//显示时间
  35. void Add_FR(void);        //录指纹
  36. void Del_FR(void);        //删除指纹
  37. int press_FR(void);//刷指纹
  38. void ShowErrMessage(u8 ensure);//显示确认码错误信息
  39. int password(void);//密码锁
  40. void SetPassworld(void);//修改密码
  41. void starting(void);//开机界面信息
  42. u8 MFRC522_lock(void);//刷卡解锁
  43. u8 Add_Rfid(void);                //录入
  44. void Set_Time(void);
  45. void Massige(void);
  46. u8 Pwd[7]="      ";  //解锁密码1
  47. u8 Pwd2[7]="      ";  //解锁密码2
  48. u8 cardid[6]={0,0,0,0,0,0};  //卡号1
  49. int Error;  //密码验证信息


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

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

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

  99.         STMFLASH_Read(0X08020004,(u32*)Pwd,2);        //读取密码1
  100.         STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //读取密码2
  101.         STMFLASH_Read(0X080f0004,(u32*)cardid,1); //读取卡号1
  102.          while(1)
  103.          {
  104. //锁屏界面
  105. MAIN:
  106.                         OLED_Show_Font(56,48,0);//显示锁图标
  107.                         while(1)
  108.                         {
  109.                                 time1++;
  110.                                 if((time1%200)==0)//时间显示:每50ms更新一次显示数据
  111.                                 {
  112.                                         Display_Data();
  113.                                 }
  114.                                 if((time1%1000)==0)//每200ms检测一次卡片,蓝牙数据
  115.                                 {
  116.                                         //MFRC522解锁
  117.                                         MFRC522_Initializtion();                        
  118.                                         Error=MFRC522_lock();
  119.                                         if(Error==0)goto MENU;        
  120.                                         else
  121.                                                 OLED_Show_Font(56,48,0);//锁
  122.                                         //手机蓝牙解锁密码1
  123.                                         Error=usart3_cherk((char*)Pwd);         
  124.                                         if(Error==0){
  125.                                                 OLED_Clear();
  126.                                                 Show_Str(20,10,128,24,"解锁中...",24,0);        
  127.                                                 Walkmotor_ON();
  128.                                                 Show_Str(20,10,128,24,"已解锁!",24,0);
  129.                                                 goto MENU;        
  130.                                         }
  131.                                         else
  132.                                                 OLED_Show_Font(56,48,0);//锁
  133.                                         //手机蓝牙解锁密码2
  134.                                         Error=usart3_cherk((char*)Pwd2);
  135.                                         if(Error==0){
  136.                                                 OLED_Clear();
  137.                                                 Show_Str(20,10,128,24,"解锁中...",24,0);        
  138.                                                 Walkmotor_ON();
  139.                                                 Show_Str(20,10,128,24,"已解锁!",24,0);
  140.                                                 goto MENU;        
  141.                                         }
  142.                                         else
  143.                                                 OLED_Show_Font(56,48,0);//锁
  144.                                        
  145.                                 }
  146.                                 //指纹解锁
  147.                                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  148.                                 {
  149.                                                 while(PS_Sta){
  150.                                                 Error=press_FR();//刷指纹
  151.                                                 if(Error==0)goto MENU;
  152.                                                 else
  153.                                                         OLED_Show_Font(56,48,0);//锁
  154.                                         }
  155.                                 }
  156.                                 //密码锁
  157.                                 key_num=Button4_4_Scan();        //按键扫描
  158.                                 if(key_num!=-1)
  159.                                 {
  160.                                         Error=password();
  161.                                         if(Error==0)goto MENU;        
  162.                                         else
  163.                                                 OLED_Show_Font(56,48,0);//锁
  164.                                 }
  165.                         }
复制代码

五、上机调试

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



FDM_KA9COVS2VHO0)@3S3GI.png


移植汉字库:(如果没有SD卡接口可以自己汉字取模显示)
(1)准备一个sd卡,一个读卡器,用来存储汉字库,显示到OLED
(2)找到开发资料下的SYSTEM文件夹



QZB5$}XD3AI}H}JANGPLMOR.png

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



E_TOHIX0EQV[ESHT3S])B2T.png

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

一般遇到的问题:

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





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

正确打开方式
步骤一:直接给密码赋值操作,然后编译下载,下载完成后输入密码“123456”是肯定可以进主界面的,然后点击修改密码,密码修改为你想要的密码“000111”,这个密码会保存到内部eeprom
,密码初始化就完成了

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



20201221084736863.png

2、输入密码“123456”解锁





3、进入解锁后界面,选择修改密码



[VU%ID5_VH2G13Q}6_WF[EN.png

密码修改为“123456”后保存,会保存到内部eeprom

JEBSCZNJ68UTWCT7SI0[F9C.png

步骤二:把刚刚写的代码注释,重新下载进去,代码就可以正常运行了,输入刚刚设置的密码“000111”就可以解锁

20201221084803359.png

蓝牙调试
1、首先下载“蓝牙串口”APP
2、连接蓝牙后发送密码“123456::”

蓝牙发送密码不解锁?

1、可能是波特率不对
①可以通过AT指令修改蓝牙模块的波特率与单片机一样(9600),使得蓝牙模块能连接单片机(单片机代码初始化蓝牙模块的波特率一般为9600)
②可以用usb转ttl将蓝牙模块与电脑相连,打开串口助手后,用手机连接蓝牙发送数据,调节串口助手的波特率,接收到正常数据后记录波特率,这个就是蓝牙模块现在的波特率,随后将代码中初始化蓝牙模块的波特率改成这个波特率,单片机就可以正常与蓝牙模块通信
2、可能是蓝牙模块接线不对,吧tx rx对调
3、可能蓝牙模块已经损坏

开机图片取模显示
取模软件合集.rar
1、先画一张黑白的128*64分辨率的 .bmp图片



(T2J){B)$XA_9FH`)26TK_N.png

2、打开Image2Lcd软件,先打开图片,按照如下配置,点击保存,会生成取模代码

_OXZ@ERM~(R4$$B%8)_{F.png

六、知识扫盲
(一)汉字的显示

(具体代码参考正点原子“汉字显示实验”)

1、汉字的显示原理

1)学习过屏幕驱动的应该都知道,屏幕的显示无非就是在屏幕上打相应颜色的点,比如要显示一个字符 ‘A’ 那么我只需要知道 ‘A’ 相应的点阵数据就可以把它显示出来,汉字也一样。

2、汉字库

1)汉字库文件在正点原子的开发板资料->“SD卡根目录文件”中,可以到正点原子官网论坛下载



20201217190322952.png

2)汉字库有两类文件,.FON与.BIN文件,.FON代表汉字库点阵文件,.BIN表示的是编码表,与点阵一一对应,比如GBK编码的第一个字就对应着点阵里的第一个点阵数据,映射关系如下:
UNIGBK->GBK12.FON
UNIGBK->GBK24.FON
UNIGBK->GBK32.FON

有兴趣可以百度一下查看GBK编码表:

8624$RFMDQX_9VKGGPR7BM9.png

2、汉字库的存储位置

2)汉字与字符不同的是,汉字有1万多个,ASCII码字符却只有100多个,并且汉字的显示明显比字符的点阵复杂程度高,比如说字体是12的字符占用点阵是12x6,每个字符需要12x6/8=9个字节的存储空间。字体是12 的汉字占用12x12的点阵,每个汉字需要12x12/8=18个字节存储空间,这还是最小字体,大的字体所需要的存储空间只会成倍增加

3)一般12号字体的汉字库需要500K字节、16号字体700K、24号字体1.6M、32号字体3M,这对于单片机来说数据量太大了,内部FLASH512K~1M表示压力很大



20201217162029866.png

4)需要把汉字库保存到SD卡,再将SD卡中的汉字库数据保存到外部FILASH才行,w25q128无疑是个好选择,它拥有16M的存储空间,SPI通信协议,读写速度也是相当快。

(二)把汉字库里的点阵数据读取出来显示到MCU屏

1、数据编码格式的问题

1)有关显示汉字就必然会涉及编码格式的问题,不同的编码格式对应的汉字编码是不同的,比如UTF-8编码的文件用GB2312编码打开就会乱码。
同理,比如文档的格式是UTF-8编码,但是我的字库是GBK编码,读出来的数据直接显示到屏幕就必然会乱码

2)所以显示汉字如果乱码首先需要检查的就是编辑器的编码,保证编码一致。








收藏 评论0 发布时间:2022-8-15 19:57

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版