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

STM32项目设计:基于STM32F1的智能门锁PCB、源码(4种解锁方式)

[复制链接]
STMCU小助手 发布时间:2022-8-15 19:19
前言
1、由于很多同学反馈如今STM32F4价格昂贵,制作成本太高,于是我又花费了近一个月的空闲时间来研究用最低的成本制作拥有F4智能门锁一样甚至更多的功能STM32F4版本智能门锁

一、项目简介
(一)功能概述

F4版本:
1、可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上
2、在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动步进电机一圈
3、可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
4、实现RFID与手机解锁(蓝牙解锁)
5、扩展:虚位密码解锁(虚位密码:自己百度)
F1版本新增:
1、可录入10张卡片
2、开锁顺时针转动步进电机一圈,关锁逆时针
3、新增蜂鸣器提示
4、新增解锁错误提示

(二)项目所用到的主要技术
F4版本:
1、IIC协议、SPI协议、串口协议
2、外部flash驱动、SD卡驱动
3、FTAFS文件系统
4、RTC实时时钟
F1版本:
1、IIC协议、SPI协议、串口协议
2、GUI界面设计,汉字显示
3、RTC实时时钟

(三)本次项目的特点
1、选材根据经济

材料最贵的是指纹模块40元,单片机仅10元

2、减少不必要材料

比如外部FLASH,SD卡模块,单片机晶振

2、使用PCB,拒绝繁琐接线

制作更方便,学习更简便

3、功能强大

拥有4种解锁方式、汉化界面、有修改与录入操作、有手机APP控制

4、材料功能利用率高

单片机引脚(48pin)利用率>90%,单片机内存(64K)利用率>70%

5、代码精简方便,逻辑性强

Show_Str(12,13,128,12,"智能门锁系统hzc123",12,0); //显示汉字、字符一句搞定

二、材料选择

1、主控STM32F103C8T6 (可以用兼容产品CH32F103C8T6代替)

0a417883aaff448a87f72999e830323e.png

2、步进电机(带驱动模块)
型号:28BYJ4+ULN2003

20200627204259600.png

