基于STM32的智能門鎖(含代碼、PCB)(4種解鎖方式)

前言

1、如今STM32F4價格昂貴,制作成本太高,于是花費了近一個月的空閑時間來研究用最低的成本制作擁有F4智能門鎖一樣甚至更多的功能。點擊領取相關資料


一、項目簡介

(一)功能概述

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代替)

2、步進電機(帶驅動模塊)
型號:28BYJ4+ULN2003

3、4X4矩陣按鍵(不用買模塊,此項目用的16個單獨按鍵焊接到PCB)

5、0.96寸OLED顯示屏(IIC)
型號:7針

6、RFID RC522 射頻模塊(帶一張卡片)

7、杜邦線、排針、電阻、電容、三極管、電位器等
8、PCB板子一塊


三、原理圖設計

采用最簡的硬件電路,做更多的功能
(截圖模糊,可下載資源查看)

四、PCB設計

采用最便宜的雙層版,10cm*10cm設計

五、部分代碼

完整代碼可進群免費領取:掃碼進群領資料

 void DisUnLock(void ) {
	OLED_Clear();
	Show_Str(20,10,128,24,"解鎖中...",24,0);	
	OLED_Refresh_Gram();//更新顯示 Walkmotor_ON();
	Show_Str(20,10,128,24,"已解鎖!",24,0);
	OLED_Refresh_Gram();//更新顯示 delay_ms(1500);
} void DisLock(void ) {
	OLED_Clear();
	Show_Str(30,20,128,16,"鎖定中!",16,0);
	OLED_Refresh_Gram();//更新顯示 Walkmotor_OFF();
	Show_Str(30,20,128,16,"已鎖定!",16,0);
	OLED_Show_Font(56,48,0);//鎖 OLED_Refresh_Gram();//更新顯示 delay_ms(1000);
} int main(void) {			
	u16 set=0; int key_num; int time1; int time2; //鎖屏時間 char arrow=0; //箭頭位子 //SysHSI_Init(); delay_init(); //延時函數初始化  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級 uart_init(9600); //串口初始化為9600 printf("串口功能正常\r\n");
	Button4_4_Init(); //初始化與按鍵連接的硬件接口 OLED_Init(); //顯示初始化 Walkmotor_Init(); //步進電機初始化 BEEP_Init(); //蜂鳴器初始化 usart2_init(usart2_baund); //初始化指紋模塊 PS_StaGPIO_Init();
	OLED_Clear(); 
	 
	starting();//開機信息  logo RTC_Init(); //RTC初始化 SysPartInit(); //系統參數初始化  while(1)
	{ //鎖屏界面 MAIN:
			OLED_Clear(); 
			OLED_Show_Font(56,48,0);//顯示鎖圖標 while(1)
			{
				time1++;Display_Data();//時間顯示:每1000ms更新一次顯示數據 if(DisFlag == 1)
				{
					DisFlag = 0;
					OLED_Fill(0,24,16,63,0);
					OLED_Refresh_Gram();//更新顯示 } if((time1%100)==1)
				{ //MFRC522解鎖 time1=0;
						MFRC522_Initializtion();			
						Error=MFRC522_lock(); if(Error==0)
						{ goto MENU;	
						} else {
							OLED_Show_Font(56,48,0);//鎖 } //手機藍牙解鎖密碼1 Error=usart1_cherk((char*)sys.passwd1); if(Error==0){ 
							OLED_Clear_NOupdate();
							Show_Str(12,13,128,20,"藍牙密碼1:正確",12,0); 
							OLED_Refresh_Gram();//更新顯示 delay_ms(800);
							DisUnLock(); goto MENU;	
						} //手機藍牙解鎖密碼2 Error=usart1_cherk((char*)sys.passwd2); if(Error==0){
							OLED_Clear_NOupdate();
							Show_Str(12,13,128,12,"藍牙密碼2:正確",12,0); 
							OLED_Refresh_Gram();//更新顯示 delay_ms(800);
							DisUnLock(); goto MENU;	
						}
				} //指紋解鎖 if(PS_Sta) //檢測PS_Sta狀態,如果有手指按下 { while(PS_Sta){
						Error=press_FR();//刷指紋 if(Error==0)
						{ //DisUnLock(); 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);//鎖 }
				}
				delay_ms(1);
				
			} /********************主界面**************************/ MENU:
			OLED_Clear();
MENUNOCLR:
			OLED_Fill(0,0,20,48,0); //主頁菜單顯示 if(arrow<3){
				Show_Str(5,arrow*16,128,16,"->",16,0);//顯示箭頭 set=0;} else {
				Show_Str(5,(arrow-3)*16,128,16,"->",16,0); set=3;}
			Show_Str(25,0,128,16,setup[set],16,0);
			Show_Str(25,16,128,16,setup[set+1],16,0);
			Show_Str(25,32,128,16,setup[set+2],16,0);
			Show_Str(0,52,128,12,"上    下     確定",12,0);
			OLED_Refresh_Gram();//更新顯示 time2=0; while(1)
			{ //超時鎖屏 time2++; if(time2>10000 | key_num==4){  
							
							OLED_Clear();
								DisLock(); if(time2>10000)beep_on_mode2();
								time2 =0;
								OLED_Clear(); goto MAIN;
						} //手機藍牙鎖定 if(memcmp(USART_RX_BUF,"LOCK",4)==0)	{
							DisLock(); goto MAIN;
						} //功能選項選擇 key_num=Button4_4_Scan(); if(key_num)
						{ if(key_num==13){ if(arrow>0)arrow--; goto MENUNOCLR;
							} if(key_num==15){ if(arrow<5)arrow++; goto MENUNOCLR;
							} if(key_num==16){ switch(arrow)
								{ case 0:Add_FR(); break;//錄指 case 1:Del_FR(); break;//刪指紋 case 2:SetPassworld();break;//修改密碼 case 3:Set_Time(); break; //設置時間 case 4:Add_Rfid(); break; //錄入卡片 case 5:Massige(); break; //顯示信息  } goto MENU;
							}		
						}delay_ms(1);
			}	
	}
		 
 }


六、安卓APP設計

1、圖標設計

2、主界面設計
使用方法:①進入APP,等待3-5秒,自動連接智能門鎖
②左上角顯示已連接后,輸入密碼,點擊OK即可解鎖
③無法自動連接時,點擊連接按鈕進入手動連接界面

3、連接界面
使用方法:雙擊進行連接操作 一般連接JDY-31


七、成品展示

1、開機界面
在這里插入圖片描述

the end

評論(0)