3、4X4矩阵按键
00U%_7RE(GQS5H()_~D%N`V.png

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

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

G[`{PDA$_`@8(T(KEO6B{QH.png

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



7、杜邦线、排针、电阻、电容、三极管、电位器等

三、原理图设计
采用最简的硬件电路,做更多的功能
(截图模糊,可下载资源查看)

049487c00b194d0ea327f3d6a0b32520.png

四、PCB设计
采用最便宜的双层版,10cm*10cm设计

e4c3d98e05d448ae849e8fa1b2a134e5.png

五、源码设计
源码为F4版本智能门锁移植而来,修改了一些不兼容的功能与增加了新功能


  1. void DisUnLock(void )
  2. {
  3.         OLED_Clear();
  4.         Show_Str(20,10,128,24,"解锁中...",24,0);        
  5.         OLED_Refresh_Gram();//更新显示
  6.         Walkmotor_ON();
  7.         Show_Str(20,10,128,24,"已解锁!",24,0);
  8.         OLED_Refresh_Gram();//更新显示
  9.         delay_ms(1500);
  10. }

  11. void DisLock(void )
  12. {
  13.         OLED_Clear();
  14.         Show_Str(30,20,128,16,"锁定中!",16,0);
  15.         OLED_Refresh_Gram();//更新显示
  16.         Walkmotor_OFF();
  17.         Show_Str(30,20,128,16,"已锁定!",16,0);
  18.         OLED_Show_Font(56,48,0);//锁
  19.         OLED_Refresh_Gram();//更新显示
  20.         delay_ms(1000);
  21. }
  22. int main(void)
  23. {                        
  24.         u16 set=0;
  25.         int key_num;
  26.         int time1;
  27.         int time2;                //锁屏时间
  28.         char arrow=0;  //箭头位子
  29.         //SysHSI_Init();
  30.         delay_init();                     //延时函数初始化         
  31.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  32.         uart_init(9600);         //串口初始化为9600
  33.         printf("串口功能正常\r\n");
  34.         Button4_4_Init();          //初始化与按键连接的硬件接口
  35.         OLED_Init();                            //显示初始化
  36.         Walkmotor_Init();        //步进电机初始化
  37.         BEEP_Init();                        //蜂鸣器初始化
  38.         usart2_init(usart2_baund);           //初始化指纹模块
  39.         PS_StaGPIO_Init();
  40.         OLED_Clear();
  41.          
  42.         starting();//开机信息  logo
  43.         RTC_Init();                                  //RTC初始化
  44.         SysPartInit();   //系统参数初始化
  45.          while(1)
  46.         {
  47. //锁屏界面
  48. MAIN:
  49.                         OLED_Clear();
  50.                         OLED_Show_Font(56,48,0);//显示锁图标
  51.                         while(1)
  52.                         {
  53.                                 time1++;Display_Data();//时间显示:每1000ms更新一次显示数据
  54.                                 
  55.                                 if(DisFlag == 1)
  56.                                 {
  57.                                         DisFlag = 0;
  58.                                         OLED_Fill(0,24,16,63,0);
  59.                                         OLED_Refresh_Gram();//更新显示
  60.                                 }
  61.                                 
  62.                                 if((time1%100)==1)
  63.                                 {
  64.                                         //MFRC522解锁
  65.                                                 time1=0;
  66.                                                 MFRC522_Initializtion();                        
  67.                                                 Error=MFRC522_lock();
  68.                                                 if(Error==0)
  69.                                                 {
  70.                                                         goto MENU;        
  71.                                                 }
  72.                                                 else
  73.                                                 {
  74.                                                         OLED_Show_Font(56,48,0);//锁
  75.                                                 }
  76.                                                 
  77.                                                 //手机蓝牙解锁密码1
  78.                                                 Error=usart1_cherk((char*)sys.passwd1);         
  79.                                                 if(Error==0){
  80.                                                         OLED_Clear_NOupdate();
  81.                                                         Show_Str(12,13,128,20,"蓝牙密码1:正确",12,0);
  82.                                                         OLED_Refresh_Gram();//更新显示
  83.                                                         delay_ms(800);
  84.                                                         DisUnLock();
  85.                                                         goto MENU;        
  86.                                                 }
  87.                                                 //手机蓝牙解锁密码2
  88.                                                 Error=usart1_cherk((char*)sys.passwd2);         
  89.                                                 if(Error==0){
  90.                                                         OLED_Clear_NOupdate();
  91.                                                         Show_Str(12,13,128,12,"蓝牙密码2:正确",12,0);
  92.                                                         OLED_Refresh_Gram();//更新显示
  93.                                                         delay_ms(800);
  94.                                                         DisUnLock();
  95.                                                         goto MENU;        
  96.                                                 }
  97.                                 }
  98.                                 //指纹解锁
  99.                                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  100.                                 {
  101.                                                 while(PS_Sta){
  102.                                                 Error=press_FR();//刷指纹
  103.                                                 if(Error==0)
  104.                                                 {
  105.                                                         //DisUnLock();
  106.                                                         goto MENU;   //跳到解锁界面
  107.                                                 }                                                               
  108.                                                 else
  109.                                                 {
  110.                                                         OLED_Show_Font(56,48,0);//锁
  111.                                                 }
  112.                                         }
  113.                                 }
  114.                                 //密码锁
  115.                                 key_num=Button4_4_Scan();        //按键扫描
  116.                                 if(key_num!=-1)
  117.                                 {
  118.                                         Error=password();//密码解锁函数
  119.                                         if(Error==0)
  120.                                         {
  121.                                                 goto MENU;        //跳到解锁界面
  122.                                         }
  123.                                         else
  124.                                         {
  125.                                                 OLED_Show_Font(56,48,0);//锁
  126.                                         }
  127.                                 }
  128.                                 delay_ms(1);
  129.                                 
  130.                         }
  131.                         /********************主界面**************************/

  132. MENU:
  133.                         OLED_Clear();
  134. MENUNOCLR:
  135.                         OLED_Fill(0,0,20,48,0);
  136.                         //主页菜单显示
  137.                         if(arrow<3){
  138.                                 Show_Str(5,arrow*16,128,16,"->",16,0);//显示箭头
  139.                                 set=0;}
  140.                         else {
  141.                                 Show_Str(5,(arrow-3)*16,128,16,"->",16,0);
  142.                                 set=3;}
  143.                         Show_Str(25,0,128,16,setup[set],16,0);
  144.                         Show_Str(25,16,128,16,setup[set+1],16,0);
  145.                         Show_Str(25,32,128,16,setup[set+2],16,0);
  146.                         Show_Str(0,52,128,12,"上    下     确定",12,0);
  147.                         OLED_Refresh_Gram();//更新显示
  148.                         time2=0;
  149.                         while(1)
  150.                         {
  151.                                                 //超时锁屏
  152.                                                 time2++;
  153.                                                 if(time2>10000 | key_num==4){  
  154.                                                         
  155.                                                         OLED_Clear();
  156.                                                                 DisLock();
  157.                                                                 if(time2>10000)beep_on_mode2();
  158.                                                                 time2 =0;
  159.                                                                 OLED_Clear();
  160.                                                                 goto MAIN;
  161.                                                 }
  162.                                                 //手机蓝牙锁定
  163.                                                 if(memcmp(USART_RX_BUF,"LOCK",4)==0)        {
  164.                                                         DisLock();
  165.                                                         goto MAIN;
  166.                                                 }
  167.                                                 
  168.                                                 //功能选项选择
  169.                                                 key_num=Button4_4_Scan();        
  170.                                                 if(key_num)
  171.                                                 {
  172.                                                         if(key_num==13){
  173.                                                                 if(arrow>0)arrow--;
  174.                                                                 goto MENUNOCLR;
  175.                                                         }
  176.                                                         if(key_num==15){
  177.                                                                 if(arrow<5)arrow++;
  178.                                                                 goto MENUNOCLR;
  179.                                                         }
  180.                                                         if(key_num==16){
  181.                                                                 switch(arrow)
  182.                                                                 {
  183.                                                                         case 0:Add_FR();                break;//录指
  184.                                                                         case 1:Del_FR();                break;//删指纹
  185.                                                                         case 2:SetPassworld();break;//修改密码
  186.                                                                         case 3:Set_Time(); break;  //设置时间
  187.                                                                         case 4:Add_Rfid(); break;  //录入卡片
  188.                                                                         case 5:Massige(); break;  //显示信息                                                        
  189.                                                                 }
  190.                                                                 goto MENU;
  191.                                                         }               
  192.                                                 }delay_ms(1);
  193.                         }        
  194.         }
  195.                  
  196. }
复制代码

六、安卓APP设计
1、图标设计


4fa01fa15d2541e68562a51e5fe50f0e.png

2、主界面设计
使用方法:①进入APP,等待3-5秒,自动连接智能门锁
②左上角显示已连接后,输入密码,点击OK即可解锁
③无法自动连接时,点击连接按钮进入手动连接界面

1ca22b6fbc944f2fa8de101555d42e7b.png

3、连接界面
使用方法:双击进行连接操作

fb46d8c652be4c0192880fe90c6ed748.png

4、信息界面设计


七、成品展示
1、开机界面

在这里插入图片描述

4aeb0ee9e45f4517ac34451633e75be9.png

2、锁屏显示时间

d69747c831e04981bab32fe32824657e.png

3、解锁显示菜单

2b22eb56c1c0451999f89d026d8fcc91.png



cb85501576bc4b728f7c17ffe907358b.png
收藏 评论0 发布时间:2022-8-15 19:19

举报

0个回答

所属标签

相似分享

官网相关资源

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